From 30b46c2f9f9fe00233708bd72dd80ee533b1028f Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 7 Jul 2026 11:22:34 +0100 Subject: [PATCH 01/23] Fix type imports --- knip.ts | 2 +- modules/banner/e2e/banner.spec.ts | 2 +- modules/restricted-guests/e2e/services.ts | 2 +- packages/shared-components/vitest.config.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/knip.ts b/knip.ts index d2053ace5c4..cff86403331 100644 --- a/knip.ts +++ b/knip.ts @@ -1,4 +1,4 @@ -import { KnipConfig } from "knip"; +import { type KnipConfig } from "knip"; // Specify this as knip loads config files which may conditionally load plugins process.env.GITHUB_ACTIONS = "1"; diff --git a/modules/banner/e2e/banner.spec.ts b/modules/banner/e2e/banner.spec.ts index 3892865aa1d..14c1ad8778d 100644 --- a/modules/banner/e2e/banner.spec.ts +++ b/modules/banner/e2e/banner.spec.ts @@ -5,7 +5,7 @@ SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial Please see LICENSE files in the repository root for full details. */ -import { input } from "zod/mini"; +import { type input } from "zod/mini"; import { test as base, expect } from "../../playwright/element-web-test.ts"; import { type ConfigSchema } from "../src/config.ts"; diff --git a/modules/restricted-guests/e2e/services.ts b/modules/restricted-guests/e2e/services.ts index f99b15f9506..5e556b1ebc9 100644 --- a/modules/restricted-guests/e2e/services.ts +++ b/modules/restricted-guests/e2e/services.ts @@ -6,7 +6,7 @@ Please see LICENSE files in the repository root for full details. */ import { - StartedSynapseContainer, + type StartedSynapseContainer, SynapseContainer, } from "@element-hq/element-web-playwright-common/lib/testcontainers/index.js"; import { Readable } from "node:stream"; diff --git a/packages/shared-components/vitest.config.ts b/packages/shared-components/vitest.config.ts index 537b1de38bf..9150ace8a4a 100644 --- a/packages/shared-components/vitest.config.ts +++ b/packages/shared-components/vitest.config.ts @@ -10,7 +10,7 @@ import path from "node:path"; import { fileURLToPath } from "node:url"; import { storybookTest } from "@storybook/addon-vitest/vitest-plugin"; import { storybookVis } from "storybook-addon-vis/vitest-plugin"; -import { playwright, PlaywrightProviderOptions } from "@vitest/browser-playwright"; +import { playwright, type PlaywrightProviderOptions } from "@vitest/browser-playwright"; import { nodePolyfills } from "vite-plugin-node-polyfills"; import rootConfig from "../../vitest.config"; From 937503b2bd032c74548717d83d36837fda4a4ba3 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 7 Jul 2026 11:30:44 +0100 Subject: [PATCH 02/23] Fix jsdoc --- apps/desktop/.lintstagedrc | 4 --- apps/web/playwright/pages/client.ts | 12 +++---- apps/web/playwright/pages/settings.ts | 2 +- apps/web/src/AddThreepid.ts | 14 ++++---- apps/web/src/Avatar.ts | 2 +- apps/web/src/BasePlatform.ts | 2 +- apps/web/src/ContentMessages.ts | 16 +++++----- apps/web/src/HtmlUtils.tsx | 6 ++-- apps/web/src/MediaDeviceHandler.ts | 2 +- apps/web/src/Modal.tsx | 4 +-- apps/web/src/PasswordReset.ts | 2 +- apps/web/src/ScalarAuthClient.ts | 2 +- apps/web/src/Searching.ts | 4 +-- apps/web/src/SlidingSyncManager.ts | 2 +- apps/web/src/TimezoneHandler.ts | 1 - .../src/autocomplete/AutocompleteProvider.tsx | 2 +- .../structures/ReleaseAnnouncement.tsx | 1 - .../src/components/structures/RoomView.tsx | 2 +- .../components/structures/TimelinePanel.tsx | 4 +-- .../src/components/views/elements/AppTile.tsx | 2 +- apps/web/src/editor/diff.ts | 2 +- apps/web/src/editor/model.ts | 14 ++++---- apps/web/src/editor/range.ts | 2 +- apps/web/src/hooks/useAsyncRefreshMemo.ts | 2 +- .../web/src/indexing/BaseEventIndexManager.ts | 32 +++++++++---------- apps/web/src/indexing/EventIndex.ts | 6 ++-- apps/web/src/indexing/EventIndexPeg.ts | 12 +++---- .../src/notifications/PushRuleVectorState.ts | 2 +- apps/web/src/phonenumber.ts | 2 +- apps/web/src/rageshake/rageshake.ts | 18 +++++------ apps/web/src/rageshake/submit-rageshake.ts | 6 ++-- apps/web/src/resizer/resizer.ts | 2 +- apps/web/src/resizer/sizer.ts | 12 +++---- apps/web/src/settings/SettingsStore.ts | 24 +++++++------- .../settings/controllers/SettingController.ts | 4 +-- apps/web/src/slash-commands/SlashCommands.tsx | 2 +- apps/web/src/stores/room-list-v3/section.ts | 2 +- apps/web/src/utils/FileUtils.ts | 2 +- apps/web/src/utils/MegolmExportEncryption.ts | 14 ++++---- apps/web/src/utils/MessageDiffUtils.tsx | 2 +- apps/web/src/utils/PinningUtils.ts | 4 +-- apps/web/src/utils/Timer.ts | 2 +- apps/web/src/utils/WidgetUtils.ts | 14 ++++---- apps/web/src/utils/image-media.ts | 2 +- apps/web/src/utils/tokens/pickling.ts | 2 +- apps/web/src/vector/url_utils.ts | 2 +- .../message-body/FileBodyViewModel.ts | 2 +- apps/web/webpack.config.ts | 2 +- modules/.lintstagedrc | 3 -- .../core/VirtualizedList/virtualized-list.tsx | 2 +- .../shared-components/src/core/i18n/i18n.tsx | 8 ++--- .../src/core/utils/linkify.ts | 2 +- 52 files changed, 142 insertions(+), 151 deletions(-) delete mode 100644 apps/desktop/.lintstagedrc delete mode 100644 modules/.lintstagedrc diff --git a/apps/desktop/.lintstagedrc b/apps/desktop/.lintstagedrc deleted file mode 100644 index 8043a7f78cd..00000000000 --- a/apps/desktop/.lintstagedrc +++ /dev/null @@ -1,4 +0,0 @@ -{ - "*": "oxfmt --no-error-on-unmatched-pattern", - "*.(ts|tsx)": ["eslint --fix"] -} diff --git a/apps/web/playwright/pages/client.ts b/apps/web/playwright/pages/client.ts index 39275085f73..4c063cc09e9 100644 --- a/apps/web/playwright/pages/client.ts +++ b/apps/web/playwright/pages/client.ts @@ -202,7 +202,7 @@ export class Client { /** * Create a room with given options. * @param options the options to apply when creating the room - * @return the ID of the newly created room + * @returns the ID of the newly created room */ public async createRoom(options: ICreateRoomOpts): Promise { const client = await this.prepareClient(); @@ -217,7 +217,7 @@ export class Client { /** * Create a space with given options. * @param options the options to apply when creating the space - * @return the ID of the newly created space (room) + * @returns the ID of the newly created space (room) */ public async createSpace(options: ICreateRoomOpts): Promise { return this.createRoom({ @@ -412,8 +412,8 @@ export class Client { /** * @param {string} name * @param {module:client.callback} callback Optional. - * @return {Promise} Resolves: {} an empty object. - * @return {module:http-api.MatrixError} Rejects: with an error response. + * @returns {Promise} Resolves: {} an empty object. + * @returns {module:http-api.MatrixError} Rejects: with an error response. */ public async setDisplayName(name: string): Promise { const client = await this.prepareClient(); @@ -423,8 +423,8 @@ export class Client { /** * @param {string} url * @param {module:client.callback} callback Optional. - * @return {Promise} Resolves: {} an empty object. - * @return {module:http-api.MatrixError} Rejects: with an error response. + * @returns {Promise} Resolves: {} an empty object. + * @returns {module:http-api.MatrixError} Rejects: with an error response. */ public async setAvatarUrl(url: string): Promise { const client = await this.prepareClient(); diff --git a/apps/web/playwright/pages/settings.ts b/apps/web/playwright/pages/settings.ts index c871bbeeafc..5b836efa47d 100644 --- a/apps/web/playwright/pages/settings.ts +++ b/apps/web/playwright/pages/settings.ts @@ -41,7 +41,7 @@ export class Settings { * null. * @param {SettingLevel} level The level to change the value at. * @param {*} value The new value of the setting, may be null. - * @return {Promise} Resolves when the setting has been changed. + * @returns {Promise} Resolves when the setting has been changed. */ public async setValue(settingName: string, roomId: string | null, level: SettingLevel, value: any): Promise { return this.page.evaluate< diff --git a/apps/web/src/AddThreepid.ts b/apps/web/src/AddThreepid.ts index 877a0c5c4a1..c2bf87a6c8e 100644 --- a/apps/web/src/AddThreepid.ts +++ b/apps/web/src/AddThreepid.ts @@ -69,7 +69,7 @@ export default class AddThreepid { * Attempt to add an email threepid to the homeserver. * This will trigger a side-effect of sending an email to the provided email address. * @param {string} emailAddress The email address to add - * @return {Promise} Resolves when the email has been sent. Then call checkEmailLinkClicked(). + * @returns {Promise} Resolves when the email has been sent. Then call checkEmailLinkClicked(). */ public async addEmailAddress(emailAddress: string): Promise { try { @@ -91,7 +91,7 @@ export default class AddThreepid { * Attempt to bind an email threepid on the identity server via the homeserver. * This will trigger a side-effect of sending an email to the provided email address. * @param {string} emailAddress The email address to add - * @return {Promise} Resolves when the email has been sent. Then call checkEmailLinkClicked(). + * @returns {Promise} Resolves when the email has been sent. Then call checkEmailLinkClicked(). */ public async bindEmailAddress(emailAddress: string): Promise { this.bind = true; @@ -122,7 +122,7 @@ export default class AddThreepid { * This will trigger a side-effect of sending an SMS to the provided phone number. * @param {string} phoneCountry The ISO 2 letter code of the country to resolve phoneNumber in * @param {string} phoneNumber The national or international formatted phone number to add - * @return {Promise} Resolves when the text message has been sent. Then call haveMsisdnToken(). + * @returns {Promise} Resolves when the text message has been sent. Then call haveMsisdnToken(). * * @throws {UserFriendlyError} An appropriate user-friendly error if the verification code could not be sent. */ @@ -155,7 +155,7 @@ export default class AddThreepid { * This will trigger a side-effect of sending an SMS to the provided phone number. * @param {string} phoneCountry The ISO 2 letter code of the country to resolve phoneNumber in * @param {string} phoneNumber The national or international formatted phone number to add - * @return {Promise} Resolves when the text message has been sent. Then call haveMsisdnToken(). + * @returns {Promise} Resolves when the text message has been sent. Then call haveMsisdnToken(). */ public async bindMsisdn(phoneCountry: string, phoneNumber: string): Promise { this.bind = true; @@ -184,7 +184,7 @@ export default class AddThreepid { /** * Checks if the email link has been clicked by attempting to add the threepid - * @return {Promise} Resolves if the email address was added. Rejects with an object + * @returns {Promise} Resolves if the email address was added. Rejects with an object * with a "message" property which contains a human-readable message detailing why * the request failed. */ @@ -254,7 +254,7 @@ export default class AddThreepid { /** * @param {{type: string, session?: string}} auth UI auth object - * @return {Promise} Response from /3pid/add call (in current spec, an empty object) + * @returns {Promise} Response from /3pid/add call (in current spec, an empty object) */ // eslint-disable-next-line @typescript-eslint/no-empty-object-type private makeAddThreepidOnlyRequest = (auth?: IAddThreePidOnlyBody["auth"] | null): Promise<{}> => { @@ -269,7 +269,7 @@ export default class AddThreepid { * Takes a phone number verification code as entered by the user and validates * it with the identity server, then if successful, adds the phone number. * @param {string} msisdnToken phone number verification code as entered by the user - * @return {Promise} Resolves if the phone number was added. Rejects with an object + * @returns {Promise} Resolves if the phone number was added. Rejects with an object * with a "message" property which contains a human-readable message detailing why * the request failed. */ diff --git a/apps/web/src/Avatar.ts b/apps/web/src/Avatar.ts index 8852578f285..f2995b3325d 100644 --- a/apps/web/src/Avatar.ts +++ b/apps/web/src/Avatar.ts @@ -137,7 +137,7 @@ export function defaultAvatarUrlForString(s: string): string { * returns the first (non-sigil) character of 'name', * converted to uppercase * @param {string} name - * @return {string} the first letter + * @returns {string} the first letter */ export function getInitialLetter(name: string): string | undefined { if (!name) { diff --git a/apps/web/src/BasePlatform.ts b/apps/web/src/BasePlatform.ts index 8f2ee414446..26169607db6 100644 --- a/apps/web/src/BasePlatform.ts +++ b/apps/web/src/BasePlatform.ts @@ -279,7 +279,7 @@ export default abstract class BasePlatform { /** * Get our platform specific EventIndexManager. * - * @return {BaseEventIndexManager} The EventIndex manager for our platform, + * @returns {BaseEventIndexManager} The EventIndex manager for our platform, * can be null if the platform doesn't support event indexing. */ public getEventIndexingManager(): BaseEventIndexManager | null { diff --git a/apps/web/src/ContentMessages.ts b/apps/web/src/ContentMessages.ts index 15a43d79b67..601027c6916 100644 --- a/apps/web/src/ContentMessages.ts +++ b/apps/web/src/ContentMessages.ts @@ -77,7 +77,7 @@ interface IMediaConfig { * Load a file into a newly created image element. * * @param {File} imageFile The file to load in an image element. - * @return {Promise} A promise that resolves with the html image element. + * @returns {Promise} A promise that resolves with the html image element. */ async function loadImageElement(imageFile: File): Promise<{ width: number; @@ -148,7 +148,7 @@ const ALWAYS_INCLUDE_THUMBNAIL = ["image/avif", "image/webp", "image/svg+xml"]; * @param {MatrixClient} matrixClient A matrixClient to upload the thumbnail with. * @param {String} roomId The ID of the room the image will be uploaded in. * @param {File} imageFile The image to read and thumbnail. - * @return {Promise} A promise that resolves with the attachment info. + * @returns {Promise} A promise that resolves with the attachment info. */ async function infoForImageFile(matrixClient: MatrixClient, roomId: string, imageFile: File): Promise { let thumbnailType = "image/png"; @@ -196,7 +196,7 @@ async function infoForImageFile(matrixClient: MatrixClient, roomId: string, imag * Load a file into a newly created audio element and load the metadata * * @param {File} audioFile The file to load in an audio element. - * @return {Promise} A promise that resolves with the audio element. + * @returns {Promise} A promise that resolves with the audio element. */ function loadAudioElement(audioFile: File): Promise { return new Promise((resolve, reject) => { @@ -228,7 +228,7 @@ function loadAudioElement(audioFile: File): Promise { * Read the metadata for an audio file. * * @param {File} audioFile The audio to read. - * @return {Promise} A promise that resolves with the attachment info. + * @returns {Promise} A promise that resolves with the attachment info. */ async function infoForAudioFile(audioFile: File): Promise { const audio = await loadAudioElement(audioFile); @@ -240,7 +240,7 @@ async function infoForAudioFile(audioFile: File): Promise { * in an attempt to guarantee the first frame will be showing. * * @param {File} videoFile The file to load in a video element. - * @return {Promise} A promise that resolves with the video element. + * @returns {Promise} A promise that resolves with the video element. */ function loadVideoElement(videoFile: File): Promise { return new Promise((resolve, reject) => { @@ -286,7 +286,7 @@ function loadVideoElement(videoFile: File): Promise { * @param {MatrixClient} matrixClient A matrixClient to upload the thumbnail with. * @param {String} roomId The ID of the room the video will be uploaded to. * @param {File} videoFile The video to read and thumbnail. - * @return {Promise} A promise that resolves with the attachment info. + * @returns {Promise} A promise that resolves with the attachment info. */ function infoForVideoFile(matrixClient: MatrixClient, roomId: string, videoFile: File): Promise { const thumbnailType = "image/jpeg"; @@ -311,7 +311,7 @@ function infoForVideoFile(matrixClient: MatrixClient, roomId: string, videoFile: /** * Read the file as an ArrayBuffer. * @param {File} file The file to read - * @return {Promise} A promise that resolves with an ArrayBuffer when the file + * @returns {Promise} A promise that resolves with an ArrayBuffer when the file * is read. */ function readFileAsArrayBuffer(file: File | Blob): Promise { @@ -337,7 +337,7 @@ function readFileAsArrayBuffer(file: File | Blob): Promise { * @param {Function?} progressHandler optional callback to be called when a chunk of * data is uploaded. * @param {AbortController?} controller optional abortController to use for this upload. - * @return {Promise} A promise that resolves with an object. + * @returns {Promise} A promise that resolves with an object. * If the file is unencrypted then the object will have a "url" key. * If the file is encrypted then the object will have a "file" key. */ diff --git a/apps/web/src/HtmlUtils.tsx b/apps/web/src/HtmlUtils.tsx index abf092cbb8f..9a8d885d254 100644 --- a/apps/web/src/HtmlUtils.tsx +++ b/apps/web/src/HtmlUtils.tsx @@ -79,7 +79,7 @@ function mightContainEmoji(str?: string): boolean { * Returns the shortcode for an emoji character. * * @param {String} char The emoji character - * @return {String} The shortcode (such as :thumbup:) + * @returns {String} The shortcode (such as :thumbup:) */ export function unicodeToShortcode(char: string): string { const shortcodes = getEmojiFromUnicode(char)?.shortcodes; @@ -119,7 +119,7 @@ export function getHtmlText(insaneHtml: string): string { * Note that the HTML sanitiser library has its own internal logic for * doing this, to which we pass the same list of schemes. This is used in * other places we need to sanitise URLs. - * @return true if permitted, otherwise false + * @returns true if permitted, otherwise false */ export function isUrlPermitted(inputUrl: string): boolean { try { @@ -497,7 +497,7 @@ export function bodyToHtml(content: IContent, highlights?: string[], opts: Event * @param htmlTopic optional html topic * @param ref React ref to attach to any React components returned * @param allowExtendedHtml whether to allow extended HTML tags such as headings and lists - * @return The HTML-ified node. + * @returns The HTML-ified node. */ export function topicToHtml( topic?: string, diff --git a/apps/web/src/MediaDeviceHandler.ts b/apps/web/src/MediaDeviceHandler.ts index 7a50024d1aa..c77fd87377a 100644 --- a/apps/web/src/MediaDeviceHandler.ts +++ b/apps/web/src/MediaDeviceHandler.ts @@ -54,7 +54,7 @@ export default class MediaDeviceHandler extends EventEmitter { * (https://developer.mozilla.org/en-US/docs/Web/API/Permissions_API) * is ready for primetime, it might help make this simpler. * - * @return Promise The available media devices + * @returns Promise The available media devices */ public static async getDevices(): Promise { try { diff --git a/apps/web/src/Modal.tsx b/apps/web/src/Modal.tsx index d92f83d7f17..313818af464 100644 --- a/apps/web/src/Modal.tsx +++ b/apps/web/src/Modal.tsx @@ -185,7 +185,7 @@ export class ModalManager extends TypedEventEmitter} whether the dialog should close + * @returns {Promise} whether the dialog should close */ /** diff --git a/apps/web/src/PasswordReset.ts b/apps/web/src/PasswordReset.ts index 9fb841ed4b2..00927e173cf 100644 --- a/apps/web/src/PasswordReset.ts +++ b/apps/web/src/PasswordReset.ts @@ -73,7 +73,7 @@ export default class PasswordReset { /** * Checks if the email link has been clicked by attempting to change the password * for the mxid linked to the email. - * @return {Promise} Resolves if the password was reset. Rejects with an object + * @returns {Promise} Resolves if the password was reset. Rejects with an object * with a "message" property which contains a human-readable message detailing why * the reset failed, e.g. "There is no mapped matrix user ID for the given email address". */ diff --git a/apps/web/src/ScalarAuthClient.ts b/apps/web/src/ScalarAuthClient.ts index 26ee94de408..37a0861b469 100644 --- a/apps/web/src/ScalarAuthClient.ts +++ b/apps/web/src/ScalarAuthClient.ts @@ -227,7 +227,7 @@ export default class ScalarAuthClient { * This can be useful to temporarily prevent purchased assets from being displayed. * @param {WidgetType} widgetType The Widget Type to disable assets for * @param {string} widgetId The widget ID to disable assets for - * @return {Promise} Resolves on completion + * @returns {Promise} Resolves on completion */ public async disableWidgetAssets(widgetType: WidgetType, widgetId: string): Promise { const url = new URL(this.getStarterLink(this.apiUrl + "/widgets/set_assets_state")); diff --git a/apps/web/src/Searching.ts b/apps/web/src/Searching.ts index 28f67522ad6..47b54563543 100644 --- a/apps/web/src/Searching.ts +++ b/apps/web/src/Searching.ts @@ -412,7 +412,7 @@ function combineEventSources( * index. * @param {object} serverEvents An unprocessed search result from the server. * - * @return {object} A response object that combines the events from the + * @returns {object} A response object that combines the events from the * different event sources. * */ @@ -476,7 +476,7 @@ function combineEvents( * index. * @param {object} serverEvents An unprocessed search result from the server. * - * @return {object} A response object that combines the events from the + * @returns {object} A response object that combines the events from the * different event sources. */ function combineResponses( diff --git a/apps/web/src/SlidingSyncManager.ts b/apps/web/src/SlidingSyncManager.ts index 815e438da75..3c1cc986199 100644 --- a/apps/web/src/SlidingSyncManager.ts +++ b/apps/web/src/SlidingSyncManager.ts @@ -391,7 +391,7 @@ export class SlidingSyncManager { /** * Check if the server "natively" supports sliding sync (with an unstable endpoint). * @param client The MatrixClient to use - * @return Whether the "native" (unstable) endpoint is supported + * @returns Whether the "native" (unstable) endpoint is supported */ public async nativeSlidingSyncSupport(client: MatrixClient): Promise { // Per https://github.com/matrix-org/matrix-spec-proposals/pull/3575/files#r1589542561 diff --git a/apps/web/src/TimezoneHandler.ts b/apps/web/src/TimezoneHandler.ts index eb1bacef5f4..cef4b15e4f6 100644 --- a/apps/web/src/TimezoneHandler.ts +++ b/apps/web/src/TimezoneHandler.ts @@ -22,7 +22,6 @@ export function getUserTimezone(): string | undefined { /** * Set in the settings the given timezone - * @timezone */ export function setUserTimezone(timezone: string): Promise { return SettingsStore.setValue(USER_TIMEZONE_KEY, null, SettingLevel.DEVICE, timezone); diff --git a/apps/web/src/autocomplete/AutocompleteProvider.tsx b/apps/web/src/autocomplete/AutocompleteProvider.tsx index 94614f0ae72..b9679d66461 100644 --- a/apps/web/src/autocomplete/AutocompleteProvider.tsx +++ b/apps/web/src/autocomplete/AutocompleteProvider.tsx @@ -58,7 +58,7 @@ export default abstract class AutocompleteProvider { * @param {string} query The query string * @param {ISelectionRange} selection Selection to search * @param {boolean} force True if the user is forcing completion - * @return {object} { command, range } where both objects fields are null if no match + * @returns {object} { command, range } where both objects fields are null if no match */ public getCurrentCommand(query: string, selection: ISelectionRange, force = false): Partial { let commandRegex = this.commandRegex; diff --git a/apps/web/src/components/structures/ReleaseAnnouncement.tsx b/apps/web/src/components/structures/ReleaseAnnouncement.tsx index 5a9eea2d688..bdeef4280c7 100644 --- a/apps/web/src/components/structures/ReleaseAnnouncement.tsx +++ b/apps/web/src/components/structures/ReleaseAnnouncement.tsx @@ -25,7 +25,6 @@ interface ReleaseAnnouncementProps extends Omit< * @param feature - the feature to announce, should be listed in {@link Feature} * @param children * @param props - * @constructor */ export function ReleaseAnnouncement({ feature, diff --git a/apps/web/src/components/structures/RoomView.tsx b/apps/web/src/components/structures/RoomView.tsx index 1b9bd52408e..4f687cc7861 100644 --- a/apps/web/src/components/structures/RoomView.tsx +++ b/apps/web/src/components/structures/RoomView.tsx @@ -366,7 +366,7 @@ interface ILocalRoomCreateLoaderProps { * Room create loader view displaying a message and a spinner. * * @param {ILocalRoomCreateLoaderProps} props Room view props - * @return {ReactElement} + * @returns {ReactElement} */ function LocalRoomCreateLoader(props: ILocalRoomCreateLoaderProps): ReactElement { const text = _t("room|creating_room_text", { names: props.names }); diff --git a/apps/web/src/components/structures/TimelinePanel.tsx b/apps/web/src/components/structures/TimelinePanel.tsx index 939c16d96e0..51bce161c7e 100644 --- a/apps/web/src/components/structures/TimelinePanel.tsx +++ b/apps/web/src/components/structures/TimelinePanel.tsx @@ -1728,7 +1728,7 @@ class TimelinePanel extends React.Component { * have been sent by the server, not * implicit ones generated by the JS * SDK. - * @return {String} the event ID + * @returns {String} the event ID */ private getCurrentReadReceipt(ignoreSynthesized = false): string | null { const client = MatrixClientPeg.get(); @@ -1886,7 +1886,7 @@ class TimelinePanel extends React.Component { * Iterate across all of the timelineSets and timelines inside to expose all of * the event IDs contained inside. * - * @return An event ID list for every timeline in every timelineSet + * @returns An event ID list for every timeline in every timelineSet */ function serializeEventIdsFromTimelineSets(timelineSets: EventTimelineSet[]): { [key: string]: string[] }[] { const serializedEventIdsInTimelineSet = timelineSets.map((timelineSet) => { diff --git a/apps/web/src/components/views/elements/AppTile.tsx b/apps/web/src/components/views/elements/AppTile.tsx index 531303b1e31..8d6241b897e 100644 --- a/apps/web/src/components/views/elements/AppTile.tsx +++ b/apps/web/src/components/views/elements/AppTile.tsx @@ -304,7 +304,7 @@ export default class AppTile extends React.Component { * Set initial component state when the App wUrl (widget URL) is being updated. * Component props *must* be passed (rather than relying on this.props). * @param {Object} newProps The new properties of the component - * @return {Object} Updated component state to be set with setState + * @returns {Object} Updated component state to be set with setState */ private getNewState(newProps: IProps): IState { return { diff --git a/apps/web/src/editor/diff.ts b/apps/web/src/editor/diff.ts index dfc654996e6..508741d3295 100644 --- a/apps/web/src/editor/diff.ts +++ b/apps/web/src/editor/diff.ts @@ -54,7 +54,7 @@ export function diffDeletion(oldStr: string, newStr: string): IDiff { * @param {String} oldValue the previous value * @param {String} newValue the new value * @param {Number} caretPosition the position of the caret after `newValue` was applied. - * @return {object} an object with `at` as the offset where characters were removed and/or added, + * @returns {object} an object with `at` as the offset where characters were removed and/or added, * `added` with the added string (if any), and * `removed` with the removed string (if any) */ diff --git a/apps/web/src/editor/model.ts b/apps/web/src/editor/model.ts index 4328b666d85..d7118d8c5c7 100644 --- a/apps/web/src/editor/model.ts +++ b/apps/web/src/editor/model.ts @@ -27,13 +27,13 @@ import { type Caret } from "./caret"; * @param {DocumentPosition?} caretPosition the position where the caret should be position * @param {string?} inputType the inputType of the DOM input event * @param {object?} diff an object with `removed` and `added` strings - * @return {Number?} addedLen how many characters were added/removed (-) before the caret during the transformation step. + * @returns {Number?} addedLen how many characters were added/removed (-) before the caret during the transformation step. * This is used to adjust the caret position. */ /** * @callback ManualTransformCallback - * @return the caret position + * @returns the caret position */ type TransformCallback = (caretPosition: DocumentPosition, inputType: string | undefined, diff: IDiff) => number | void; @@ -179,7 +179,7 @@ export default class EditorModel { * Should be run inside a `model.transform()` callback. * @param {Part[]} parts the parts to replace the range with * @param {DocumentPosition} position the position to start inserting at - * @return {Number} the amount of characters added + * @returns {Number} the amount of characters added */ public insert(parts: Part[], position: IPosition): number { const insertIndex = this.splitAt(position); @@ -303,7 +303,7 @@ export default class EditorModel { * removes `len` amount of characters at `pos`. * @param {Object} pos * @param {Number} len - * @return {Number} how many characters before pos were also removed, + * @returns {Number} how many characters before pos were also removed, * usually because of non-editable parts that can only be removed in their entirety. */ public removeText(pos: IPosition, len: number): number { @@ -363,7 +363,7 @@ export default class EditorModel { * @param {Object} pos * @param {string} str * @param {string} inputType the source of the input, see html InputEvent.inputType - * @return {Number} how far from position (in characters) the insertion ended. + * @returns {Number} how far from position (in characters) the insertion ended. * This can be more than the length of `str` when crossing non-editable parts, which are skipped. */ private addText(pos: IPosition, str: string, inputType: string | undefined): number { @@ -434,7 +434,7 @@ export default class EditorModel { * Starts a range, which can span across multiple parts, to find and replace text. * @param {DocumentPosition} positionA a boundary of the range * @param {DocumentPosition?} positionB the other boundary of the range, optional - * @return {Range} + * @returns {Range} */ public startRange(positionA: DocumentPosition, positionB = positionA): Range { return new Range(this, positionA, positionB); @@ -463,7 +463,7 @@ export default class EditorModel { * Performs a transformation not part of an update cycle. * Modifying the model should only happen inside a transform call if not part of an update call. * @param {ManualTransformCallback} callback to run the transformations in - * @return {Promise} a promise when auto-complete (if applicable) is done updating + * @returns {Promise} a promise when auto-complete (if applicable) is done updating */ public transform(callback: ManualTransformCallback): Promise { const pos = callback(); diff --git a/apps/web/src/editor/range.ts b/apps/web/src/editor/range.ts index eff439ec811..eecbde5c54a 100644 --- a/apps/web/src/editor/range.ts +++ b/apps/web/src/editor/range.ts @@ -93,7 +93,7 @@ export default class Range { * Splits the model at the range boundaries and replaces with the given parts. * Should be run inside a `model.transform()` callback. * @param {Part[]} parts the parts to replace the range with - * @return {Number} the net amount of characters added, can be negative. + * @returns {Number} the net amount of characters added, can be negative. */ public replace(parts: Part[]): number { const newLength = parts.reduce((sum, part) => sum + part.text.length, 0); diff --git a/apps/web/src/hooks/useAsyncRefreshMemo.ts b/apps/web/src/hooks/useAsyncRefreshMemo.ts index a1845ac8166..83e5be90e8c 100644 --- a/apps/web/src/hooks/useAsyncRefreshMemo.ts +++ b/apps/web/src/hooks/useAsyncRefreshMemo.ts @@ -16,7 +16,7 @@ type Fn = () => Promise; * @param fn function to memoize * @param deps React hooks dependencies for the function * @param initialValue initial value - * @return tuple of cached value and refresh callback + * @returns tuple of cached value and refresh callback */ export function useAsyncRefreshMemo(fn: Fn, deps: DependencyList, initialValue: T): [T, () => void]; export function useAsyncRefreshMemo(fn: Fn, deps: DependencyList, initialValue?: T): [T | undefined, () => void]; diff --git a/apps/web/src/indexing/BaseEventIndexManager.ts b/apps/web/src/indexing/BaseEventIndexManager.ts index 8f0e5a1651f..9893dab429c 100644 --- a/apps/web/src/indexing/BaseEventIndexManager.ts +++ b/apps/web/src/indexing/BaseEventIndexManager.ts @@ -76,7 +76,7 @@ export default abstract class BaseEventIndexManager { * optionally enable event indexing they may override this method to perform * the necessary runtime checks here. * - * @return {Promise} A promise that will resolve to true if event indexing + * @returns {Promise} A promise that will resolve to true if event indexing * is supported, false otherwise. */ public async supportsEventIndexing(): Promise { @@ -88,7 +88,7 @@ export default abstract class BaseEventIndexManager { * @param {string} userId The event that should be added to the index. * @param {string} deviceId The profile of the event sender at the * - * @return {Promise} A promise that will resolve when the event index is + * @returns {Promise} A promise that will resolve when the event index is * initialized. */ public async initEventIndex(userId: string, deviceId: string): Promise { @@ -102,7 +102,7 @@ export default abstract class BaseEventIndexManager { * @param {IMatrixProfile} profile The profile of the event sender at the * time the event was received. * - * @return {Promise} A promise that will resolve when the was queued up for + * @returns {Promise} A promise that will resolve when the was queued up for * addition. */ public async addEventToIndex(ev: IMatrixEvent, profile: IMatrixProfile): Promise { @@ -123,7 +123,7 @@ export default abstract class BaseEventIndexManager { * @param {string} roomId The ID of the room which we want to check if it * has been already indexed. * - * @return {Promise} Returns true if the index contains events for + * @returns {Promise} Returns true if the index contains events for * the given room, false otherwise. */ public isRoomIndexed(roomId: string): Promise { @@ -133,7 +133,7 @@ export default abstract class BaseEventIndexManager { /** * Get statistical information of the index. * - * @return {Promise} A promise that will resolve to the index + * @returns {Promise} A promise that will resolve to the index * statistics. */ public async getStats(): Promise { @@ -142,7 +142,7 @@ export default abstract class BaseEventIndexManager { /** * Get the user version of the database. - * @return {Promise} A promise that will resolve to the user stored + * @returns {Promise} A promise that will resolve to the user stored * version number. */ public async getUserVersion(): Promise { @@ -155,7 +155,7 @@ export default abstract class BaseEventIndexManager { * @param {number} version The new version that should be stored in the * database. * - * @return {Promise} A promise that will resolve once the new version + * @returns {Promise} A promise that will resolve once the new version * is stored. */ public async setUserVersion(version: number): Promise { @@ -165,7 +165,7 @@ export default abstract class BaseEventIndexManager { /** * Commit the previously queued up events to the index. * - * @return {Promise} A promise that will resolve once the queued up events + * @returns {Promise} A promise that will resolve once the queued up events * were added to the index. */ public async commitLiveEvents(): Promise { @@ -178,7 +178,7 @@ export default abstract class BaseEventIndexManager { * @param {ISearchArgs} searchArgs The search configuration for the search, * sets the search term and determines the search result contents. * - * @return {Promise} A promise that will resolve to an array + * @returns {Promise} A promise that will resolve to an array * of search results once the search is done. */ public async searchEventIndex(searchArgs: ISearchArgs): Promise { @@ -199,7 +199,7 @@ export default abstract class BaseEventIndexManager { * to fetch the current batch of events. This checkpoint will be removed * from the index. * - * @return {Promise} A promise that will resolve to true if all the events + * @returns {Promise} A promise that will resolve to true if all the events * were already added to the index, false otherwise. */ public async addHistoricEvents( @@ -216,7 +216,7 @@ export default abstract class BaseEventIndexManager { * @param {ICrawlerCheckpoint} checkpoint The checkpoint that should be added * to the index. * - * @return {Promise} A promise that will resolve once the checkpoint has + * @returns {Promise} A promise that will resolve once the checkpoint has * been stored. */ public async addCrawlerCheckpoint(checkpoint: ICrawlerCheckpoint): Promise { @@ -229,7 +229,7 @@ export default abstract class BaseEventIndexManager { * @param {ICrawlerCheckpoint} checkpoint The checkpoint that should be * removed from the index. * - * @return {Promise} A promise that will resolve once the checkpoint has + * @returns {Promise} A promise that will resolve once the checkpoint has * been removed. */ public async removeCrawlerCheckpoint(checkpoint: ICrawlerCheckpoint): Promise { @@ -239,7 +239,7 @@ export default abstract class BaseEventIndexManager { /** * Load the stored checkpoints from the index. * - * @return {Promise<[ICrawlerCheckpoint]>} A promise that will resolve to an + * @returns {Promise<[ICrawlerCheckpoint]>} A promise that will resolve to an * array of crawler checkpoints once they have been loaded from the index. */ public async loadCheckpoints(): Promise { @@ -258,7 +258,7 @@ export default abstract class BaseEventIndexManager { * @param {string} args.direction The direction to which we should continue * loading events from. This is used only if fromEvent is used as well. * - * @return {Promise<[IEventAndProfile]>} A promise that will resolve to an + * @returns {Promise<[IEventAndProfile]>} A promise that will resolve to an * array of Matrix events that contain mxc URLs accompanied with the * historic profile of the sender. */ @@ -269,7 +269,7 @@ export default abstract class BaseEventIndexManager { /** * close our event index. * - * @return {Promise} A promise that will resolve once the event index has + * @returns {Promise} A promise that will resolve once the event index has * been closed. */ public async closeEventIndex(): Promise { @@ -279,7 +279,7 @@ export default abstract class BaseEventIndexManager { /** * Delete our current event index. * - * @return {Promise} A promise that will resolve once the event index has + * @returns {Promise} A promise that will resolve once the event index has * been deleted. */ public async deleteEventIndex(): Promise { diff --git a/apps/web/src/indexing/EventIndex.ts b/apps/web/src/indexing/EventIndex.ts index 97913bf8452..2e3539fc5aa 100644 --- a/apps/web/src/indexing/EventIndex.ts +++ b/apps/web/src/indexing/EventIndex.ts @@ -711,7 +711,7 @@ export default class EventIndex extends EventEmitter { * @param {ISearchArgs} searchArgs The search configuration for the search, * sets the search term and determines the search result contents. * - * @return {Promise} A promise that will resolve to an array + * @returns {Promise} A promise that will resolve to an array * of search results once the search is done. */ public async search(searchArgs: ISearchArgs): Promise { @@ -949,7 +949,7 @@ export default class EventIndex extends EventEmitter { /** * Get statistical information of the index. * - * @return {Promise} A promise that will resolve to the index + * @returns {Promise} A promise that will resolve to the index * statistics. */ public async getStats(): Promise { @@ -963,7 +963,7 @@ export default class EventIndex extends EventEmitter { * @param {string} roomId The ID of the room which we want to check if it * has been already indexed. * - * @return {Promise} Returns true if the index contains events for + * @returns {Promise} Returns true if the index contains events for * the given room, false otherwise. */ public async isRoomIndexed(roomId: string): Promise { diff --git a/apps/web/src/indexing/EventIndexPeg.ts b/apps/web/src/indexing/EventIndexPeg.ts index f33cbcc74ca..eb32c823cad 100644 --- a/apps/web/src/indexing/EventIndexPeg.ts +++ b/apps/web/src/indexing/EventIndexPeg.ts @@ -37,7 +37,7 @@ export class EventIndexPeg { * Initialize the EventIndexPeg and if event indexing is enabled initialize * the event index. * - * @return {Promise} A promise that will resolve to true if an + * @returns {Promise} A promise that will resolve to true if an * EventIndex was successfully initialized, false otherwise. */ public async init(): Promise { @@ -111,7 +111,7 @@ export class EventIndexPeg { /** * Check if the current platform has support for event indexing. * - * @return {boolean} True if it has support, false otherwise. Note that this + * @returns {boolean} True if it has support, false otherwise. Note that this * does not mean that support is installed. */ public platformHasSupport(): boolean { @@ -125,7 +125,7 @@ export class EventIndexPeg { * this tells us if those are installed. Note that this should only be * called after the init() method was called. * - * @return {boolean} True if support is installed, false otherwise. + * @returns {boolean} True if support is installed, false otherwise. */ public supportIsInstalled(): boolean { return this._supportIsInstalled; @@ -134,7 +134,7 @@ export class EventIndexPeg { /** * Get the current event index. * - * @return {EventIndex} The current event index. + * @returns {EventIndex} The current event index. */ public get(): EventIndex | null { return this.index; @@ -155,7 +155,7 @@ export class EventIndexPeg { * * After a call to this the init() method will need to be called again. * - * @return {Promise} A promise that will resolve once the event index is + * @returns {Promise} A promise that will resolve once the event index is * closed. */ public async unset(): Promise { @@ -169,7 +169,7 @@ export class EventIndexPeg { * * After a call to this the init() method will need to be called again. * - * @return {Promise} A promise that will resolve once the event index is + * @returns {Promise} A promise that will resolve once the event index is * deleted. */ public async deleteEventIndex(): Promise { diff --git a/apps/web/src/notifications/PushRuleVectorState.ts b/apps/web/src/notifications/PushRuleVectorState.ts index 465299095a6..ae40c70aa11 100644 --- a/apps/web/src/notifications/PushRuleVectorState.ts +++ b/apps/web/src/notifications/PushRuleVectorState.ts @@ -37,7 +37,7 @@ export class PushRuleVectorState { /** * Convert a PushRuleVectorState to a list of actions * - * @return [object] list of push-rule actions + * @returns [object] list of push-rule actions */ public static actionsFor(pushRuleVectorState?: VectorState): PushRuleAction[] { if (pushRuleVectorState === VectorState.On) { diff --git a/apps/web/src/phonenumber.ts b/apps/web/src/phonenumber.ts index dbf49e65b93..a5d67e39738 100644 --- a/apps/web/src/phonenumber.ts +++ b/apps/web/src/phonenumber.ts @@ -15,7 +15,7 @@ const PHONE_NUMBER_REGEXP = /^[0-9 -.]+$/; * @param {String} phoneNumber The string to validate. This could be * either an international format number (MSISDN or e.164) or * a national-format number. - * @return True if the number could be a valid phone number, otherwise false. + * @returns True if the number could be a valid phone number, otherwise false. */ export function looksValid(phoneNumber: string): boolean { return PHONE_NUMBER_REGEXP.test(phoneNumber); diff --git a/apps/web/src/rageshake/rageshake.ts b/apps/web/src/rageshake/rageshake.ts index fbfedf0e4c1..b4c3c1494e5 100644 --- a/apps/web/src/rageshake/rageshake.ts +++ b/apps/web/src/rageshake/rageshake.ts @@ -109,7 +109,7 @@ export class ConsoleLogger { /** * Retrieve log lines to flush to disk. * @param {boolean} keepLogs True to not delete logs after flushing. - * @return {string} \n delimited log lines to flush. + * @returns {string} \n delimited log lines to flush. */ public flush(keepLogs?: boolean): string { // The ConsoleLogger doesn't care how these end up on disk, it just @@ -139,7 +139,7 @@ export class IndexedDBLogStore { } /** - * @return {Promise} Resolves when the store is ready. + * @returns {Promise} Resolves when the store is ready. */ public connect(): Promise { const req = this.indexedDB.open("logs"); @@ -195,7 +195,7 @@ export class IndexedDBLogStore { * This guarantees that we will always eventually do a flush when flush() is * called. * - * @return {Promise} Resolved when the logs have been flushed. + * @returns {Promise} Resolved when the logs have been flushed. */ public flush(): Promise { // check if a flush() operation is ongoing @@ -250,7 +250,7 @@ export class IndexedDBLogStore { * returned are deleted at the same time, so this can be called at startup * to do house-keeping to keep the logs from growing too large. * - * @return {Promise} Resolves to an array of objects. The array is + * @returns {Promise} Resolves to an array of objects. The array is * sorted in time (oldest first) based on when the log file was created (the * log ID). The objects have said log ID in an "id" field and "lines" which * is a big string with all the new-line delimited logs. @@ -455,7 +455,7 @@ export class IndexedDBLogStore { * @param {Function} resultMapper A function which is repeatedly called with a * Cursor. * Return the data you want to keep. - * @return {Promise} Resolves to an array of whatever you returned from + * @returns {Promise} Resolves to an array of whatever you returned from * resultMapper. */ function selectQuery( @@ -487,7 +487,7 @@ function selectQuery( * Modifies globals. * @param {boolean} setUpPersistence When true (default), the persistence will * be set up immediately for the logs. - * @return {Promise} Resolves when set up. + * @returns {Promise} Resolves when set up. */ export function init(setUpPersistence = true): Promise { if (global.mx_rage_initPromise) { @@ -512,7 +512,7 @@ export function init(setUpPersistence = true): Promise { /** * Try to start up the rageshake storage for logs. If not possible (client unsupported) * then this no-ops. - * @return {Promise} Resolves when complete. + * @returns {Promise} Resolves when complete. */ export function tryInitStorage(): Promise { if (global.mx_rage_initStoragePromise) { @@ -558,7 +558,7 @@ export function flush(): void { * @deprecated There is no need to call this explicitly: it will be done as a side-effect of {@link tryInitStorage}, * or {@link init} with `setUpPersistence: true`. * - * @return {Promise} Resolves if cleaned logs. + * @returns {Promise} Resolves if cleaned logs. */ export async function cleanup(): Promise { if (!global.mx_rage_store) { @@ -570,7 +570,7 @@ export async function cleanup(): Promise { /** * Get a recent snapshot of the logs, ready for attaching to a bug report * - * @return {Array<{lines: string, id, string}>} list of log data + * @returns {Array<{lines: string, id, string}>} list of log data */ export async function getLogsForReport(): Promise<{ lines: string; id: string }[]> { if (!global.mx_rage_logger) { diff --git a/apps/web/src/rageshake/submit-rageshake.ts b/apps/web/src/rageshake/submit-rageshake.ts index 071a4986a64..e69c1429c34 100644 --- a/apps/web/src/rageshake/submit-rageshake.ts +++ b/apps/web/src/rageshake/submit-rageshake.ts @@ -340,7 +340,7 @@ async function collectLogs( * * @param {function(string)} opts.progressCallback Callback to call with progress updates * - * @return {Promise} URL returned by the rageshake server + * @returns {Promise} URL returned by the rageshake server * * @throws A RageshakeError when the rageshake server responds with an error. This will be `RS_UNKNOWN` if the * the server does not respond with an expected body format. @@ -361,7 +361,7 @@ export default async function sendBugReport(bugReportEndpoint?: string, opts: IO * Loads a bug report into a tarball. * * @param opts optional dictionary of options - * @return Resolves with a Tarball object. + * @returns Resolves with a Tarball object. */ export async function loadBugReport(opts: IOpts = {}): Promise { const Tar = (await import("tar-js")).default; @@ -395,7 +395,7 @@ export async function loadBugReport(opts: IOpts = {}): Promise { * but instead causes the browser to download the files locally. * * @param opts optional dictionary of options - * @return Resolved when the bug report is downloaded (or started). + * @returns Resolved when the bug report is downloaded (or started). */ export async function downloadBugReport(opts: IOpts = {}): Promise { const tape = await loadBugReport(opts); diff --git a/apps/web/src/resizer/resizer.ts b/apps/web/src/resizer/resizer.ts index 8a814792adf..76e922b29d9 100644 --- a/apps/web/src/resizer/resizer.ts +++ b/apps/web/src/resizer/resizer.ts @@ -72,7 +72,7 @@ export default class Resizer = Resize Gives the distributor for a specific resize handle, as if you would have started to drag that handle. Can be used to manipulate the size of an item programmatically. @param {number} handleIndex the index of the resize handle in the container - @return {FixedDistributor} a new distributor for the given handle + @returns {FixedDistributor} a new distributor for the given handle */ public forHandleAt(handleIndex: number): FixedDistributor | undefined { const handles = this.getResizeHandles(); diff --git a/apps/web/src/resizer/sizer.ts b/apps/web/src/resizer/sizer.ts index 2284781c9df..a9a8868d1cf 100644 --- a/apps/web/src/resizer/sizer.ts +++ b/apps/web/src/resizer/sizer.ts @@ -19,7 +19,7 @@ export default class Sizer { /** @param {Element} item the dom element being resized - @return {number} how far the edge of the item is from the edge of the container + @returns {number} how far the edge of the item is from the edge of the container */ public getItemOffset(item: HTMLElement): number { const offset = (this.vertical ? item.offsetTop : item.offsetLeft) - this.getOffset(); @@ -32,23 +32,23 @@ export default class Sizer { /** @param {Element} item the dom element being resized - @return {number} the width/height of an item in the container + @returns {number} the width/height of an item in the container */ public getItemSize(item: HTMLElement): number { return this.vertical ? item.offsetHeight : item.offsetWidth; } - /** @return {number} the width/height of the container */ + /** @returns {number} the width/height of the container */ public getTotalSize(): number { return this.vertical ? this.container.offsetHeight : this.container.offsetWidth; } - /** @return {number} container offset to offsetParent */ + /** @returns {number} container offset to offsetParent */ private getOffset(): number { return this.vertical ? this.container.offsetTop : this.container.offsetLeft; } - /** @return {number} container offset to document */ + /** @returns {number} container offset to document */ private getPageOffset(): number { let element = this.container; let offset = 0; @@ -90,7 +90,7 @@ export default class Sizer { /** @param {MouseEvent} event the mouse event - @return {number} the distance between the cursor and the edge of the container, + @returns {number} the distance between the cursor and the edge of the container, along the applicable axis (vertical or horizontal) */ public offsetFromEvent(event: MouseEvent): number { diff --git a/apps/web/src/settings/SettingsStore.ts b/apps/web/src/settings/SettingsStore.ts index ad8627ab059..8e28c6779d8 100644 --- a/apps/web/src/settings/SettingsStore.ts +++ b/apps/web/src/settings/SettingsStore.ts @@ -276,7 +276,7 @@ export default class SettingsStore { * @param {string} settingName The setting to look up. * @param {SettingLevel} atLevel * The level to get the display name for; Defaults to 'default'. - * @return {String} The display name for the setting, or null if not found. + * @returns {String} The display name for the setting, or null if not found. */ public static getDisplayName(settingName: SettingKey, atLevel = SettingLevel.DEFAULT): string | null { if (!SETTINGS[settingName] || !SETTINGS[settingName].displayName) return null; @@ -299,7 +299,7 @@ export default class SettingsStore { /** * Gets the translated description for a given setting * @param {string} settingName The setting to look up. - * @return {String} The description for the setting, or null if not found. + * @returns {String} The description for the setting, or null if not found. */ public static getDescription(settingName: SettingKey): string | ReactNode { const description = SETTINGS[settingName]?.description; @@ -311,7 +311,7 @@ export default class SettingsStore { /** * Determines if a setting is also a feature. * @param {string} settingName The setting to look up. - * @return {boolean} True if the setting is a feature. + * @returns {boolean} True if the setting is a feature. */ public static isFeature(settingName: SettingKey): boolean { if (!SETTINGS[settingName]) return false; @@ -321,7 +321,7 @@ export default class SettingsStore { /** * Determines if a setting should have a warning sign in the microcopy * @param {string} settingName The setting to look up. - * @return {boolean} True if the setting should have a warning sign. + * @returns {boolean} True if the setting should have a warning sign. */ public static shouldHaveWarning(settingName: SettingKey): boolean { if (!SETTINGS[settingName]) return false; @@ -354,7 +354,7 @@ export default class SettingsStore { * If a setting is not disabled, or no reason is given by the `SettingController`, * this will return undefined. * @param {string} settingName The setting to look up. - * @return {string} The reason the setting is disabled. + * @returns {string} The reason the setting is disabled. */ public static disabledMessage(settingName: SettingKey): string | undefined { const disabled = SETTINGS[settingName].controller?.settingDisabled; @@ -367,7 +367,7 @@ export default class SettingsStore { * @param {string} settingName The name of the setting to read the value of. * @param {String} roomId The room ID to read the setting value in, may be null. * @param {boolean} excludeDefault True to disable using the default value. - * @return {*} The value, or null if not found + * @returns {*} The value, or null if not found */ public static getValue( settingName: S, @@ -404,7 +404,7 @@ export default class SettingsStore { * @param {boolean} explicit If true, this method will not consider other levels, just the one * provided. Defaults to false. * @param {boolean} excludeDefault True to disable using the default value. - * @return {*} The value, or null if not found. + * @returns {*} The value, or null if not found. */ public static getValueAt( level: SettingLevel, @@ -460,7 +460,7 @@ export default class SettingsStore { /** * Gets the default value of a setting. * @param settingName The name of the setting to read the value of. - * @return The default value + * @returns The default value */ public static getDefaultValue(settingName: S): Settings[S]["default"] { // Verify that the setting is actually a setting @@ -498,7 +498,7 @@ export default class SettingsStore { * @param level The level * to change the value at. * @param value The new value of the setting, may be null. - * @return Resolves when the setting has been changed. + * @returns Resolves when the setting has been changed. */ public static async setValue( settingName: S, @@ -556,7 +556,7 @@ export default class SettingsStore { * @param {string} settingName The name of the setting to check. * @param {String} roomId The room ID to check in, may be null. * @param {SettingLevel} level The level to check at. - * @return {boolean} True if the user may set the setting, false otherwise. + * @returns {boolean} True if the user may set the setting, false otherwise. */ public static canSetValue(settingName: SettingKey, roomId: string | null, level: SettingLevel): boolean { const setting = SETTINGS[settingName]; @@ -610,7 +610,7 @@ export default class SettingsStore { * Determines if the given level is supported on this device. * @param {SettingLevel} level The level * to check the feasibility of. - * @return {boolean} True if the level is supported, false otherwise. + * @returns {boolean} True if the level is supported, false otherwise. */ public static isLevelSupported(level: SettingLevel): boolean { if (!LEVEL_HANDLERS[level]) return false; @@ -638,7 +638,7 @@ export default class SettingsStore { * Determines the first supported level out of all the levels that can be used for a * specific setting. * @param {string} settingName The setting name. - * @return {SettingLevel} + * @returns {SettingLevel} */ public static firstSupportedLevel(settingName: SettingKey): SettingLevel | null { // Verify that the setting is actually a setting diff --git a/apps/web/src/settings/controllers/SettingController.ts b/apps/web/src/settings/controllers/SettingController.ts index b033e9377ea..9aa75aeb40b 100644 --- a/apps/web/src/settings/controllers/SettingController.ts +++ b/apps/web/src/settings/controllers/SettingController.ts @@ -32,7 +32,7 @@ export default abstract class SettingController { * may be null. * @param {SettingLevel} calculatedAtLevel The level for which the calculated value was * calculated at. May be null. - * @return {*} The value that should be used, or null if no override is applicable. + * @returns {*} The value that should be used, or null if no override is applicable. */ public getValueOverride( level: SettingLevel, @@ -48,7 +48,7 @@ export default abstract class SettingController { * @param {string} level The level at which the setting has been modified. * @param {String} roomId The room ID, may be null. * @param {*} newValue The new value for the setting, may be null. - * @return {boolean} Whether the settings change should be accepted. + * @returns {boolean} Whether the settings change should be accepted. */ public async beforeChange(level: SettingLevel, roomId: string | null, newValue: any): Promise { return true; diff --git a/apps/web/src/slash-commands/SlashCommands.tsx b/apps/web/src/slash-commands/SlashCommands.tsx index b91d2f4d328..53d5b6b796a 100644 --- a/apps/web/src/slash-commands/SlashCommands.tsx +++ b/apps/web/src/slash-commands/SlashCommands.tsx @@ -896,7 +896,7 @@ interface ICmd { * Process the given text for /commands and returns a parsed command that can be used for running the operation. * @param {string} roomId The room ID where the command was issued. * @param {string} input The raw text input by the user. - * @return {ICmd} The parsed command object. + * @returns {ICmd} The parsed command object. * Returns an empty object if the input didn't match a command. */ export function getCommand(roomId: string, input: string): ICmd { diff --git a/apps/web/src/stores/room-list-v3/section.ts b/apps/web/src/stores/room-list-v3/section.ts index ea1fc8927ea..09aebf3c96c 100644 --- a/apps/web/src/stores/room-list-v3/section.ts +++ b/apps/web/src/stores/room-list-v3/section.ts @@ -167,7 +167,7 @@ export function getOrderedReorderableSections(): ReorderableSection[] { * If the user confirms, it generates a unique tag for the section, saves the section data in the settings, and updates the ordered list of sections. * * @param spaceId The space in which the section is being created. Used to control visibility of the empty section. - * @return A promise that resolves to the new section tag if created, or undefined if cancelled. + * @returns A promise that resolves to the new section tag if created, or undefined if cancelled. */ export async function createSection(spaceId: SpaceKey): Promise { const modal = Modal.createDialog(CreateSectionDialog); diff --git a/apps/web/src/utils/FileUtils.ts b/apps/web/src/utils/FileUtils.ts index 79584890573..a0901e91b39 100644 --- a/apps/web/src/utils/FileUtils.ts +++ b/apps/web/src/utils/FileUtils.ts @@ -31,7 +31,7 @@ export function downloadLabelForFile(content: MediaEventContent, withSize = true * @param {string} fallbackText The fallback text * @param {boolean} withSize Whether to include size information. Default true. * @param {boolean} shortened Ensure the extension of the file name is visible. Default false. - * @return {string} the human-readable link text for the attachment. + * @returns {string} the human-readable link text for the attachment. */ export function presentableTextForFile( content: MediaEventContent, diff --git a/apps/web/src/utils/MegolmExportEncryption.ts b/apps/web/src/utils/MegolmExportEncryption.ts index 818f20b532b..b7a5cc3bff2 100644 --- a/apps/web/src/utils/MegolmExportEncryption.ts +++ b/apps/web/src/utils/MegolmExportEncryption.ts @@ -35,7 +35,7 @@ function cryptoFailMsg(): string { * * @param {ArrayBuffer} data file to decrypt * @param {String} password - * @return {Promise} promise for decrypted output + * @returns {Promise} promise for decrypted output * * */ @@ -103,7 +103,7 @@ export async function decryptMegolmKeyFile(data: ArrayBuffer, password: string): * @param {Object=} options * @param {Number=} options.kdf_rounds Number of iterations to perform of the * key-derivation function. - * @return {Promise} promise for encrypted output + * @returns {Promise} promise for encrypted output */ export async function encryptMegolmKeyFile( data: string, @@ -178,7 +178,7 @@ export async function encryptMegolmKeyFile( * @param {Unit8Array} salt salt for pbkdf * @param {Number} iterations number of pbkdf iterations * @param {String} password password - * @return {Promise<[CryptoKey, CryptoKey]>} promise for [aes key, hmac key] + * @returns {Promise<[CryptoKey, CryptoKey]>} promise for [aes key, hmac key] */ async function deriveKeys( salt: Uint8Array, @@ -251,7 +251,7 @@ const TRAILER_LINE = "-----END MEGOLM SESSION DATA-----"; * Strips the header and trailer lines, and unbase64s the content * * @param {ArrayBuffer} data input file - * @return {Uint8Array} unbase64ed content + * @returns {Uint8Array} unbase64ed content */ function unpackMegolmKeyFile(data: ArrayBuffer): Uint8Array { // parse the file as a great big String. This should be safe, because there @@ -306,7 +306,7 @@ function unpackMegolmKeyFile(data: ArrayBuffer): Uint8Array { * base64s the content, and adds header and trailer lines * * @param {Uint8Array} data raw data - * @return {ArrayBuffer} formatted file + * @returns {ArrayBuffer} formatted file */ function packMegolmKeyFile(data: Uint8Array): ArrayBuffer { // we split into lines before base64ing, because encodeBase64 doesn't deal @@ -329,7 +329,7 @@ function packMegolmKeyFile(data: Uint8Array): ArrayBuffer { /** * Encode a typed array of uint8 as base64. * @param {Uint8Array} uint8Array The data to encode. - * @return {string} The base64. + * @returns {string} The base64. */ function encodeBase64(uint8Array: Uint8Array): string { // Misinterpt the Uint8Array as Latin-1. @@ -342,7 +342,7 @@ function encodeBase64(uint8Array: Uint8Array): string { /** * Decode a base64 string to a typed array of uint8. * @param {string} base64 The base64 to decode. - * @return {Uint8Array} The decoded data. + * @returns {Uint8Array} The decoded data. */ function decodeBase64(base64: string): Uint8Array { // window.atob returns a unicode string with codepoints in the range 0-255. diff --git a/apps/web/src/utils/MessageDiffUtils.tsx b/apps/web/src/utils/MessageDiffUtils.tsx index 53d12b25136..4ccb71a9f14 100644 --- a/apps/web/src/utils/MessageDiffUtils.tsx +++ b/apps/web/src/utils/MessageDiffUtils.tsx @@ -246,7 +246,7 @@ function renderDifferenceInDOM(originalRootNode: Node, diff: IDiff, diffMathPatc * Renders a message with the changes made in an edit shown visually. * @param {IContent} originalContent the content for the base message * @param {IContent} editContent the content for the edit message - * @return {JSX.Element} a react element similar to what `bodyToHtml` returns + * @returns {JSX.Element} a react element similar to what `bodyToHtml` returns */ export function editBodyDiffToHtml(originalContent: IContent, editContent: IContent): JSX.Element { // wrap the body in a div, DiffDOM needs a root element diff --git a/apps/web/src/utils/PinningUtils.ts b/apps/web/src/utils/PinningUtils.ts index 19a1a9a7265..6028bec686a 100644 --- a/apps/web/src/utils/PinningUtils.ts +++ b/apps/web/src/utils/PinningUtils.ts @@ -33,7 +33,7 @@ export default class PinningUtils { * Determines if the given event can be pinned. * This is a simple check to see if the event is of a type that can be pinned. * @param {MatrixEvent} event The event to check. - * @return {boolean} True if the event may be pinned, false otherwise. + * @returns {boolean} True if the event may be pinned, false otherwise. */ public static isPinnable(event: MatrixEvent): boolean { if (event.isRedacted()) return false; @@ -43,7 +43,7 @@ export default class PinningUtils { /** * Determines if the given event may be unpinned. * @param {MatrixEvent} event The event to check. - * @return {boolean} True if the event may be unpinned, false otherwise. + * @returns {boolean} True if the event may be unpinned, false otherwise. */ public static isUnpinnable(event: MatrixEvent): boolean { if (!event) return false; diff --git a/apps/web/src/utils/Timer.ts b/apps/web/src/utils/Timer.ts index c5d9084c310..f078bcbe55e 100644 --- a/apps/web/src/utils/Timer.ts +++ b/apps/web/src/utils/Timer.ts @@ -105,7 +105,7 @@ export default class Timer { /** *promise that will resolve when the timer elapses, *or is rejected when abort is called - *@return {Promise} + *@returns {Promise} */ public finished(): Promise { return this.deferred.promise; diff --git a/apps/web/src/utils/WidgetUtils.ts b/apps/web/src/utils/WidgetUtils.ts index 41232db3c44..86e5af1412b 100644 --- a/apps/web/src/utils/WidgetUtils.ts +++ b/apps/web/src/utils/WidgetUtils.ts @@ -44,7 +44,7 @@ export default class WidgetUtils { * (Does not apply to non-room-based / user widgets) * @param client The matrix client of the logged-in user * @param roomId -- The ID of the room to check - * @return Boolean -- true if the user can modify widgets in this room + * @returns Boolean -- true if the user can modify widgets in this room * @throws Error -- specifies the error reason */ public static canUserModifyWidgets(client: MatrixClient, roomId?: string): boolean { @@ -84,7 +84,7 @@ export default class WidgetUtils { * Returns true if specified url is a scalar URL, typically https://scalar.vector.im/api * @param matrixClient The matrix client of the logged-in user * @param {[type]} testUrlString URL to check - * @return {Boolean} True if specified URL is a scalar URL + * @returns {Boolean} True if specified URL is a scalar URL */ public static isScalarUrl(testUrlString?: string): boolean { if (!testUrlString) { @@ -339,7 +339,7 @@ export default class WidgetUtils { /** * Get room specific widgets * @param {Room} room The room to get widgets force - * @return {[object]} Array containing current / active room widgets + * @returns {[object]} Array containing current / active room widgets */ public static getRoomWidgets(room: Room): MatrixEvent[] { // TODO: Enable support for m.widget event type (https://github.com/vector-im/element-web/issues/13111) @@ -356,7 +356,7 @@ export default class WidgetUtils { /** * Get user specific widgets (not linked to a specific room) * @param client The matrix client of the logged-in user - * @return {object} Event content object containing current / active user widgets + * @returns {object} Event content object containing current / active user widgets */ public static getUserWidgets(client: MatrixClient | undefined): Record { if (!client) { @@ -372,7 +372,7 @@ export default class WidgetUtils { /** * Get user specific widgets (not linked to a specific room) as an array * @param client The matrix client of the logged-in user - * @return {[object]} Array containing current / active user widgets + * @returns {[object]} Array containing current / active user widgets */ public static getUserWidgetsArray(client: MatrixClient | undefined): UserWidget[] { return Object.values(WidgetUtils.getUserWidgets(client)); @@ -381,7 +381,7 @@ export default class WidgetUtils { /** * Get active stickerpicker widgets (stickerpickers are user widgets by nature) * @param client The matrix client of the logged-in user - * @return {[object]} Array containing current / active stickerpicker widgets + * @returns {[object]} Array containing current / active stickerpicker widgets */ public static getStickerpickerWidgets(client: MatrixClient | undefined): UserWidget[] { const widgets = WidgetUtils.getUserWidgetsArray(client); @@ -401,7 +401,7 @@ export default class WidgetUtils { /** * Remove all stickerpicker widgets (stickerpickers are user widgets by nature) * @param client The matrix client of the logged-in user - * @return {Promise} Resolves on account data updated + * @returns {Promise} Resolves on account data updated */ public static async removeStickerpickerWidgets(client: MatrixClient | undefined): Promise { if (!client) { diff --git a/apps/web/src/utils/image-media.ts b/apps/web/src/utils/image-media.ts index 03c34fb39ea..78ba51276cb 100644 --- a/apps/web/src/utils/image-media.ts +++ b/apps/web/src/utils/image-media.ts @@ -38,7 +38,7 @@ const MAX_HEIGHT = 600; * @param {number} inputHeight the width of the image in the input element. * @param {string} mimeType The mimeType to save the blob as. * @param {boolean} calculateBlurhash Whether to calculate a blurhash of the given image too. - * @return {Promise} A promise that resolves with an object with an info key + * @returns {Promise} A promise that resolves with an object with an info key * and a thumbnail key. */ export async function createThumbnail( diff --git a/apps/web/src/utils/tokens/pickling.ts b/apps/web/src/utils/tokens/pickling.ts index 3415624e64c..f0658ccee30 100644 --- a/apps/web/src/utils/tokens/pickling.ts +++ b/apps/web/src/utils/tokens/pickling.ts @@ -46,7 +46,7 @@ export interface EncryptedPickleKey { * * @param {string} userId The user ID who owns the pickle key. * @param {string} deviceId The device ID which owns the pickle key. - * @return {Uint8Array} The additional data as a Uint8Array. + * @returns {Uint8Array} The additional data as a Uint8Array. */ export function getPickleAdditionalData(userId: string, deviceId: string): Uint8Array { const additionalData = new Uint8Array(userId.length + deviceId.length + 1); diff --git a/apps/web/src/vector/url_utils.ts b/apps/web/src/vector/url_utils.ts index 34d671c678c..2a496cdb574 100644 --- a/apps/web/src/vector/url_utils.ts +++ b/apps/web/src/vector/url_utils.ts @@ -99,7 +99,7 @@ export type URLParams = Partial<{ * Utility to parse parameters held in the app's URL. * Currently focusing only on at-load URL parameters. * @param url - the URL to parse. - * @return an object keyed by the groups defined in {@link urlParameterConfig} with values for each key listed, + * @returns an object keyed by the groups defined in {@link urlParameterConfig} with values for each key listed, * sourced from the location (query/fragment/either) specified. If no parameters in a group are found the entire group * will be omitted from the returned object to simplify presence checking. */ diff --git a/apps/web/src/viewmodels/message-body/FileBodyViewModel.ts b/apps/web/src/viewmodels/message-body/FileBodyViewModel.ts index b86dbc13913..d5033d37426 100644 --- a/apps/web/src/viewmodels/message-body/FileBodyViewModel.ts +++ b/apps/web/src/viewmodels/message-body/FileBodyViewModel.ts @@ -85,7 +85,7 @@ cacheDownloadIcon(); /** * Get the current CSS style for a DOMElement. * @param {HTMLElement} element The element to get the current style of. - * @return {string} The CSS style encoded as a string. + * @returns {string} The CSS style encoded as a string. */ function computedStyle(element: HTMLElement | null): string { if (!element) { diff --git a/apps/web/webpack.config.ts b/apps/web/webpack.config.ts index 7799140f860..c39b46e6f2f 100644 --- a/apps/web/webpack.config.ts +++ b/apps/web/webpack.config.ts @@ -826,7 +826,7 @@ export default (env: string, argv: Record): webpack.Configuration = * * @param url The adjusted name of the file, such as `warning.1234567.svg`. * @param resourcePath The absolute path to the source file with unmodified name. - * @return The returned paths will look like `img/warning.1234567.svg`. + * @returns The returned paths will look like `img/warning.1234567.svg`. */ function getAssetOutputPath(url: string, resourcePath: string): string { const isKaTeX = resourcePath.includes("KaTeX"); diff --git a/modules/.lintstagedrc b/modules/.lintstagedrc deleted file mode 100644 index 1f28a28d5c9..00000000000 --- a/modules/.lintstagedrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "*": "oxfmt --no-error-on-unmatched-pattern" -} diff --git a/packages/shared-components/src/core/VirtualizedList/virtualized-list.tsx b/packages/shared-components/src/core/VirtualizedList/virtualized-list.tsx index 11b7f669266..cb4656e1f66 100644 --- a/packages/shared-components/src/core/VirtualizedList/virtualized-list.tsx +++ b/packages/shared-components/src/core/VirtualizedList/virtualized-list.tsx @@ -68,7 +68,7 @@ export interface VirtualizedListProps extends Omit< /** * Function to get the key to use for focusing an item. * @param item - The item to get the key for - * @return The key to use for focusing the item + * @returns The key to use for focusing the item */ getItemKey: (item: Item) => string; diff --git a/packages/shared-components/src/core/i18n/i18n.tsx b/packages/shared-components/src/core/i18n/i18n.tsx index aea70f0783a..46e96dbf1e4 100644 --- a/packages/shared-components/src/core/i18n/i18n.tsx +++ b/packages/shared-components/src/core/i18n/i18n.tsx @@ -19,7 +19,7 @@ * you will end up with literal "" in your output, rather than HTML. Note that you can also use variable * substitution to insert React components, but you can't use it to translate text between tags. * - * @return a React component if any non-strings were used in substitutions, otherwise a string + * @returns a React component if any non-strings were used in substitutions, otherwise a string */ import React from "react"; import { KEY_SEPARATOR } from "matrix-web-i18n"; @@ -204,7 +204,7 @@ export function lookupString(key: TranslationKey): string { * @param {object} variables Variable substitutions, e.g { foo: 'bar' } * @param {object} tags Tag substitutions e.g. { 'a': (sub) => {sub} } * - * @return a React component if any non-strings were used in substitutions + * @returns a React component if any non-strings were used in substitutions * or translation used a fallback locale, otherwise a string */ // eslint-next-line @typescript-eslint/naming-convention @@ -243,7 +243,7 @@ export function sanitizeForTranslation(text: string): string { * the substitution (e.g. return a React component). In case of a tag replacement, the function receives as * the argument the text inside the element corresponding to the tag. * - * @return a React component if any non-strings were used in substitutions, otherwise a string + * @returns a React component if any non-strings were used in substitutions, otherwise a string */ export function substitute(text: string, variables?: StringVariables): string; export function substitute(text: string, variables?: RichVariables): React.ReactNode; @@ -277,7 +277,7 @@ export function substitute(text: string, variables?: IVariables, tags?: Tags): s * function which will receive as the argument the capture groups defined in the regexp. E.g. * { 'Hello (.?) World': (sub) => sub.toUpperCase() } * - * @return a React component if any non-strings were used in substitutions, otherwise a string + * @returns a React component if any non-strings were used in substitutions, otherwise a string */ export function replaceByRegexes(text: string, mapping: IVariables): string; export function replaceByRegexes(text: string, mapping: Tags): React.ReactNode; diff --git a/packages/shared-components/src/core/utils/linkify.ts b/packages/shared-components/src/core/utils/linkify.ts index c4d5caeea9e..35e7cc4df52 100644 --- a/packages/shared-components/src/core/utils/linkify.ts +++ b/packages/shared-components/src/core/utils/linkify.ts @@ -153,7 +153,7 @@ export interface LinkedTextOptions { * Generates a linkifyjs options object that is reasonably paired down * to just the essentials required for an Element client. * - * @return A `linkifyjs` `Opts` object. Used by `linkifyString` and `linkifyHtml + * @returns A `linkifyjs` `Opts` object. Used by `linkifyString` and `linkifyHtml * @see {@link linkifyHtml} * @see {@link linkifyString} */ From 8f068778fe103ad8bfd9b1ab35bf8edc8704e224 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 7 Jul 2026 11:31:13 +0100 Subject: [PATCH 03/23] Fixup types --- packages/shared-components/.storybook/languageAddon.tsx | 2 +- packages/shared-components/.storybook/preview.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/shared-components/.storybook/languageAddon.tsx b/packages/shared-components/.storybook/languageAddon.tsx index dcb9d8d814a..fb5c13ab060 100644 --- a/packages/shared-components/.storybook/languageAddon.tsx +++ b/packages/shared-components/.storybook/languageAddon.tsx @@ -5,7 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -import { Addon, types, useGlobals } from "storybook/manager-api"; +import { type Addon, types, useGlobals } from "storybook/manager-api"; import { WithTooltip, IconButton, TooltipLinkList } from "storybook/internal/components"; import React from "react"; import { GlobeIcon } from "@storybook/icons"; diff --git a/packages/shared-components/.storybook/preview.tsx b/packages/shared-components/.storybook/preview.tsx index 2f1d683b49b..0b53a02d153 100644 --- a/packages/shared-components/.storybook/preview.tsx +++ b/packages/shared-components/.storybook/preview.tsx @@ -19,7 +19,7 @@ import { TooltipProvider } from "@vector-im/compound-web"; import { EventPresentationProvider, type EventDensity, type EventLayout, I18nApi, I18nContext } from "../src"; import { setLanguage } from "../src/core/i18n/i18n"; -import { StoryContext } from "storybook/internal/csf"; +import { type StoryContext } from "storybook/internal/csf"; import { DragDropProvider } from "@dnd-kit/react"; import { PointerActivationConstraints, PointerSensor } from "@dnd-kit/dom"; From 3e8576764fb117f5c78b171aa674c9f8250db254 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 7 Jul 2026 12:19:09 +0100 Subject: [PATCH 04/23] Fix stray awaits on non-thenables --- apps/desktop/src/ipc.ts | 2 +- .../e2e/modules/custom-component.spec.ts | 12 +++---- .../reactions-in-threads.spec.ts | 2 +- .../e2e/right-panel/right-panel.spec.ts | 6 ++-- ...oles-permissions-room-settings-tab.spec.ts | 2 +- .../room-settings/room-security-tab.spec.ts | 2 +- .../e2e/share-dialog/share-by-url.spec.ts | 2 +- .../playwright/e2e/voip/element-call.spec.ts | 34 +++++++++---------- apps/web/src/PosthogAnalytics.test.ts | 2 +- apps/web/src/SlidingSyncManager.ts | 4 +-- apps/web/src/audio/VoiceRecording.ts | 2 +- .../encryption/DeleteKeyStoragePanel.tsx | 2 +- .../src/components/views/voip/AudioFeed.tsx | 2 +- apps/web/src/stores/AsyncStore.ts | 4 +-- apps/web/src/utils/local-room.ts | 2 +- .../DecryptionFailureTracker-test.ts | 2 +- .../test/unit-tests/DeviceListener-test.ts | 2 +- .../test/unit-tests/LegacyCallHandler-test.ts | 2 +- .../components/structures/MatrixChat-test.tsx | 2 +- .../components/structures/RoomView-test.tsx | 6 ++-- .../structures/TimelinePanel-test.tsx | 14 +++----- .../RoomSummaryCardTopicViewModel-test.tsx | 2 +- .../RoomSummaryCardViewModel-test.tsx | 4 +-- .../UserInfoPowerLevelsViewModel-test.tsx | 10 +++--- .../UserInfoRedactButtonViewModel-test.tsx | 2 +- .../KeyStoragePanelViewModel-test.ts | 10 +++--- .../InitialCryptoSetupDialog-test.tsx | 2 +- .../views/messages/MBeaconBody-test.tsx | 4 +-- .../views/messages/MLocationBody-test.tsx | 2 +- .../components/views/rooms/EventTile-test.tsx | 8 ++--- .../views/settings/Notifications-test.tsx | 8 ++--- .../settings/UserProfileSettings-test.tsx | 13 ++++--- .../user/EncryptionUserSettingsTab-test.tsx | 4 +-- .../user/PreferencesUserSettingsTab-test.tsx | 6 ++-- .../user/SecurityUserSettingsTab-test.tsx | 2 +- .../SpaceSettingsVisibilityTab-test.tsx | 4 +-- .../hooks/useNotificationSettings-test.tsx | 2 +- apps/web/test/unit-tests/models/Call-test.ts | 2 +- .../unit-tests/stores/OwnBeaconStore-test.ts | 6 ++-- .../widgets/ElementWidgetDriver-test.ts | 6 ++-- .../WidgetContextMenuViewModel-test.tsx | 2 +- 41 files changed, 100 insertions(+), 107 deletions(-) diff --git a/apps/desktop/src/ipc.ts b/apps/desktop/src/ipc.ts index 047b2199e1b..229a525662b 100644 --- a/apps/desktop/src/ipc.ts +++ b/apps/desktop/src/ipc.ts @@ -144,7 +144,7 @@ ipcMain.on("ipcCall", async function (_ev: IpcMainEvent, payload) { })); break; case "callDisplayMediaCallback": - await getDisplayMediaCallback()?.({ video: args[0] }); + getDisplayMediaCallback()?.({ video: args[0] }); setDisplayMediaCallback(null); ret = null; break; diff --git a/apps/web/playwright/e2e/modules/custom-component.spec.ts b/apps/web/playwright/e2e/modules/custom-component.spec.ts index 32615ea6b1e..568e01963a4 100644 --- a/apps/web/playwright/e2e/modules/custom-component.spec.ts +++ b/apps/web/playwright/e2e/modules/custom-component.spec.ts @@ -52,7 +52,7 @@ test.describe("Custom Component API", () => { async ({ page, room, app }) => { await app.viewRoomById(room.roomId); await app.client.sendMessage(room.roomId, "Simple message"); - await expect(await page.locator(".mx_EventTile_last")).toMatchScreenshot( + await expect(page.locator(".mx_EventTile_last")).toMatchScreenshot( "custom-component-tile.png", screenshotOptions(page), ); @@ -64,7 +64,7 @@ test.describe("Custom Component API", () => { async ({ page, room, app }) => { await app.viewRoomById(room.roomId); await app.client.sendMessage(room.roomId, "Fall through here"); - await expect(await page.locator(".mx_EventTile_last")).toMatchScreenshot( + await expect(page.locator(".mx_EventTile_last")).toMatchScreenshot( "custom-component-tile-fall-through.png", screenshotOptions(page), ); @@ -76,7 +76,7 @@ test.describe("Custom Component API", () => { async ({ page, room, app }) => { await app.viewRoomById(room.roomId); await app.client.sendMessage(room.roomId, "Do not replace me"); - await expect(await page.locator(".mx_EventTile_last")).toMatchScreenshot( + await expect(page.locator(".mx_EventTile_last")).toMatchScreenshot( "custom-component-tile-original.png", screenshotOptions(page), ); @@ -87,7 +87,7 @@ test.describe("Custom Component API", () => { await app.client.sendMessage(room.roomId, "Do not show edits"); await page.getByText("Do not show edits").hover(); await expect( - await page.getByRole("toolbar", { name: "Message Actions" }).getByRole("button", { name: "Edit" }), + page.getByRole("toolbar", { name: "Message Actions" }).getByRole("button", { name: "Edit" }), ).not.toBeVisible(); }); test("should disallow downloading media when the allowDownloading hint is set to false", async ({ @@ -148,7 +148,7 @@ test.describe("Custom Component API", () => { async ({ page, room, app }) => { await app.viewRoomById(room.roomId); await app.client.sendMessage(room.roomId, "Crash the filter!"); - await expect(await page.locator(".mx_EventTile_last")).toMatchScreenshot( + await expect(page.locator(".mx_EventTile_last")).toMatchScreenshot( "custom-component-crash-handle-filter.png", screenshotOptions(page), ); @@ -160,7 +160,7 @@ test.describe("Custom Component API", () => { async ({ page, room, app }) => { await app.viewRoomById(room.roomId); await app.client.sendMessage(room.roomId, "Crash the renderer!"); - await expect(await page.locator(".mx_EventTile_last")).toMatchScreenshot( + await expect(page.locator(".mx_EventTile_last")).toMatchScreenshot( "custom-component-crash-handle-renderer.png", screenshotOptions(page), ); diff --git a/apps/web/playwright/e2e/read-receipts/reactions-in-threads.spec.ts b/apps/web/playwright/e2e/read-receipts/reactions-in-threads.spec.ts index b2cd2e554aa..5073b78e4a9 100644 --- a/apps/web/playwright/e2e/read-receipts/reactions-in-threads.spec.ts +++ b/apps/web/playwright/e2e/read-receipts/reactions-in-threads.spec.ts @@ -193,7 +193,7 @@ test.describe("Read receipts", { tag: "@mergequeue" }, () => { await page.getByRole("button", { name: "React" }).click(); await page.locator(".mx_EmojiPicker_body").getByText("😀").first().click(); await page.locator(".mx_ThreadPanel").getByLabel("Mae reacted with 😀").click(); - await expect(await page.locator(".mx_ThreadPanel").getByLabel("Mae reacted with 😀")).not.toBeVisible(); + await expect(page.locator(".mx_ThreadPanel").getByLabel("Mae reacted with 😀")).not.toBeVisible(); }); }); }); diff --git a/apps/web/playwright/e2e/right-panel/right-panel.spec.ts b/apps/web/playwright/e2e/right-panel/right-panel.spec.ts index 6a6aba8fd57..fade4afdd22 100644 --- a/apps/web/playwright/e2e/right-panel/right-panel.spec.ts +++ b/apps/web/playwright/e2e/right-panel/right-panel.spec.ts @@ -75,7 +75,7 @@ test.describe("RightPanel", () => { test("should have padding under leave room", { tag: "@screenshot" }, async ({ page, app }) => { await viewRoomSummaryByName(page, app, ROOM_NAME); - const leaveButton = await page.getByRole("menuitem", { name: "Leave Room" }); + const leaveButton = page.getByRole("menuitem", { name: "Leave Room" }); await leaveButton.scrollIntoViewIfNeeded(); await expect(page.locator(".mx_RightPanel")).toMatchScreenshot("with-leave-room.png"); @@ -177,7 +177,7 @@ test.describe("RightPanel", () => { await viewRoomSummaryByName(page, app, ROOM_NAME); await page.getByRole("menuitem", { name: "Report room" }).click(); - const dialog = await page.getByRole("dialog", { name: "Report Room" }); + const dialog = page.getByRole("dialog", { name: "Report Room" }); await dialog.getByLabel("reason").fill("This room should be reported"); await expect(dialog).toMatchScreenshot("room-report-dialog.png"); await dialog.getByRole("button", { name: "Send report" }).click(); @@ -189,7 +189,7 @@ test.describe("RightPanel", () => { await viewRoomSummaryByName(page, app, ROOM_NAME); await page.getByRole("menuitem", { name: "Report room" }).click(); - const dialog = await page.getByRole("dialog", { name: "Report room" }); + const dialog = page.getByRole("dialog", { name: "Report room" }); await dialog.getByRole("switch", { name: "Leave room" }).click(); await dialog.getByLabel("reason").fill("This room should be reported"); await dialog.getByRole("button", { name: "Send report" }).click(); diff --git a/apps/web/playwright/e2e/settings/room-settings/roles-permissions-room-settings-tab.spec.ts b/apps/web/playwright/e2e/settings/room-settings/roles-permissions-room-settings-tab.spec.ts index c646e613c44..89709c5207e 100644 --- a/apps/web/playwright/e2e/settings/room-settings/roles-permissions-room-settings-tab.spec.ts +++ b/apps/web/playwright/e2e/settings/room-settings/roles-permissions-room-settings-tab.spec.ts @@ -38,7 +38,7 @@ test.describe("Roles & Permissions room settings tab", () => { await combobox.selectOption("Moderator"); // Should display a modal to warn that we are demoting the only admin user - const modal = await page.locator(".mx_Dialog", { + const modal = page.locator(".mx_Dialog", { hasText: "Warning", }); await expect(modal).toBeVisible(); diff --git a/apps/web/playwright/e2e/settings/room-settings/room-security-tab.spec.ts b/apps/web/playwright/e2e/settings/room-settings/room-security-tab.spec.ts index 4a00bae29f1..82a6d5df0c1 100644 --- a/apps/web/playwright/e2e/settings/room-settings/room-security-tab.spec.ts +++ b/apps/web/playwright/e2e/settings/room-settings/room-security-tab.spec.ts @@ -126,7 +126,7 @@ test.describe("Roles & Permissions room settings tab", () => { // Element should have automatically set the room to "sharing" history visibility const errorDialog = page.getByRole("heading", { name: "Cannot make room private" }); await expect(errorDialog).toBeVisible(); - await errorDialog.getByLabel("OK"); + errorDialog.getByLabel("OK"); await expect(settingsGroupHistory.getByText("Anyone")).toBeChecked(); }, ); diff --git a/apps/web/playwright/e2e/share-dialog/share-by-url.spec.ts b/apps/web/playwright/e2e/share-dialog/share-by-url.spec.ts index 49024d79d94..909b4c9c723 100644 --- a/apps/web/playwright/e2e/share-dialog/share-by-url.spec.ts +++ b/apps/web/playwright/e2e/share-dialog/share-by-url.spec.ts @@ -30,6 +30,6 @@ test.describe("share from URL", () => { const lastMessage = page.locator(".mx_RoomView_MessageList .mx_EventTile_last"); await expect(lastMessage).toBeVisible(); const lastMessageText = await lastMessage.locator(".mx_EventTile_body").innerText(); - await expect(lastMessageText).toBe("Hello world"); + expect(lastMessageText).toBe("Hello world"); }); }); diff --git a/apps/web/playwright/e2e/voip/element-call.spec.ts b/apps/web/playwright/e2e/voip/element-call.spec.ts index c90ae306f3e..4d96b5a14a1 100644 --- a/apps/web/playwright/e2e/voip/element-call.spec.ts +++ b/apps/web/playwright/e2e/voip/element-call.spec.ts @@ -161,7 +161,7 @@ test.describe("Element Call", () => { await page.getByRole("menuitem", { name: "Element Call" }).click(); const frameUrlStr = await page.locator("iframe").getAttribute("src"); - await expect(frameUrlStr).toBeDefined(); + expect(frameUrlStr).toBeDefined(); // Ensure we set the correct parameters for ECall. const url = new URL(frameUrlStr); const hash = new URLSearchParams(url.hash.slice(1)); @@ -187,7 +187,7 @@ test.describe("Element Call", () => { await page.keyboard.up("Shift"); const frameUrlStr = await page.locator("iframe").getAttribute("src"); - await expect(frameUrlStr).toBeDefined(); + expect(frameUrlStr).toBeDefined(); const url = new URL(frameUrlStr); const hash = new URLSearchParams(url.hash.slice(1)); assertCommonCallParameters(url.searchParams, hash, user, room); @@ -212,7 +212,7 @@ test.describe("Element Call", () => { // And test joining await button.click(); const frameUrlStr = await page.locator("iframe").getAttribute("src"); - await expect(frameUrlStr).toBeDefined(); + expect(frameUrlStr).toBeDefined(); const url = new URL(frameUrlStr); const hash = new URLSearchParams(url.hash.slice(1)); assertCommonCallParameters(url.searchParams, hash, user, room); @@ -262,7 +262,7 @@ test.describe("Element Call", () => { // And test joining await button.click(); const frameUrlStr = await page.locator("iframe").getAttribute("src"); - await expect(frameUrlStr).toBeDefined(); + expect(frameUrlStr).toBeDefined(); const url = new URL(frameUrlStr); const hash = new URLSearchParams(url.hash.slice(1)); assertCommonCallParameters(url.searchParams, hash, user, room); @@ -291,7 +291,7 @@ test.describe("Element Call", () => { // And test joining await button.click(); const frameUrlStr = await page.locator("iframe").getAttribute("src"); - await expect(frameUrlStr).toBeDefined(); + expect(frameUrlStr).toBeDefined(); const url = new URL(frameUrlStr); const hash = new URLSearchParams(url.hash.slice(1)); assertCommonCallParameters(url.searchParams, hash, user, room); @@ -325,7 +325,7 @@ test.describe("Element Call", () => { await page.getByRole("menuitem", { name: "Element Call" }).click(); const frameUrlStr = await page.locator("iframe").getAttribute("src"); - await expect(frameUrlStr).toBeDefined(); + expect(frameUrlStr).toBeDefined(); const url = new URL(frameUrlStr); const hash = new URLSearchParams(url.hash.slice(1)); assertCommonCallParameters(url.searchParams, hash, user, room); @@ -343,7 +343,7 @@ test.describe("Element Call", () => { await page.keyboard.up("Shift"); const frameUrlStr = await page.locator("iframe").getAttribute("src"); - await expect(frameUrlStr).toBeDefined(); + expect(frameUrlStr).toBeDefined(); const url = new URL(frameUrlStr); const hash = new URLSearchParams(url.hash.slice(1)); assertCommonCallParameters(url.searchParams, hash, user, room); @@ -359,7 +359,7 @@ test.describe("Element Call", () => { await page.getByRole("menuitem", { name: "Element Call" }).click(); const frameUrlStr = await page.locator("iframe").getAttribute("src"); - await expect(frameUrlStr).toBeDefined(); + expect(frameUrlStr).toBeDefined(); // The call should be presented in the picture-in-picture container, right in the room we started it // from, rather than taking over the room view. @@ -377,7 +377,7 @@ test.describe("Element Call", () => { // And test joining await button.click(); const frameUrlStr = await page.locator("iframe").getAttribute("src"); - await expect(frameUrlStr).toBeDefined(); + expect(frameUrlStr).toBeDefined(); const url = new URL(frameUrlStr); const hash = new URLSearchParams(url.hash.slice(1)); assertCommonCallParameters(url.searchParams, hash, user, room); @@ -417,7 +417,7 @@ test.describe("Element Call", () => { // And test joining await button.click(); const frameUrlStr = await page.locator("iframe").getAttribute("src"); - await expect(frameUrlStr).toBeDefined(); + expect(frameUrlStr).toBeDefined(); const url = new URL(frameUrlStr); const hash = new URLSearchParams(url.hash.slice(1)); assertCommonCallParameters(url.searchParams, hash, user, room); @@ -451,7 +451,7 @@ test.describe("Element Call", () => { // And test joining await button.click(); const frameUrlStr = await page.locator("iframe").getAttribute("src"); - await expect(frameUrlStr).toBeDefined(); + expect(frameUrlStr).toBeDefined(); const url = new URL(frameUrlStr); const hash = new URLSearchParams(url.hash.slice(1)); assertCommonCallParameters(url.searchParams, hash, user, room); @@ -483,7 +483,7 @@ test.describe("Element Call", () => { const roomId = new URL(page.url()).hash.slice("#/room/".length); const frameUrlStr = await page.locator("iframe").getAttribute("src"); - await expect(frameUrlStr).toBeDefined(); + expect(frameUrlStr).toBeDefined(); // Ensure we set the correct parameters for ECall. const url = new URL(frameUrlStr); const hash = new URLSearchParams(url.hash.slice(1)); @@ -526,7 +526,7 @@ test.describe("Element Call", () => { await expect(callFrame.getByText("In call", { exact: true })).toBeVisible(); // Wait for Element Web to pickup the RTC session and update the room list entry. - await expect(await page.getByTestId("notification-decoration")).toBeVisible(); + await expect(page.getByTestId("notification-decoration")).toBeVisible(); } test("should be able to switch rooms and have the call persist", async ({ page, user, room, app }) => { @@ -566,9 +566,9 @@ test.describe("Element Call", () => { await expect(pipContainer).not.toBeVisible(); // Wait for call to stop. - await expect(await page.getByTestId("notification-decoration")).not.toBeVisible(); + await expect(page.getByTestId("notification-decoration")).not.toBeVisible(); await app.viewRoomById(room.roomId); - await expect(await page.getByTestId("join-call-button")).not.toBeVisible(); + await expect(page.getByTestId("join-call-button")).not.toBeVisible(); // Join the call again. await openAndJoinCall(page); @@ -598,8 +598,8 @@ test.describe("Element Call", () => { await expect(pipContainer).not.toBeVisible(); // Wait for call to stop. - await expect(await page.getByTestId("notification-decoration")).not.toBeVisible(); - await expect(await page.getByTestId("join-call-button")).not.toBeVisible(); + await expect(page.getByTestId("notification-decoration")).not.toBeVisible(); + await expect(page.getByTestId("join-call-button")).not.toBeVisible(); // Join the call again, but from the other room. await openAndJoinCall(page); diff --git a/apps/web/src/PosthogAnalytics.test.ts b/apps/web/src/PosthogAnalytics.test.ts index a70c91bbee8..561d3735c90 100644 --- a/apps/web/src/PosthogAnalytics.test.ts +++ b/apps/web/src/PosthogAnalytics.test.ts @@ -127,7 +127,7 @@ describe("PosthogAnalytics", () => { it("Should not track events if anonymous", async () => { analytics.setAnonymity(Anonymity.Anonymous); - await analytics.trackEvent({ + analytics.trackEvent({ eventName: "TestEvents", foo: "bar", }); diff --git a/apps/web/src/SlidingSyncManager.ts b/apps/web/src/SlidingSyncManager.ts index 3c1cc986199..e92bf83fa0a 100644 --- a/apps/web/src/SlidingSyncManager.ts +++ b/apps/web/src/SlidingSyncManager.ts @@ -253,9 +253,9 @@ export class SlidingSyncManager { try { // if we only have range changes then call a different function so we don't nuke the list from before if (updateArgs.ranges && Object.keys(updateArgs).length === 1) { - await this.slidingSync!.setListRanges(listKey, updateArgs.ranges); + this.slidingSync!.setListRanges(listKey, updateArgs.ranges); } else { - await this.slidingSync!.setList(listKey, list); + this.slidingSync!.setList(listKey, list); } } catch (err) { logger.debug("ensureListRegistered: update failed txn_id=", err); diff --git a/apps/web/src/audio/VoiceRecording.ts b/apps/web/src/audio/VoiceRecording.ts index 44a016b9957..ea8ca96e4ef 100644 --- a/apps/web/src/audio/VoiceRecording.ts +++ b/apps/web/src/audio/VoiceRecording.ts @@ -299,7 +299,7 @@ export class VoiceRecording extends EventEmitter implements IDestroyable { // Finally do our post-processing and clean up this.recording = false; - await this.recorder!.close(); + this.recorder!.close(); this.emit(RecordingState.Ended); }); } diff --git a/apps/web/src/components/views/settings/encryption/DeleteKeyStoragePanel.tsx b/apps/web/src/components/views/settings/encryption/DeleteKeyStoragePanel.tsx index d4f80d7eeef..3677c93b909 100644 --- a/apps/web/src/components/views/settings/encryption/DeleteKeyStoragePanel.tsx +++ b/apps/web/src/components/views/settings/encryption/DeleteKeyStoragePanel.tsx @@ -34,7 +34,7 @@ export function DeleteKeyStoragePanel({ onFinish }: Props): JSX.Element { const onDeleteClick = useCallback(async () => { setBusy(true); try { - await setEnabled(false); + setEnabled(false); } finally { setBusy(false); } diff --git a/apps/web/src/components/views/voip/AudioFeed.tsx b/apps/web/src/components/views/voip/AudioFeed.tsx index 834318f41ad..f8d28c54498 100644 --- a/apps/web/src/components/views/voip/AudioFeed.tsx +++ b/apps/web/src/components/views/voip/AudioFeed.tsx @@ -80,7 +80,7 @@ export default class AudioFeed extends React.Component { // should serialise the ones that need to be serialised but then be able to interrupt // them with another load() which will cancel the pending one, but since we don't call // load() explicitly, it shouldn't be a problem. - Dave - await element.load(); + element.load(); } catch (e) { logger.info( `Failed to play media element with feed for userId ` + diff --git a/apps/web/src/stores/AsyncStore.ts b/apps/web/src/stores/AsyncStore.ts index 86a043f84a6..8d97714cf13 100644 --- a/apps/web/src/stores/AsyncStore.ts +++ b/apps/web/src/stores/AsyncStore.ts @@ -78,7 +78,7 @@ export abstract class AsyncStore extends EventEmitter { this.storeState = Object.freeze(Object.assign({}, this.storeState, newState)); this.emit(UPDATE_EVENT, this); } finally { - await this.lock.release(); + this.lock.release(); } } @@ -93,7 +93,7 @@ export abstract class AsyncStore extends EventEmitter { this.storeState = Object.freeze((newState || {})); if (!quiet) this.emit(UPDATE_EVENT, this); } finally { - await this.lock.release(); + this.lock.release(); } } diff --git a/apps/web/src/utils/local-room.ts b/apps/web/src/utils/local-room.ts index 90d25bd4c01..5d48ed116ff 100644 --- a/apps/web/src/utils/local-room.ts +++ b/apps/web/src/utils/local-room.ts @@ -124,7 +124,7 @@ export async function waitForRoomReadyAndApplyAfterCreateCallbacks( */ async function applyAfterCreateCallbacks(localRoom: LocalRoom, roomId: string): Promise { for (const afterCreateCallback of localRoom.afterCreateCallbacks) { - await afterCreateCallback(roomId); + afterCreateCallback(roomId); } localRoom.afterCreateCallbacks = []; diff --git a/apps/web/test/unit-tests/DecryptionFailureTracker-test.ts b/apps/web/test/unit-tests/DecryptionFailureTracker-test.ts index bad06a59c05..0d1504f40b1 100644 --- a/apps/web/test/unit-tests/DecryptionFailureTracker-test.ts +++ b/apps/web/test/unit-tests/DecryptionFailureTracker-test.ts @@ -634,7 +634,7 @@ describe("DecryptionFailureTracker", function () { // @ts-ignore access to private method await tracker.calculateClientProperties(client); // @ts-ignore access to private method - await tracker.registerHandlers(client); + tracker.registerHandlers(client); // use three different errors so that we can distinguish the reports const error1 = DecryptionFailureCode.MEGOLM_UNKNOWN_INBOUND_SESSION_ID; diff --git a/apps/web/test/unit-tests/DeviceListener-test.ts b/apps/web/test/unit-tests/DeviceListener-test.ts index 4aa47a80ac2..228cde7c0d1 100644 --- a/apps/web/test/unit-tests/DeviceListener-test.ts +++ b/apps/web/test/unit-tests/DeviceListener-test.ts @@ -889,7 +889,7 @@ describe("DeviceListener", () => { new Set([device3.deviceId]), ); - await instance.otherDevices?.dismissUnverifiedSessions([device3.deviceId]); + instance.otherDevices?.dismissUnverifiedSessions([device3.deviceId]); await flushPromises(); expect(BulkUnverifiedSessionsToast.hideToast).toHaveBeenCalled(); diff --git a/apps/web/test/unit-tests/LegacyCallHandler-test.ts b/apps/web/test/unit-tests/LegacyCallHandler-test.ts index 9b04a97c16a..a443fd98155 100644 --- a/apps/web/test/unit-tests/LegacyCallHandler-test.ts +++ b/apps/web/test/unit-tests/LegacyCallHandler-test.ts @@ -441,7 +441,7 @@ describe("LegacyCallHandler without third party protocols", () => { it("should allow silencing an incoming call ring", async () => { await callHandler.play(AudioID.Ring); - await callHandler.silenceCall("call123"); + callHandler.silenceCall("call123"); expect(mockAudioBufferSourceNode.stop).toHaveBeenCalled(); }); diff --git a/apps/web/test/unit-tests/components/structures/MatrixChat-test.tsx b/apps/web/test/unit-tests/components/structures/MatrixChat-test.tsx index 9b848acca23..b2bd0347e28 100644 --- a/apps/web/test/unit-tests/components/structures/MatrixChat-test.tsx +++ b/apps/web/test/unit-tests/components/structures/MatrixChat-test.tsx @@ -1323,7 +1323,7 @@ describe("", () => { describe("showScreen", () => { it("should show the 'share' screen", async () => { - await getComponent({ + getComponent({ initialScreenAfterLogin: { screen: "share", params: { msg: "Hello", format: ShareFormat.Text } }, }); diff --git a/apps/web/test/unit-tests/components/structures/RoomView-test.tsx b/apps/web/test/unit-tests/components/structures/RoomView-test.tsx index d37f128795d..d06bf937879 100644 --- a/apps/web/test/unit-tests/components/structures/RoomView-test.tsx +++ b/apps/web/test/unit-tests/components/structures/RoomView-test.tsx @@ -398,7 +398,7 @@ describe("RoomView", () => { it("handles accepting an invite", async () => { const { getByRole } = await mountRoomView(); - await fireEvent.click(getByRole("button", { name: "Accept" })); + fireEvent.click(getByRole("button", { name: "Accept" })); await untilDispatch(Action.JoinRoomReady, defaultDispatcher); }); @@ -408,7 +408,7 @@ describe("RoomView", () => { finished: Promise.resolve([true, false, false]), close: jest.fn(), }); - await fireEvent.click(getByRole("button", { name: "Decline" })); + fireEvent.click(getByRole("button", { name: "Decline" })); await waitFor(() => expect(cli.leave).toHaveBeenCalledWith(room.roomId)); expect(cli.setIgnoredUsers).not.toHaveBeenCalled(); }); @@ -464,7 +464,7 @@ describe("RoomView", () => { finished: Promise.resolve([true, false, "with a reason"]), close: jest.fn(), }); - await fireEvent.click(getByRole("button", { name: "Decline and block" })); + fireEvent.click(getByRole("button", { name: "Decline and block" })); expect(cli.leave).toHaveBeenCalledWith(room.roomId); expect(cli.reportRoom).toHaveBeenCalledWith(room.roomId, "with a reason"); }); diff --git a/apps/web/test/unit-tests/components/structures/TimelinePanel-test.tsx b/apps/web/test/unit-tests/components/structures/TimelinePanel-test.tsx index eeb1740c45c..eb14b5b7759 100644 --- a/apps/web/test/unit-tests/components/structures/TimelinePanel-test.tsx +++ b/apps/web/test/unit-tests/components/structures/TimelinePanel-test.tsx @@ -671,10 +671,8 @@ describe("TimelinePanel", () => { thread.initialEventsFetched = true; // @ts-ignore thread.fetchEditsWhereNeeded = () => Promise.resolve(); - await thread.addEvent(reply1, false, true); - await allThreads - .getLiveTimeline() - .addEvent(thread.rootEvent!, { toStartOfTimeline: true, addToState: true }); + thread.addEvent(reply1, false, true); + allThreads.getLiveTimeline().addEvent(thread.rootEvent!, { toStartOfTimeline: true, addToState: true }); const replyToEvent = jest.spyOn(thread, "replyToEvent", "get"); const dom = render( @@ -686,7 +684,7 @@ describe("TimelinePanel", () => { expect(replyToEvent).toHaveBeenCalled(); replyToEvent.mockClear(); - await thread.addEvent(reply2, false, true); + thread.addEvent(reply2, false, true); await dom.findByText("RootEvent"); await dom.findByText("ReplyEvent2"); expect(replyToEvent).toHaveBeenCalled(); @@ -708,10 +706,8 @@ describe("TimelinePanel", () => { realThread.initialEventsFetched = true; // @ts-ignore realThread.fetchEditsWhereNeeded = () => Promise.resolve(); - await realThread.addEvent(reply1, true); - await allThreads - .getLiveTimeline() - .addEvent(realThread.rootEvent!, { toStartOfTimeline: true, addToState: true }); + realThread.addEvent(reply1, true); + allThreads.getLiveTimeline().addEvent(realThread.rootEvent!, { toStartOfTimeline: true, addToState: true }); const replyToEvent = jest.spyOn(realThread, "replyToEvent", "get"); // @ts-ignore diff --git a/apps/web/test/unit-tests/components/viewmodels/right_panel/RoomSummaryCardTopicViewModel-test.tsx b/apps/web/test/unit-tests/components/viewmodels/right_panel/RoomSummaryCardTopicViewModel-test.tsx index b1db7bcb19b..13de7a49506 100644 --- a/apps/web/test/unit-tests/components/viewmodels/right_panel/RoomSummaryCardTopicViewModel-test.tsx +++ b/apps/web/test/unit-tests/components/viewmodels/right_panel/RoomSummaryCardTopicViewModel-test.tsx @@ -44,7 +44,7 @@ describe("RoomSummaryCardTopicViewModel", () => { it("should toggle expanded state on click", async () => { const { result } = render(); - await act(() => { + act(() => { result.current.onExpandedClick(mockEvent); }); diff --git a/apps/web/test/unit-tests/components/viewmodels/right_panel/RoomSummaryCardViewModel-test.tsx b/apps/web/test/unit-tests/components/viewmodels/right_panel/RoomSummaryCardViewModel-test.tsx index 193dab7d0b2..8bfd5817c72 100644 --- a/apps/web/test/unit-tests/components/viewmodels/right_panel/RoomSummaryCardViewModel-test.tsx +++ b/apps/web/test/unit-tests/components/viewmodels/right_panel/RoomSummaryCardViewModel-test.tsx @@ -161,7 +161,7 @@ describe("useRoomSummaryCardViewModel", () => { const { result } = render(); await act(async () => { - await result.current.onRoomPollHistoryClick(); + result.current.onRoomPollHistoryClick(); }); expect(createDialogSpy).toHaveBeenCalledWith(PollHistoryDialog, { room, @@ -184,7 +184,7 @@ describe("useRoomSummaryCardViewModel", () => { const { result } = render(); await act(async () => { - await result.current.onShareRoomClick(); + result.current.onShareRoomClick(); }); expect(createDialogSpy).toHaveBeenCalledWith(ShareDialog, { diff --git a/apps/web/test/unit-tests/components/viewmodels/right_panel/user_info/UserInfoPowerLevelsViewModel-test.tsx b/apps/web/test/unit-tests/components/viewmodels/right_panel/user_info/UserInfoPowerLevelsViewModel-test.tsx index d69dc127798..d824e0dc0bd 100644 --- a/apps/web/test/unit-tests/components/viewmodels/right_panel/user_info/UserInfoPowerLevelsViewModel-test.tsx +++ b/apps/web/test/unit-tests/components/viewmodels/right_panel/user_info/UserInfoPowerLevelsViewModel-test.tsx @@ -137,7 +137,7 @@ describe("UserInfoAdminPowerlevelViewModel", () => { const { result } = renderComponentHook({ ...defaultProps, room: mockRoom }, mockClient); - await result.current.onPowerChange(changedPowerLevel); + result.current.onPowerChange(changedPowerLevel); expect(mockClient.setPowerLevel).toHaveBeenCalledTimes(1); expect(mockClient.setPowerLevel).toHaveBeenCalledWith(mockRoom.roomId, defaultMember.userId, changedPowerLevel); @@ -159,7 +159,7 @@ describe("UserInfoAdminPowerlevelViewModel", () => { const { result } = renderComponentHook({ ...defaultProps, room: mockRoom }, mockClient); - await result.current.onPowerChange(changedPowerLevel); + result.current.onPowerChange(changedPowerLevel); expect(Modal.createDialog).toHaveBeenCalled(); expect(mockClient.setPowerLevel).toHaveBeenCalled(); @@ -178,7 +178,7 @@ describe("UserInfoAdminPowerlevelViewModel", () => { const { result } = renderComponentHook({ ...defaultProps, room: mockRoom, user: selfUser }, mockClient); - await result.current.onPowerChange(startPowerLevel); + result.current.onPowerChange(startPowerLevel); expect(warnSelfDemote).toHaveBeenCalled(); expect(mockClient.setPowerLevel).toHaveBeenCalled(); @@ -204,7 +204,7 @@ describe("UserInfoAdminPowerlevelViewModel", () => { const { result } = renderComponentHook({ ...defaultProps, room: mockRoom }, mockClient); - await result.current.onPowerChange(changedPowerLevel); + result.current.onPowerChange(changedPowerLevel); expect(Modal.createDialog).toHaveBeenCalled(); expect(mockClient.setPowerLevel).not.toHaveBeenCalled(); @@ -215,7 +215,7 @@ describe("UserInfoAdminPowerlevelViewModel", () => { const { result } = renderComponentHook({ ...defaultProps, room: mockRoom }, mockClient); - await result.current.onPowerChange(changedPowerLevel); + result.current.onPowerChange(changedPowerLevel); expect(mockClient.setPowerLevel).not.toHaveBeenCalled(); }); diff --git a/apps/web/test/unit-tests/components/viewmodels/right_panel/user_info/admin/UserInfoRedactButtonViewModel-test.tsx b/apps/web/test/unit-tests/components/viewmodels/right_panel/user_info/admin/UserInfoRedactButtonViewModel-test.tsx index cb3187a82c4..8073c9fc85c 100644 --- a/apps/web/test/unit-tests/components/viewmodels/right_panel/user_info/admin/UserInfoRedactButtonViewModel-test.tsx +++ b/apps/web/test/unit-tests/components/viewmodels/right_panel/user_info/admin/UserInfoRedactButtonViewModel-test.tsx @@ -88,7 +88,7 @@ describe("useRedactMessagesButtonViewModel", () => { ); const { result } = renderRedactButtonHook(); - await result.current.onRedactAllMessagesClick(); + result.current.onRedactAllMessagesClick(); expect(spy).toHaveBeenCalledWith( BulkRedactDialog, diff --git a/apps/web/test/unit-tests/components/viewmodels/settings/encryption/KeyStoragePanelViewModel-test.ts b/apps/web/test/unit-tests/components/viewmodels/settings/encryption/KeyStoragePanelViewModel-test.ts index dc1faec9855..47177e266d0 100644 --- a/apps/web/test/unit-tests/components/viewmodels/settings/encryption/KeyStoragePanelViewModel-test.ts +++ b/apps/web/test/unit-tests/components/viewmodels/settings/encryption/KeyStoragePanelViewModel-test.ts @@ -63,7 +63,7 @@ describe("KeyStoragePanelViewModel", () => { withClientContextRenderOptions(matrixClient), ); - await result.current.setEnabled(true); + result.current.setEnabled(true); expect(mocked(matrixClient.getCrypto()!.resetKeyBackup)).toHaveBeenCalled(); }); @@ -88,7 +88,7 @@ describe("KeyStoragePanelViewModel", () => { withClientContextRenderOptions(matrixClient), ); - await result.current.setEnabled(true); + result.current.setEnabled(true); expect(mocked(matrixClient.getCrypto()!.resetKeyBackup)).not.toHaveBeenCalled(); }); @@ -112,7 +112,7 @@ describe("KeyStoragePanelViewModel", () => { withClientContextRenderOptions(matrixClient), ); - await result.current.setEnabled(true); + result.current.setEnabled(true); expect(mocked(matrixClient.getCrypto()!.resetKeyBackup)).toHaveBeenCalled(); }); @@ -124,7 +124,7 @@ describe("KeyStoragePanelViewModel", () => { withClientContextRenderOptions(matrixClient), ); - await result.current.setEnabled(true); + result.current.setEnabled(true); expect(mocked(matrixClient.setAccountData)).toHaveBeenCalledWith("m.org.matrix.custom.backup_disabled", { disabled: false, }); @@ -143,7 +143,7 @@ describe("KeyStoragePanelViewModel", () => { withClientContextRenderOptions(matrixClient), ); - await result.current.setEnabled(false); + result.current.setEnabled(false); expect(mocked(matrixClient.getCrypto()!.disableKeyStorage)).toHaveBeenCalled(); expect(mocked(matrixClient.setAccountData)).toHaveBeenCalledWith("m.org.matrix.custom.backup_disabled", { diff --git a/apps/web/test/unit-tests/components/views/dialogs/security/InitialCryptoSetupDialog-test.tsx b/apps/web/test/unit-tests/components/views/dialogs/security/InitialCryptoSetupDialog-test.tsx index 5a3bdd83c6a..6efb278863e 100644 --- a/apps/web/test/unit-tests/components/views/dialogs/security/InitialCryptoSetupDialog-test.tsx +++ b/apps/web/test/unit-tests/components/views/dialogs/security/InitialCryptoSetupDialog-test.tsx @@ -43,7 +43,7 @@ describe("InitialCryptoSetupDialog", () => { render(); - await expect(await screen.findByRole("button", { name: "Retry" })).toBeInTheDocument(); + await expect(screen.findByRole("button", { name: "Retry" })).resolves.toBeInTheDocument(); }); it("calls retry when retry button pressed", async () => { diff --git a/apps/web/test/unit-tests/components/views/messages/MBeaconBody-test.tsx b/apps/web/test/unit-tests/components/views/messages/MBeaconBody-test.tsx index e0b6481307b..5bb5b439640 100644 --- a/apps/web/test/unit-tests/components/views/messages/MBeaconBody-test.tsx +++ b/apps/web/test/unit-tests/components/views/messages/MBeaconBody-test.tsx @@ -343,7 +343,7 @@ describe("", () => { const { beaconInfoEvent } = makeEvents(); // no locations const room = setupRoomWithBeacon(beaconInfoEvent, []); - const getRelationsForEvent = await mockGetRelationsForEvent(); + const getRelationsForEvent = mockGetRelationsForEvent(); getComponent({ mxEvent: beaconInfoEvent, getRelationsForEvent }); @@ -363,7 +363,7 @@ describe("", () => { const { beaconInfoEvent, location1, location2 } = makeEvents(); const room = setupRoomWithBeacon(beaconInfoEvent, [location1, location2]); - const getRelationsForEvent = await mockGetRelationsForEvent([location1, location2]); + const getRelationsForEvent = mockGetRelationsForEvent([location1, location2]); getComponent({ mxEvent: beaconInfoEvent, getRelationsForEvent }); diff --git a/apps/web/test/unit-tests/components/views/messages/MLocationBody-test.tsx b/apps/web/test/unit-tests/components/views/messages/MLocationBody-test.tsx index 35681700ca2..e02a29f34a9 100644 --- a/apps/web/test/unit-tests/components/views/messages/MLocationBody-test.tsx +++ b/apps/web/test/unit-tests/components/views/messages/MLocationBody-test.tsx @@ -141,7 +141,7 @@ describe("MLocationBody", () => { .mockReturnValue({ finished: new Promise(() => {}), close: jest.fn() }); const component = getComponent(); - await fireEvent.click(component.container.querySelector(".mx_Map")!); + fireEvent.click(component.container.querySelector(".mx_Map")!); expect(modalSpy).toHaveBeenCalled(); }); diff --git a/apps/web/test/unit-tests/components/views/rooms/EventTile-test.tsx b/apps/web/test/unit-tests/components/views/rooms/EventTile-test.tsx index f7ea551ecd7..86439993a18 100644 --- a/apps/web/test/unit-tests/components/views/rooms/EventTile-test.tsx +++ b/apps/web/test/unit-tests/components/views/rooms/EventTile-test.tsx @@ -1374,10 +1374,9 @@ describe("EventTile", () => { shieldReason: EventShieldReason.UNSIGNED_DEVICE, } as EventEncryptionInfo); - await act(async () => { + act(() => { mxEvent.makeReplaced(replacementEvent); rerender(); - await flushPromises; }); // check it was updated @@ -1412,17 +1411,16 @@ describe("EventTile", () => { expect(container.getElementsByClassName("mx_EventTile_e2eIcon")).toHaveLength(0); // then we replace the event with an unencrypted one - const replacementEvent = await mkMessage({ + const replacementEvent = mkMessage({ msg: "msg2", user: "@alice:example.org", room: room.roomId, event: true, }); - await act(async () => { + act(() => { mxEvent.makeReplaced(replacementEvent); rerender(); - await flushPromises; }); // check it was updated diff --git a/apps/web/test/unit-tests/components/views/settings/Notifications-test.tsx b/apps/web/test/unit-tests/components/views/settings/Notifications-test.tsx index 864ca485fa7..45bf8cbe6c7 100644 --- a/apps/web/test/unit-tests/components/views/settings/Notifications-test.tsx +++ b/apps/web/test/unit-tests/components/views/settings/Notifications-test.tsx @@ -536,7 +536,7 @@ describe("", () => { // oneToOneRule is set to 'on' // and is kind: 'underride' const offToggle = screen.getByTestId(section + oneToOneRule.rule_id).querySelector('input[type="radio"]')!; - await act(() => { + act(() => { fireEvent.click(offToggle); }); @@ -563,7 +563,7 @@ describe("", () => { // oneToOneRule is set to 'on' // and is kind: 'underride' const offToggle = screen.getByTestId(section + oneToOneRule.rule_id).querySelector('input[type="radio"]')!; - await act(() => { + act(() => { fireEvent.click(offToggle); }); @@ -729,7 +729,7 @@ describe("", () => { mockClient.setPushRuleActions.mockRejectedValue("oups"); const offToggle = oneToOneRuleElement.querySelector('input[type="radio"]')!; - await act(() => { + act(() => { fireEvent.click(offToggle); }); @@ -829,7 +829,7 @@ describe("", () => { mockClient.setPushRuleEnabled.mockRejectedValueOnce("oups"); - await act(() => { + act(() => { fireEvent.click(within(screen.getByTestId(section + keywordsRuleId)).getByLabelText("Off")); }); diff --git a/apps/web/test/unit-tests/components/views/settings/UserProfileSettings-test.tsx b/apps/web/test/unit-tests/components/views/settings/UserProfileSettings-test.tsx index eea092d7f5b..e54751d2439 100644 --- a/apps/web/test/unit-tests/components/views/settings/UserProfileSettings-test.tsx +++ b/apps/web/test/unit-tests/components/views/settings/UserProfileSettings-test.tsx @@ -115,8 +115,8 @@ describe("ProfileSettings", () => { mocked(client).uploadContent.mockResolvedValue({ content_uri: returnedMxcUri }); const fileSentinel = {}; - await act(async () => { - await changeAvatarFn(fileSentinel as File); + act(() => { + changeAvatarFn(fileSentinel as File); }); expect(client.uploadContent).toHaveBeenCalledWith(fileSentinel); @@ -139,8 +139,8 @@ describe("ProfileSettings", () => { mocked(client).uploadContent.mockReturnValue(uploadPromise); const fileSentinel = {}; - const changeAvatarActPromise = act(async () => { - await changeAvatarFn(fileSentinel as File); + act(() => { + changeAvatarFn(fileSentinel as File); }); expect(toastRack.displayToast).toHaveBeenCalled(); @@ -148,7 +148,6 @@ describe("ProfileSettings", () => { act(() => { resolveUploadPromise({ content_uri: "bloop" }); }); - await changeAvatarActPromise; expect(clearToastFn).toHaveBeenCalled(); }); @@ -167,8 +166,8 @@ describe("ProfileSettings", () => { } as ChangeEvent); }); - await act(async () => { - await editInPlaceOnSave(); + act(() => { + editInPlaceOnSave(); }); expect(client.setDisplayName).toHaveBeenCalledWith("The Value"); diff --git a/apps/web/test/unit-tests/components/views/settings/tabs/user/EncryptionUserSettingsTab-test.tsx b/apps/web/test/unit-tests/components/views/settings/tabs/user/EncryptionUserSettingsTab-test.tsx index 09defcd5159..1a8317cba47 100644 --- a/apps/web/test/unit-tests/components/views/settings/tabs/user/EncryptionUserSettingsTab-test.tsx +++ b/apps/web/test/unit-tests/components/views/settings/tabs/user/EncryptionUserSettingsTab-test.tsx @@ -78,7 +78,7 @@ describe("", () => { jest.spyOn(matrixClient.getCrypto()!, "getKeyBackupInfo").mockResolvedValue(null); jest.spyOn(matrixClient.getCrypto()!, "getActiveSessionBackupVersion").mockResolvedValue(null); renderComponent(); - await expect(screen.queryByText("Recovery")).not.toBeInTheDocument(); + expect(screen.queryByText("Recovery")).not.toBeInTheDocument(); }); it("should display the recovery out of sync panel when secrets are not cached", async () => { @@ -173,7 +173,7 @@ describe("", () => { renderComponent(); - await expect(await screen.findByRole("heading", { name: "Backup" })).toBeVisible(); + await expect(screen.findByRole("heading", { name: "Backup" })).resolves.toBeVisible(); jest.spyOn(matrixClient.getCrypto()!, "getActiveSessionBackupVersion").mockResolvedValue(null); diff --git a/apps/web/test/unit-tests/components/views/settings/tabs/user/PreferencesUserSettingsTab-test.tsx b/apps/web/test/unit-tests/components/views/settings/tabs/user/PreferencesUserSettingsTab-test.tsx index 1cd548e4ea7..66eece96e0e 100644 --- a/apps/web/test/unit-tests/components/views/settings/tabs/user/PreferencesUserSettingsTab-test.tsx +++ b/apps/web/test/unit-tests/components/views/settings/tabs/user/PreferencesUserSettingsTab-test.tsx @@ -66,19 +66,19 @@ describe("PreferencesUserSettingsTab", () => { await userEvent.click(timezoneDropdown); // Without filtering `expect(screen.queryByRole("option" ...` take over 1s. - await fireEvent.change(screen.getByRole("combobox", { name: "Set timezone" }), { + fireEvent.change(screen.getByRole("combobox", { name: "Set timezone" }), { target: { value: "Africa/Abidjan" }, }); expect(screen.queryByRole("option", { name: "Africa/Abidjan" })).toBeInTheDocument(); expect(screen.queryByRole("option", { name: "Europe/Paris" })).not.toBeInTheDocument(); - await fireEvent.change(screen.getByRole("combobox", { name: "Set timezone" }), { + fireEvent.change(screen.getByRole("combobox", { name: "Set timezone" }), { target: { value: "Europe/Paris" }, }); expect(screen.queryByRole("option", { name: "Africa/Abidjan" })).not.toBeInTheDocument(); - const option = await screen.getByRole("option", { name: "Europe/Paris" }); + const option = screen.getByRole("option", { name: "Europe/Paris" }); await userEvent.click(option); expect(await screen.findByText("Europe/Paris")).toBeInTheDocument(); diff --git a/apps/web/test/unit-tests/components/views/settings/tabs/user/SecurityUserSettingsTab-test.tsx b/apps/web/test/unit-tests/components/views/settings/tabs/user/SecurityUserSettingsTab-test.tsx index b46531773a6..821628b6f47 100644 --- a/apps/web/test/unit-tests/components/views/settings/tabs/user/SecurityUserSettingsTab-test.tsx +++ b/apps/web/test/unit-tests/components/views/settings/tabs/user/SecurityUserSettingsTab-test.tsx @@ -77,7 +77,7 @@ describe("", () => { const { getByText, getByRole } = render(getComponent()); await userEvent.click(getByRole("button", { name: "Unignore" })); expect(setIgnoredUsers).toHaveBeenCalledWith([]); - await act(() => { + act(() => { getIgnoredUsers.mockReturnValue([]); defaultDispatcher.dispatch( { diff --git a/apps/web/test/unit-tests/components/views/spaces/SpaceSettingsVisibilityTab-test.tsx b/apps/web/test/unit-tests/components/views/spaces/SpaceSettingsVisibilityTab-test.tsx index d59d1d66b38..5639621be43 100644 --- a/apps/web/test/unit-tests/components/views/spaces/SpaceSettingsVisibilityTab-test.tsx +++ b/apps/web/test/unit-tests/components/views/spaces/SpaceSettingsVisibilityTab-test.tsx @@ -174,7 +174,7 @@ describe("", () => { (mockMatrixClient.sendStateEvent as jest.Mock).mockRejectedValue({}); const component = getComponent({ space }); await toggleGuestAccessSection(component); - await act(() => { + act(() => { fireEvent.click(getGuestAccessToggle(component)!); }); @@ -224,7 +224,7 @@ describe("", () => { (mockMatrixClient.sendStateEvent as jest.Mock).mockRejectedValue({}); const component = getComponent({ space }); - await act(() => { + act(() => { fireEvent.click(getHistoryVisibilityToggle(component)!); }); diff --git a/apps/web/test/unit-tests/hooks/useNotificationSettings-test.tsx b/apps/web/test/unit-tests/hooks/useNotificationSettings-test.tsx index f8d2047e9b2..41f6117c2a2 100644 --- a/apps/web/test/unit-tests/hooks/useNotificationSettings-test.tsx +++ b/apps/web/test/unit-tests/hooks/useNotificationSettings-test.tsx @@ -79,7 +79,7 @@ describe("useNotificationSettings", () => { expect(result.current.model).toEqual(null); await waitFor(() => expect(result.current.model).toEqual(expectedModel)); expect(result.current.hasPendingChanges).toBeFalsy(); - await result.current.reconcile(DefaultNotificationSettings); + result.current.reconcile(DefaultNotificationSettings); await waitFor(() => expect(result.current.hasPendingChanges).toBeFalsy()); expect(addPushRule).toHaveBeenCalledTimes(0); expect(deletePushRule).toHaveBeenCalledTimes(9); diff --git a/apps/web/test/unit-tests/models/Call-test.ts b/apps/web/test/unit-tests/models/Call-test.ts index ba3b264b540..8a5ee3a1ad1 100644 --- a/apps/web/test/unit-tests/models/Call-test.ts +++ b/apps/web/test/unit-tests/models/Call-test.ts @@ -536,7 +536,7 @@ describe("ElementCall", () => { ? originalGetValue(name, roomId, excludeDefault) : originalGetValue(name, roomId, excludeDefault); }; - await ElementCall.create(room); + ElementCall.create(room); const call = ElementCall.get(room); expect(call?.widget.url.startsWith("https://call.element.dev/")).toBeTruthy(); SettingsStore.getValue = originalGetValue; diff --git a/apps/web/test/unit-tests/stores/OwnBeaconStore-test.ts b/apps/web/test/unit-tests/stores/OwnBeaconStore-test.ts index 04e00e00a0f..f3b5e02218a 100644 --- a/apps/web/test/unit-tests/stores/OwnBeaconStore-test.ts +++ b/apps/web/test/unit-tests/stores/OwnBeaconStore-test.ts @@ -443,7 +443,7 @@ describe("OwnBeaconStore", () => { expect(store.hasLiveBeacons()).toBe(true); const emitSpy = jest.spyOn(store, "emit"); - await expireBeaconAndEmit(store, alicesRoom1BeaconInfo); + expireBeaconAndEmit(store, alicesRoom1BeaconInfo); expect(store.hasLiveBeacons()).toBe(false); expect(store.hasLiveBeacons(room1Id)).toBe(false); @@ -455,7 +455,7 @@ describe("OwnBeaconStore", () => { const store = await makeOwnBeaconStore(); const prevEventContent = alicesRoom1BeaconInfo.getContent(); - await expireBeaconAndEmit(store, alicesRoom1BeaconInfo); + expireBeaconAndEmit(store, alicesRoom1BeaconInfo); // matches original state of event content // except for live property @@ -771,7 +771,7 @@ describe("OwnBeaconStore", () => { // expire the beacon // user now has no live beacons - await expireBeaconAndEmit(store, alicesRoom1BeaconInfo); + expireBeaconAndEmit(store, alicesRoom1BeaconInfo); // stop watching location expect(geolocation.clearWatch).toHaveBeenCalled(); diff --git a/apps/web/test/unit-tests/stores/widgets/ElementWidgetDriver-test.ts b/apps/web/test/unit-tests/stores/widgets/ElementWidgetDriver-test.ts index e7d8af86e31..172d009699b 100644 --- a/apps/web/test/unit-tests/stores/widgets/ElementWidgetDriver-test.ts +++ b/apps/web/test/unit-tests/stores/widgets/ElementWidgetDriver-test.ts @@ -180,7 +180,7 @@ describe("ElementWidgetDriver", () => { const listener = jest.fn(); const observer = new SimpleObservable(); observer.onUpdate(listener); - await driver.askOpenID(observer); + driver.askOpenID(observer); const openIdUpdate: IOpenIDUpdate = { state: OpenIDRequestState.Allowed, @@ -228,7 +228,7 @@ describe("ElementWidgetDriver", () => { const listener = jest.fn(); const observer = new SimpleObservable(); observer.onUpdate(listener); - await driver.askOpenID(observer); + driver.askOpenID(observer); const openIdUpdate: IOpenIDUpdate = { state: OpenIDRequestState.Allowed, @@ -250,7 +250,7 @@ describe("ElementWidgetDriver", () => { const listener = jest.fn(); const observer = new SimpleObservable(); observer.onUpdate(listener); - await driver.askOpenID(observer); + driver.askOpenID(observer); const openIdUpdate: IOpenIDUpdate = { state: OpenIDRequestState.Allowed, diff --git a/apps/web/test/viewmodels/room/right-panel/WidgetContextMenuViewModel-test.tsx b/apps/web/test/viewmodels/room/right-panel/WidgetContextMenuViewModel-test.tsx index 6c99855fda1..46108268da1 100644 --- a/apps/web/test/viewmodels/room/right-panel/WidgetContextMenuViewModel-test.tsx +++ b/apps/web/test/viewmodels/room/right-panel/WidgetContextMenuViewModel-test.tsx @@ -161,7 +161,7 @@ describe("WidgetContextMenuViewModel", () => { }; const vm = new WidgetContextMenuViewModel(props); vm.onStreamAudioClick(); - await expect(livestream.startJitsiAudioLivestream).toHaveBeenCalled(); + expect(livestream.startJitsiAudioLivestream).toHaveBeenCalled(); expect(props.onFinished).toHaveBeenCalled(); }); From eda6d43709d33a40e55efec086fb617175d61452 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 7 Jul 2026 12:22:18 +0100 Subject: [PATCH 05/23] Fixup imports --- apps/desktop/src/preload.cts | 2 +- apps/web/src/components/structures/HomePage.tsx | 3 +-- apps/web/test/test-utils/room.ts | 3 +-- .../components/views/dialogs/devtools/Users-test.tsx | 11 +++++++++-- .../views/rooms/SendMessageComposer-test.tsx | 7 +++++-- packages/module-api/src/api/composer.ts | 2 +- packages/module-api/src/api/custom-components.ts | 2 +- .../src/utils/release_accouncement.ts | 2 +- .../RoomListItemView/RoomListItemView.stories.tsx | 8 ++++++-- .../VirtualizedRoomListView.tsx | 3 ++- .../body/MImageBodyView/ImageBodyView.stories.tsx | 3 ++- 11 files changed, 30 insertions(+), 16 deletions(-) diff --git a/apps/desktop/src/preload.cts b/apps/desktop/src/preload.cts index 18a9afe2756..8425b7b82e3 100644 --- a/apps/desktop/src/preload.cts +++ b/apps/desktop/src/preload.cts @@ -8,7 +8,7 @@ Please see LICENSE files in the repository root for full details. // This file is compiled to CommonJS rather than ESM otherwise the browser chokes on the import statement. -import { ipcRenderer, contextBridge, IpcRendererEvent } from "electron"; +import { ipcRenderer, contextBridge, type IpcRendererEvent } from "electron"; import type { ConfigOptions } from "./config.js" with { "resolution-mode": "import" }; // Expose only expected IPC wrapper APIs to the renderer process to avoid diff --git a/apps/web/src/components/structures/HomePage.tsx b/apps/web/src/components/structures/HomePage.tsx index 9d4062e1867..0f74280e773 100644 --- a/apps/web/src/components/structures/HomePage.tsx +++ b/apps/web/src/components/structures/HomePage.tsx @@ -6,8 +6,7 @@ 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 React, { type JSX } from "react"; -import { useContext, useState } from "react"; +import React, { type JSX, useContext, useState } from "react"; import { ChatSolidIcon, ExploreIcon, GroupIcon } from "@vector-im/compound-design-tokens/assets/web/icons"; import { AutoHideScrollbar } from "@element-hq/web-shared-components"; diff --git a/apps/web/test/test-utils/room.ts b/apps/web/test/test-utils/room.ts index 60eaed5b4db..458d5efe301 100644 --- a/apps/web/test/test-utils/room.ts +++ b/apps/web/test/test-utils/room.ts @@ -10,8 +10,7 @@ import { type MockedObject } from "jest-mock-vitest-adapter"; import { type EventTimeline, EventType, type MatrixClient, type MatrixEvent, Room } from "matrix-js-sdk/src/matrix"; import { KnownMembership } from "matrix-js-sdk/src/types"; -import { MainSplitContentType } from "../../src/contexts/RoomContext"; -import { type RoomContextType, TimelineRenderingType } from "../../src/contexts/RoomContext"; +import { MainSplitContentType, type RoomContextType, TimelineRenderingType } from "../../src/contexts/RoomContext"; import { Layout } from "../../src/settings/enums/Layout"; import { mkEvent } from "./test-utils"; import { SDKContextClass } from "../../src/contexts/SDKContextClass"; diff --git a/apps/web/test/unit-tests/components/views/dialogs/devtools/Users-test.tsx b/apps/web/test/unit-tests/components/views/dialogs/devtools/Users-test.tsx index 76ef540e6ff..f8d8bb0c278 100644 --- a/apps/web/test/unit-tests/components/views/dialogs/devtools/Users-test.tsx +++ b/apps/web/test/unit-tests/components/views/dialogs/devtools/Users-test.tsx @@ -7,9 +7,16 @@ import React from "react"; import { mocked } from "jest-mock"; -import { Device, DeviceVerification, type MatrixClient, MatrixEvent, RoomMember } from "matrix-js-sdk/src/matrix"; +import { + Device, + DeviceVerification, + type MatrixClient, + MatrixEvent, + RoomMember, + Room, + PendingEventOrdering, +} from "matrix-js-sdk/src/matrix"; import { render, screen, waitFor } from "jest-matrix-react"; -import { Room, PendingEventOrdering } from "matrix-js-sdk/src/matrix"; import { type DeviceVerificationStatus, type UserVerificationStatus } from "matrix-js-sdk/src/crypto-api"; import { createTestClient } from "../../../../../test-utils"; diff --git a/apps/web/test/unit-tests/components/views/rooms/SendMessageComposer-test.tsx b/apps/web/test/unit-tests/components/views/rooms/SendMessageComposer-test.tsx index 96199f5ad94..e51fc0c0956 100644 --- a/apps/web/test/unit-tests/components/views/rooms/SendMessageComposer-test.tsx +++ b/apps/web/test/unit-tests/components/views/rooms/SendMessageComposer-test.tsx @@ -17,7 +17,11 @@ import SendMessageComposer, { isQuickReaction, } from "../../../../../src/components/views/rooms/SendMessageComposer"; import MatrixClientContext from "../../../../../src/contexts/MatrixClientContext"; -import { type RoomContextType, TimelineRenderingType } from "../../../../../src/contexts/RoomContext"; +import { + type RoomContextType, + TimelineRenderingType, + MainSplitContentType, +} from "../../../../../src/contexts/RoomContext"; import EditorModel from "../../../../../src/editor/model"; import { createPartCreator } from "../../../editor/mock"; import { createTestClient, mkEvent, mkStubRoom, stubClient } from "../../../../test-utils"; @@ -25,7 +29,6 @@ import { MatrixClientPeg } from "../../../../../src/MatrixClientPeg"; import defaultDispatcher from "../../../../../src/dispatcher/dispatcher"; import DocumentOffset from "../../../../../src/editor/offset"; import { Layout } from "../../../../../src/settings/enums/Layout"; -import { MainSplitContentType } from "../../../../../src/contexts/RoomContext"; import { mockPlatformPeg } from "../../../../test-utils/platform"; import { doMaybeLocalRoomAction } from "../../../../../src/utils/local-room"; import { addTextToComposer } from "../../../../test-utils/composer"; diff --git a/packages/module-api/src/api/composer.ts b/packages/module-api/src/api/composer.ts index ba1ac94db46..c37af72fe86 100644 --- a/packages/module-api/src/api/composer.ts +++ b/packages/module-api/src/api/composer.ts @@ -5,7 +5,7 @@ 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 { ComponentType, SVGAttributes } from "react"; +import { type ComponentType, type SVGAttributes } from "react"; /** * An option presented to the user for uploading a file. diff --git a/packages/module-api/src/api/custom-components.ts b/packages/module-api/src/api/custom-components.ts index 0f456815008..dc7edf58d35 100644 --- a/packages/module-api/src/api/custom-components.ts +++ b/packages/module-api/src/api/custom-components.ts @@ -8,7 +8,7 @@ Please see LICENSE files in the repository root for full details. import type { JSX, ReactNode } from "react"; import type { MatrixEvent } from "../models/event"; import type { AccountAuthInfo } from "./auth.ts"; -import { ComposerApiTarget } from "./composer.ts"; +import type { ComposerApiTarget } from "./composer.ts"; /** * Properties for all message components. diff --git a/packages/playwright-common/src/utils/release_accouncement.ts b/packages/playwright-common/src/utils/release_accouncement.ts index 0435f58585f..c297ca13626 100644 --- a/packages/playwright-common/src/utils/release_accouncement.ts +++ b/packages/playwright-common/src/utils/release_accouncement.ts @@ -5,7 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -import { Page } from "playwright-core"; +import { type Page } from "playwright-core"; /** * Close the release announcement with the given name. diff --git a/packages/shared-components/src/room-list/VirtualizedRoomListView/RoomListItemWrapper/RoomListItemView/RoomListItemView.stories.tsx b/packages/shared-components/src/room-list/VirtualizedRoomListView/RoomListItemWrapper/RoomListItemView/RoomListItemView.stories.tsx index 1cd951673d4..b18a18043ee 100644 --- a/packages/shared-components/src/room-list/VirtualizedRoomListView/RoomListItemWrapper/RoomListItemView/RoomListItemView.stories.tsx +++ b/packages/shared-components/src/room-list/VirtualizedRoomListView/RoomListItemWrapper/RoomListItemView/RoomListItemView.stories.tsx @@ -9,8 +9,12 @@ import React, { type JSX, useEffect } from "react"; import { fn } from "storybook/test"; import type { Meta, StoryObj } from "@storybook/react-vite"; -import type { Room } from "./RoomListItemView"; -import { RoomListItemView, type RoomListItemViewSnapshot, type RoomListItemViewActions } from "./RoomListItemView"; +import { + type Room, + RoomListItemView, + type RoomListItemViewSnapshot, + type RoomListItemViewActions, +} from "./RoomListItemView"; import { useMockedViewModel } from "../../../../core/viewmodel"; import { withViewDocs } from "../../../../../.storybook/withViewDocs"; import { defaultSnapshot } from "./default-snapshot"; diff --git a/packages/shared-components/src/room-list/VirtualizedRoomListView/VirtualizedRoomListView.tsx b/packages/shared-components/src/room-list/VirtualizedRoomListView/VirtualizedRoomListView.tsx index f54323d1a57..927f87fd6e6 100644 --- a/packages/shared-components/src/room-list/VirtualizedRoomListView/VirtualizedRoomListView.tsx +++ b/packages/shared-components/src/room-list/VirtualizedRoomListView/VirtualizedRoomListView.tsx @@ -17,9 +17,10 @@ import { FlatVirtualizedList, getContainerAccessibleProps, type VirtualizedListContext, + GroupedVirtualizedList, + type GroupedVirtualizedListProps, } from "../../core/VirtualizedList"; import type { RoomListViewSnapshot, RoomListViewModel } from "../RoomListView"; -import { GroupedVirtualizedList, type GroupedVirtualizedListProps } from "../../core/VirtualizedList"; import { RoomListSectionHeaderView, RoomListStickySectionHeaderView } from "./RoomListSectionHeaderView"; import { RoomListSectionHeaderDragOverlayView } from "./RoomListSectionHeaderDragOverlayView"; import { RoomListItemWrapper } from "./RoomListItemWrapper"; diff --git a/packages/shared-components/src/room/timeline/event-tile/body/MImageBodyView/ImageBodyView.stories.tsx b/packages/shared-components/src/room/timeline/event-tile/body/MImageBodyView/ImageBodyView.stories.tsx index cddb6575b36..285f804a08b 100644 --- a/packages/shared-components/src/room/timeline/event-tile/body/MImageBodyView/ImageBodyView.stories.tsx +++ b/packages/shared-components/src/room/timeline/event-tile/body/MImageBodyView/ImageBodyView.stories.tsx @@ -19,7 +19,6 @@ import { type ImageBodyViewSnapshot, } from "./ImageBodyView"; import imageSrc from "../../../../../../static/image-body/install-spinner.png"; -import thumbnailSrc from "../../../../../../static/image-body/install-spinner.png"; import animatedGifSrc from "../../../../../../static/image-body/install-spinner.gif"; const demoBlurhash = "LEHV6nWB2yk8pyo0adR*.7kCMdnj"; const imageBodyViewStateOptions = [ImageBodyViewState.ERROR, ImageBodyViewState.HIDDEN, ImageBodyViewState.READY]; @@ -29,6 +28,8 @@ const imageBodyViewPlaceholderOptions = [ ImageBodyViewPlaceholder.BLURHASH, ]; +const thumbnailSrc = imageSrc; + type ImageBodyViewProps = ImageBodyViewSnapshot & ImageBodyViewActions & { className?: string; From 2b201a257f9e7579dcbcc868d1085b1266fa56cc Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 7 Jul 2026 12:24:33 +0100 Subject: [PATCH 06/23] Fix splats --- apps/web/I18nWebpackPlugin.ts | 2 +- apps/web/module_system/installer.ts | 6 +++--- apps/web/playwright/e2e/timeline/timeline.spec.ts | 2 +- apps/web/src/components/structures/MatrixChat.tsx | 2 +- apps/web/src/components/structures/SpaceHierarchy.tsx | 2 +- .../rooms/wysiwyg_composer/utils/createMessageContent.ts | 2 +- apps/web/src/stores/RoomViewStore.tsx | 2 +- apps/web/src/utils/Reply.ts | 2 +- apps/web/src/utils/RoomUpgrade.ts | 2 +- apps/web/src/utils/messages.ts | 2 +- packages/shared-components/scripts/storybook-build-i18n.ts | 2 +- 11 files changed, 13 insertions(+), 13 deletions(-) diff --git a/apps/web/I18nWebpackPlugin.ts b/apps/web/I18nWebpackPlugin.ts index 732f03dda1e..f0892a70295 100644 --- a/apps/web/I18nWebpackPlugin.ts +++ b/apps/web/I18nWebpackPlugin.ts @@ -62,7 +62,7 @@ export class I18nWebpackPlugin { } const primaryPath = paths[0]; - const includeLangs = [...new Set([...(await fs.readdir(primaryPath))])] + const includeLangs = [...new Set(await fs.readdir(primaryPath))] .filter((fn) => fn.endsWith(".json")) .map((f) => f.slice(0, -5)); diff --git a/apps/web/module_system/installer.ts b/apps/web/module_system/installer.ts index e2da8eb2293..b179f394cab 100644 --- a/apps/web/module_system/installer.ts +++ b/apps/web/module_system/installer.ts @@ -134,9 +134,9 @@ function getOptionalDepNames(pkgJsonStr: string): string[] { function findDepVersionInPackageJson(dep: string, pkgJsonStr: string): string { const pkgJson = JSON.parse(pkgJsonStr); const packages = { - ...(pkgJson["optionalDependencies"] ?? {}), - ...(pkgJson["devDependencies"] ?? {}), - ...(pkgJson["dependencies"] ?? {}), + ...pkgJson["optionalDependencies"], + ...pkgJson["devDependencies"], + ...pkgJson["dependencies"], }; return packages[dep]; } diff --git a/apps/web/playwright/e2e/timeline/timeline.spec.ts b/apps/web/playwright/e2e/timeline/timeline.spec.ts index 03f0c8e8e7a..64ca9e07b2a 100644 --- a/apps/web/playwright/e2e/timeline/timeline.spec.ts +++ b/apps/web/playwright/e2e/timeline/timeline.spec.ts @@ -71,7 +71,7 @@ const sendImage = async ( ): Promise => { const upload = await client.uploadContent(pngBytes, { name: "image.png", type: "image/png" }); return client.sendEvent(roomId, null, "m.room.message" as EventType, { - ...(additionalContent ?? {}), + ...additionalContent, msgtype: "m.image" as MsgType, body: "image.png", diff --git a/apps/web/src/components/structures/MatrixChat.tsx b/apps/web/src/components/structures/MatrixChat.tsx index bb85565d45d..0290b985365 100644 --- a/apps/web/src/components/structures/MatrixChat.tsx +++ b/apps/web/src/components/structures/MatrixChat.tsx @@ -696,7 +696,7 @@ export default class MatrixChat extends React.PureComponent { break; case "logout": LegacyCallHandler.instance.hangupAllCalls(); - Promise.all([...[...CallStore.instance.connectedCalls].map((call) => call.disconnect())]).finally(() => + Promise.all([...CallStore.instance.connectedCalls].map((call) => call.disconnect())).finally(() => Lifecycle.logout(this.stores.oidcClientStore), ); break; diff --git a/apps/web/src/components/structures/SpaceHierarchy.tsx b/apps/web/src/components/structures/SpaceHierarchy.tsx index b1920e7fedc..097ea471394 100644 --- a/apps/web/src/components/structures/SpaceHierarchy.tsx +++ b/apps/web/src/components/structures/SpaceHierarchy.tsx @@ -798,7 +798,7 @@ const SpaceHierarchy: React.FC = ({ space, initialText = "", showRoom, a // Walk back up the tree to find all parents of the direct matches to show their place in the hierarchy const visited = new Set(); - const queue = [...directMatches.map((r) => r.room_id)]; + const queue = directMatches.map((r) => r.room_id); while (queue.length) { const roomId = queue.pop()!; visited.add(roomId); diff --git a/apps/web/src/components/views/rooms/wysiwyg_composer/utils/createMessageContent.ts b/apps/web/src/components/views/rooms/wysiwyg_composer/utils/createMessageContent.ts index 63fe8ca3619..ebdb0bd06b5 100644 --- a/apps/web/src/components/views/rooms/wysiwyg_composer/utils/createMessageContent.ts +++ b/apps/web/src/components/views/rooms/wysiwyg_composer/utils/createMessageContent.ts @@ -25,7 +25,7 @@ export const EMOTE_PREFIX = "/me "; function attachRelation(content: IContent, relation?: IEventRelation): void { if (relation) { content["m.relates_to"] = { - ...(content["m.relates_to"] || {}), + ...content["m.relates_to"], ...relation, }; } diff --git a/apps/web/src/stores/RoomViewStore.tsx b/apps/web/src/stores/RoomViewStore.tsx index 73050916619..9dadd8a34d2 100644 --- a/apps/web/src/stores/RoomViewStore.tsx +++ b/apps/web/src/stores/RoomViewStore.tsx @@ -552,7 +552,7 @@ export class RoomViewStore extends EventEmitter { const joinOpts: IJoinRoomOpts = { viaServers, acceptSharedHistory: true, - ...(payload.opts ?? {}), + ...payload.opts, }; try { const cli = MatrixClientPeg.safeGet(); diff --git a/apps/web/src/utils/Reply.ts b/apps/web/src/utils/Reply.ts index 3b595e86934..249c901fcef 100644 --- a/apps/web/src/utils/Reply.ts +++ b/apps/web/src/utils/Reply.ts @@ -85,7 +85,7 @@ export function shouldDisplayReply(event: MatrixEvent): boolean { export function addReplyToMessageContent(content: IContent, replyToEvent: MatrixEvent): void { content["m.relates_to"] = { - ...(content["m.relates_to"] || {}), + ...content["m.relates_to"], ...makeReplyMixIn(replyToEvent), }; } diff --git a/apps/web/src/utils/RoomUpgrade.ts b/apps/web/src/utils/RoomUpgrade.ts index d92038e0db8..3bbdcb64bf0 100644 --- a/apps/web/src/utils/RoomUpgrade.ts +++ b/apps/web/src/utils/RoomUpgrade.ts @@ -132,7 +132,7 @@ export async function upgradeRoom( parent.roomId, EventType.SpaceChild, { - ...(currentEv?.getContent() || {}), // copy existing attributes like suggested + ...currentEv?.getContent(), // copy existing attributes like suggested via: [cli.getDomain()!], }, newRoomId, diff --git a/apps/web/src/utils/messages.ts b/apps/web/src/utils/messages.ts index b6040b536ba..2a5641f37a1 100644 --- a/apps/web/src/utils/messages.ts +++ b/apps/web/src/utils/messages.ts @@ -102,7 +102,7 @@ export function attachMentions( export function attachRelation(content: IContent, relation?: IEventRelation): void { if (relation) { content["m.relates_to"] = { - ...(content["m.relates_to"] || {}), + ...content["m.relates_to"], ...relation, }; } diff --git a/packages/shared-components/scripts/storybook-build-i18n.ts b/packages/shared-components/scripts/storybook-build-i18n.ts index 9fcdd09ef55..677c7626665 100644 --- a/packages/shared-components/scripts/storybook-build-i18n.ts +++ b/packages/shared-components/scripts/storybook-build-i18n.ts @@ -18,7 +18,7 @@ const I18N_BASE_PATH = "./src/i18n/strings/"; const I18N_DEST = "storybook-static/i18n/"; // List of languages to include -const INCLUDE_LANGS = [...new Set([...fs.readdirSync(I18N_BASE_PATH)])] +const INCLUDE_LANGS = [...new Set(fs.readdirSync(I18N_BASE_PATH))] .filter((fn) => fn.endsWith(".json")) .map((f) => f.slice(0, -5)); From 181e1915e0ff4022002d274af6d03595a37153e3 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 7 Jul 2026 12:25:46 +0100 Subject: [PATCH 07/23] Fix this-context on callbacks --- modules/banner/src/Univention/SilentLogin.tsx | 2 +- modules/restricted-guests/src/AuthFooter.tsx | 2 +- packages/module-api/src/api/custom-components.ts | 4 ++-- packages/module-api/src/api/dialog.ts | 6 +++--- .../src/room/composer/UploadButton/UploadButton.tsx | 2 +- .../RoomAvatarEventView/RoomAvatarEventView.tsx | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/modules/banner/src/Univention/SilentLogin.tsx b/modules/banner/src/Univention/SilentLogin.tsx index cc2a0f7e1b0..0395410136f 100644 --- a/modules/banner/src/Univention/SilentLogin.tsx +++ b/modules/banner/src/Univention/SilentLogin.tsx @@ -14,7 +14,7 @@ const HiddenIFrame = styled.iframe` interface Props { icsUrl: string; - onLoggedIn(success: boolean): void; + onLoggedIn(this: void, success: boolean): void; } const SilentLogin: FC = ({ onLoggedIn, icsUrl }) => { diff --git a/modules/restricted-guests/src/AuthFooter.tsx b/modules/restricted-guests/src/AuthFooter.tsx index 5ff6b118514..be6bf18d34f 100644 --- a/modules/restricted-guests/src/AuthFooter.tsx +++ b/modules/restricted-guests/src/AuthFooter.tsx @@ -16,7 +16,7 @@ import RegisterDialog from "./RegisterDialog.tsx"; interface Props { api: Api; config: ModuleConfig; - onLoggedIn(data: AccountAuthInfo): void; + onLoggedIn(this: void, data: AccountAuthInfo): void; } const Container = styled.aside` diff --git a/packages/module-api/src/api/custom-components.ts b/packages/module-api/src/api/custom-components.ts index dc7edf58d35..5ca2be000fa 100644 --- a/packages/module-api/src/api/custom-components.ts +++ b/packages/module-api/src/api/custom-components.ts @@ -129,12 +129,12 @@ export type CustomLoginComponentProps = { * Function to complete login * @param data - the data to authenticate the user with */ - onLoggedIn(data: AccountAuthInfo): void; + onLoggedIn(this: void, data: AccountAuthInfo): void; /** * Function to change the selected server * @param config - new server configuration details */ - onServerConfigChange(config: CustomLoginComponentPropsServerConfig): void; + onServerConfigChange(this: void, config: CustomLoginComponentPropsServerConfig): void; }; /** diff --git a/packages/module-api/src/api/dialog.ts b/packages/module-api/src/api/dialog.ts index cd9a2c867c4..cfbf9da6f41 100644 --- a/packages/module-api/src/api/dialog.ts +++ b/packages/module-api/src/api/dialog.ts @@ -30,7 +30,7 @@ export type DialogHandle = { /** * Method to close the dialog. */ - close(): void; + close(this: void): void; }; /** @@ -42,11 +42,11 @@ export type DialogProps = { * Callback to submit the dialog. * @param model - The model to submit with the dialog. This is typically the data collected. */ - onSubmit(model: M): void; + onSubmit(this: void, model: M): void; /** * Cancel the dialog programmatically. */ - onCancel(): void; + onCancel(this: void): void; }; /** diff --git a/packages/shared-components/src/room/composer/UploadButton/UploadButton.tsx b/packages/shared-components/src/room/composer/UploadButton/UploadButton.tsx index b037d6fa048..bc488e3aa8f 100644 --- a/packages/shared-components/src/room/composer/UploadButton/UploadButton.tsx +++ b/packages/shared-components/src/room/composer/UploadButton/UploadButton.tsx @@ -26,7 +26,7 @@ export interface UploadButtonViewSnapshot { } export interface UploadButtonViewActions { - onUploadOptionSelected(type: string): void; + onUploadOptionSelected(this: void, type: string): void; } /** diff --git a/packages/shared-components/src/room/timeline/event-tile/EventTileView/RoomAvatarEventView/RoomAvatarEventView.tsx b/packages/shared-components/src/room/timeline/event-tile/EventTileView/RoomAvatarEventView/RoomAvatarEventView.tsx index 23fc7ce6155..dfb72f33ec1 100644 --- a/packages/shared-components/src/room/timeline/event-tile/EventTileView/RoomAvatarEventView/RoomAvatarEventView.tsx +++ b/packages/shared-components/src/room/timeline/event-tile/EventTileView/RoomAvatarEventView/RoomAvatarEventView.tsx @@ -40,7 +40,7 @@ export interface RoomAvatarEventViewActions { /** * Invoked when the user opens the avatar image. */ - onAvatarClick(): void; + onAvatarClick(this: void): void; } export type RoomAvatarEventViewModel = ViewModel; From 73da598d582cf131316234f59199ea9a35b431b9 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 7 Jul 2026 12:26:58 +0100 Subject: [PATCH 08/23] Memoise react contexts --- apps/web/src/components/structures/ViewSource.tsx | 2 ++ apps/web/src/components/views/dialogs/DevtoolsDialog.tsx | 1 + .../src/components/views/elements/PersistedElement.tsx | 1 + apps/web/src/components/views/right_panel/BaseCard.tsx | 5 +++-- apps/web/src/contexts/CurrentRightPanelPhaseContext.tsx | 9 +++------ packages/shared-components/src/test/utils/index.tsx | 6 ++++-- 6 files changed, 14 insertions(+), 10 deletions(-) diff --git a/apps/web/src/components/structures/ViewSource.tsx b/apps/web/src/components/structures/ViewSource.tsx index b2e003284bb..2d3b7168391 100644 --- a/apps/web/src/components/structures/ViewSource.tsx +++ b/apps/web/src/components/structures/ViewSource.tsx @@ -116,6 +116,7 @@ export default class ViewSource extends React.Component { return ( {(cli) => ( + // oxlint-disable-next-line react/jsx-no-constructed-context-values @@ -127,6 +128,7 @@ export default class ViewSource extends React.Component { return ( {(cli) => ( + // oxlint-disable-next-line react/jsx-no-constructed-context-values diff --git a/apps/web/src/components/views/dialogs/DevtoolsDialog.tsx b/apps/web/src/components/views/dialogs/DevtoolsDialog.tsx index 4c5d5cc4317..d9074f84494 100644 --- a/apps/web/src/components/views/dialogs/DevtoolsDialog.tsx +++ b/apps/web/src/components/views/dialogs/DevtoolsDialog.tsx @@ -151,6 +151,7 @@ const DevtoolsDialog: React.FC = ({ roomId, threadRootId, onFinished }) )}
{cli.getRoom(roomId) && ( + // oxlint-disable-next-line react/jsx-no-constructed-context-values {body} diff --git a/apps/web/src/components/views/elements/PersistedElement.tsx b/apps/web/src/components/views/elements/PersistedElement.tsx index bd496ef9b84..33107425e2a 100644 --- a/apps/web/src/components/views/elements/PersistedElement.tsx +++ b/apps/web/src/components/views/elements/PersistedElement.tsx @@ -165,6 +165,7 @@ export default class PersistedElement extends React.Component { private renderApp(): void { const content = ( + {/* oxlint-disable-next-line react/jsx-no-constructed-context-values */}
diff --git a/apps/web/src/components/views/right_panel/BaseCard.tsx b/apps/web/src/components/views/right_panel/BaseCard.tsx index f5d91881bd8..4f62b71cc33 100644 --- a/apps/web/src/components/views/right_panel/BaseCard.tsx +++ b/apps/web/src/components/views/right_panel/BaseCard.tsx @@ -6,7 +6,7 @@ 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 React, { type ReactNode, type KeyboardEvent, type Ref, type MouseEvent } from "react"; +import React, { type ReactNode, type KeyboardEvent, type Ref, type MouseEvent, useMemo } from "react"; import classNames from "classnames"; import { IconButton, Text } from "@vector-im/compound-web"; import CloseIcon from "@vector-im/compound-design-tokens/assets/web/icons/close"; @@ -103,9 +103,10 @@ const BaseCard: React.FC = ({ } const shouldRenderHeader = header || !hideHeaderButtons; + const context = useMemo(() => ({ isCard: true }), []); return ( - +
{ const { currentPhase, isOpen } = useCurrentPhase(roomId); - return ( - - {children} - - ); + const context = useMemo(() => ({ currentPhase, isPanelOpen: isOpen }), [currentPhase, isOpen]); + return {children}; }; diff --git a/packages/shared-components/src/test/utils/index.tsx b/packages/shared-components/src/test/utils/index.tsx index adbabad3297..38ead09d210 100644 --- a/packages/shared-components/src/test/utils/index.tsx +++ b/packages/shared-components/src/test/utils/index.tsx @@ -28,6 +28,8 @@ type SharedRenderOptions = RenderOptions & { presentation?: Partial; }; +const i18nApi = new I18nApi(); + const wrapWithTooltipProvider = (Wrapper: RenderOptions["wrapper"], presentation?: Partial) => { return ({ children }: { children: React.ReactNode }) => { const resolvedPresentation: EventPresentation | undefined = presentation @@ -43,12 +45,12 @@ const wrapWithTooltipProvider = (Wrapper: RenderOptions["wrapper"], presentation if (Wrapper) { return ( - + {content} ); } else { - return {content}; + return {content}; } }; }; From 0e6c04468a64ab3cc7254ed3dd959c9bc58353b2 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 7 Jul 2026 12:27:47 +0100 Subject: [PATCH 09/23] Prefer find/flatMap --- apps/desktop/src/language-helper.ts | 4 ++-- apps/web/src/components/structures/auth/SoftLogout.tsx | 2 +- .../views/settings/tabs/room/BridgeSettingsTab.tsx | 2 +- apps/web/src/utils/DMRoomMap.ts | 10 +++++----- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/apps/desktop/src/language-helper.ts b/apps/desktop/src/language-helper.ts index 23a859a902e..9cd851c246f 100644 --- a/apps/desktop/src/language-helper.ts +++ b/apps/desktop/src/language-helper.ts @@ -113,7 +113,7 @@ export class AppLocalization { locales = [locales]; } - const loadedLocales = locales.filter((locale) => { + const chosenLocale = locales.find((locale) => { const translations = this.fetchTranslationJson(locale); if (translations !== null) { counterpart.registerTranslations(locale, translations); @@ -121,7 +121,7 @@ export class AppLocalization { return !!translations; }); - counterpart.setLocale(loadedLocales[0]); + counterpart.setLocale(chosenLocale); this.store.set(AppLocalization.STORE_KEY, locales); this.resetLocalizedUI(); diff --git a/apps/web/src/components/structures/auth/SoftLogout.tsx b/apps/web/src/components/structures/auth/SoftLogout.tsx index 1793b969279..bf71bb4366e 100644 --- a/apps/web/src/components/structures/auth/SoftLogout.tsx +++ b/apps/web/src/components/structures/auth/SoftLogout.tsx @@ -112,7 +112,7 @@ export default class SoftLogout extends React.Component { const loginViews = flows.map((f) => STATIC_FLOWS_TO_VIEWS[f.type]); const isSocialSignOn = loginViews.includes(LoginView.Password) && loginViews.includes(LoginView.SSO); - const firstView = loginViews.filter((f) => !!f)[0] || LoginView.Unsupported; + const firstView = loginViews.find((f) => !!f) || LoginView.Unsupported; const chosenView = isSocialSignOn ? LoginView.PasswordWithSocialSignOn : firstView; this.setState({ flows, loginView: chosenView }); } diff --git a/apps/web/src/components/views/settings/tabs/room/BridgeSettingsTab.tsx b/apps/web/src/components/views/settings/tabs/room/BridgeSettingsTab.tsx index 42fa45e0162..ae82800aa3c 100644 --- a/apps/web/src/components/views/settings/tabs/room/BridgeSettingsTab.tsx +++ b/apps/web/src/components/views/settings/tabs/room/BridgeSettingsTab.tsx @@ -40,7 +40,7 @@ export default class BridgeSettingsTab extends React.Component { const roomState = client.getRoom(roomId)?.currentState; if (!roomState) return []; - return BRIDGE_EVENT_TYPES.map((typeName) => roomState.getStateEvents(typeName)).flat(1); + return BRIDGE_EVENT_TYPES.flatMap((typeName) => roomState.getStateEvents(typeName)); } public render(): React.ReactNode { diff --git a/apps/web/src/utils/DMRoomMap.ts b/apps/web/src/utils/DMRoomMap.ts index 989eea09d0e..3153ed88fab 100644 --- a/apps/web/src/utils/DMRoomMap.ts +++ b/apps/web/src/utils/DMRoomMap.ts @@ -162,11 +162,11 @@ export default class DMRoomMap { commonRooms = commonRooms.filter((r) => userRooms.includes(r)); } - const joinedRooms = commonRooms - .map((r) => this.matrixClient.getRoom(r)) - .filter((r) => r && r.getMyMembership() === KnownMembership.Join); - - return joinedRooms[0]; + return ( + commonRooms + .map((r) => this.matrixClient.getRoom(r)) + .find((r) => r && r.getMyMembership() === KnownMembership.Join) ?? null + ); } public getUserIdForRoomId(roomId: string): string | undefined { From 2f1159cf1f82a73e210bb25b882505661c388fed Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 7 Jul 2026 12:28:17 +0100 Subject: [PATCH 10/23] Make oxlint happier about our React keys --- .../components/views/dialogs/InviteDialog.tsx | 2 +- .../views/dialogs/SpacePreferencesDialog.tsx | 4 +-- .../views/dialogs/SpaceSettingsDialog.tsx | 25 +++++++++++++------ 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/apps/web/src/components/views/dialogs/InviteDialog.tsx b/apps/web/src/components/views/dialogs/InviteDialog.tsx index b5dcafd9f82..3f0485817a0 100644 --- a/apps/web/src/components/views/dialogs/InviteDialog.tsx +++ b/apps/web/src/components/views/dialogs/InviteDialog.tsx @@ -1387,7 +1387,7 @@ export default class InviteDialog extends React.PureComponent, + , usersSection, ), ]; diff --git a/apps/web/src/components/views/dialogs/SpacePreferencesDialog.tsx b/apps/web/src/components/views/dialogs/SpacePreferencesDialog.tsx index 6925cadcf19..a2ca0034f54 100644 --- a/apps/web/src/components/views/dialogs/SpacePreferencesDialog.tsx +++ b/apps/web/src/components/views/dialogs/SpacePreferencesDialog.tsx @@ -65,8 +65,8 @@ const SpacePreferencesDialog: React.FC = ({ space, onFinished }) => { new Tab( SpacePreferenceTab.Appearance, _td("common|appearance"), - , - , + , + , ), ]; diff --git a/apps/web/src/components/views/dialogs/SpaceSettingsDialog.tsx b/apps/web/src/components/views/dialogs/SpaceSettingsDialog.tsx index 11cc82cadb1..7f41ed7a969 100644 --- a/apps/web/src/components/views/dialogs/SpaceSettingsDialog.tsx +++ b/apps/web/src/components/views/dialogs/SpaceSettingsDialog.tsx @@ -54,27 +54,36 @@ const SpaceSettingsDialog: React.FC = ({ matrixClient: cli, space, onFin new Tab( SpaceSettingsTab.General, _td("common|general"), - , - , + , + , ), new Tab( SpaceSettingsTab.Visibility, _td("room_settings|visibility|title"), - , - , + , + , ), new Tab( SpaceSettingsTab.Roles, _td("room_settings|permissions|title"), - , - , + , + , ), SettingsStore.getValue(UIFeature.AdvancedSettings) ? new Tab( SpaceSettingsTab.Advanced, _td("common|advanced"), - , - , + , + , ) : null, ].filter(Boolean) as NonEmptyArray>; From dc52837d2e9a6c0b432af9aa564d57544bbad651 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 7 Jul 2026 12:28:56 +0100 Subject: [PATCH 11/23] Avoid unsafe default function params --- .../views/dialogs/GenericFeatureFeedbackDialog.tsx | 2 +- .../views/dialogs/ManageRestrictedJoinRuleDialog.tsx | 6 +++--- .../components/views/elements/GenericEventListSummary.tsx | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/web/src/components/views/dialogs/GenericFeatureFeedbackDialog.tsx b/apps/web/src/components/views/dialogs/GenericFeatureFeedbackDialog.tsx index 29fee059dc6..c2f79a6c8a9 100644 --- a/apps/web/src/components/views/dialogs/GenericFeatureFeedbackDialog.tsx +++ b/apps/web/src/components/views/dialogs/GenericFeatureFeedbackDialog.tsx @@ -30,7 +30,7 @@ const GenericFeatureFeedbackDialog: React.FC = ({ subheading, children, rageshakeLabel, - rageshakeData = {}, + rageshakeData, onFinished, }) => { const [comment, setComment] = useState(""); diff --git a/apps/web/src/components/views/dialogs/ManageRestrictedJoinRuleDialog.tsx b/apps/web/src/components/views/dialogs/ManageRestrictedJoinRuleDialog.tsx index 6b68aca245e..eb6fbc5df8d 100644 --- a/apps/web/src/components/views/dialogs/ManageRestrictedJoinRuleDialog.tsx +++ b/apps/web/src/components/views/dialogs/ManageRestrictedJoinRuleDialog.tsx @@ -78,7 +78,7 @@ const addAllParents = (set: Set, room: Room): void => { }); }; -const ManageRestrictedJoinRuleDialog: React.FC = ({ room, selected = [], onFinished }) => { +const ManageRestrictedJoinRuleDialog: React.FC = ({ room, selected, onFinished }) => { const cli = room.client; const [newSelected, setNewSelected] = useState(new Set(selected)); const [query, setQuery] = useState(""); @@ -92,7 +92,7 @@ const ManageRestrictedJoinRuleDialog: React.FC = ({ room, selected = [], Array.from(parents), SpaceStore.instance.spacePanelSpaces.filter((s) => !parents.has(s)), filterBoolean( - selected.map((roomId) => { + selected?.map((roomId) => { const room = cli.getRoom(roomId); if (!room) { return { roomId, name: roomId } as Room; @@ -100,7 +100,7 @@ const ManageRestrictedJoinRuleDialog: React.FC = ({ room, selected = [], if (room.getMyMembership() !== KnownMembership.Join || !room.isSpaceRoom()) { return room; } - }), + }) ?? [], ), ]; }, [cli, selected, room]); diff --git a/apps/web/src/components/views/elements/GenericEventListSummary.tsx b/apps/web/src/components/views/elements/GenericEventListSummary.tsx index 94cd64a5db2..cc5d6cc6b5c 100644 --- a/apps/web/src/components/views/elements/GenericEventListSummary.tsx +++ b/apps/web/src/components/views/elements/GenericEventListSummary.tsx @@ -43,7 +43,7 @@ const GenericEventListSummary: React.FC = ({ threshold = 3, onToggle, startExpanded = false, - summaryMembers = [], + summaryMembers, summaryText, layout = Layout.Group, "data-testid": testId, @@ -83,7 +83,7 @@ const GenericEventListSummary: React.FC = ({ ); } else { const uniqueMembers = uniqBy( - summaryMembers.filter((member) => { + summaryMembers?.filter((member) => { if (!member?.getMxcAvatarUrl) { logger.error( "EventListSummary given null summaryMember, termites may be afoot eating event senders", From f189f8d0f9cccbd2d6155642feca3f949cd0ef1c Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 7 Jul 2026 12:29:51 +0100 Subject: [PATCH 12/23] Fixup jsdoc --- apps/web/src/utils/LruCache.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/web/src/utils/LruCache.ts b/apps/web/src/utils/LruCache.ts index bfff80d5d53..659d27c65d8 100644 --- a/apps/web/src/utils/LruCache.ts +++ b/apps/web/src/utils/LruCache.ts @@ -131,6 +131,7 @@ export class LruCache { /** * Returns an iterator over the cached values. + * @yields each value in the cache */ public *values(): IterableIterator { for (const item of this.map.values()) { From 772e279810a850721fd6bcb2327579a2a62e70b8 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 7 Jul 2026 12:30:01 +0100 Subject: [PATCH 13/23] Fixup contexts --- .../components/structures/auth/header/AuthHeaderProvider.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/web/src/components/structures/auth/header/AuthHeaderProvider.tsx b/apps/web/src/components/structures/auth/header/AuthHeaderProvider.tsx index 50a53b95c3d..75f792f4a2f 100644 --- a/apps/web/src/components/structures/auth/header/AuthHeaderProvider.tsx +++ b/apps/web/src/components/structures/auth/header/AuthHeaderProvider.tsx @@ -7,7 +7,7 @@ Please see LICENSE files in the repository root for full details. */ import { isEqual } from "lodash"; -import React, { type JSX, type ComponentProps, type PropsWithChildren, type Reducer, useReducer } from "react"; +import React, { type JSX, type ComponentProps, type PropsWithChildren, type Reducer, useReducer, useMemo } from "react"; import { AuthHeaderContext } from "./AuthHeaderContext"; import { type AuthHeaderModifier } from "./AuthHeaderModifier"; @@ -36,5 +36,6 @@ export function AuthHeaderProvider({ children }: PropsWithChildren): JSX.Element }, [] as ComponentProps[], ); - return {children}; + const context = useMemo(() => ({ state, dispatch }), [state, dispatch]); + return {children}; } From 81c7e3cd98a5038de103271a7fd2ba2ac58af70e Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 7 Jul 2026 13:01:19 +0100 Subject: [PATCH 14/23] Switch from eslint to oxlint --- .github/workflows/static_analysis.yaml | 2 +- .lintstagedrc | 3 +- apps/desktop/.eslintrc.cjs | 97 - apps/desktop/hak/tsconfig.json | 3 +- apps/desktop/package.json | 13 +- apps/desktop/scripts/tsconfig.json | 3 +- apps/web/.eslintignore | 18 - apps/web/.eslintrc.cjs | 355 ---- apps/web/.lintstagedrc | 4 +- apps/web/package.json | 20 +- apps/web/playwright/tsconfig.json | 3 +- apps/web/tsconfig.json | 2 +- modules/.eslintrc.cjs | 75 - modules/banner/tsconfig.json | 2 +- modules/package.json | 10 +- modules/tsconfig.json | 3 +- modules/widget-toggles/tsconfig.json | 4 +- oxlint.config.ts | 448 ++++ package.json | 9 +- packages/module-api/tsconfig.json | 2 +- packages/shared-components/.eslintrc.cjs | 99 - packages/shared-components/package.json | 17 +- packages/shared-components/tsconfig.json | 3 +- pnpm-lock.yaml | 2417 ++++------------------ 24 files changed, 908 insertions(+), 2704 deletions(-) delete mode 100644 apps/desktop/.eslintrc.cjs delete mode 100644 apps/web/.eslintignore delete mode 100644 apps/web/.eslintrc.cjs delete mode 100644 modules/.eslintrc.cjs create mode 100644 oxlint.config.ts delete mode 100644 packages/shared-components/.eslintrc.cjs diff --git a/.github/workflows/static_analysis.yaml b/.github/workflows/static_analysis.yaml index ac098ae699c..10d20acc8f7 100644 --- a/.github/workflows/static_analysis.yaml +++ b/.github/workflows/static_analysis.yaml @@ -28,7 +28,7 @@ jobs: - name: Oxfmt install: normal command: "lint:fmt" - - name: ESLint + - name: Oxlint install: normal command: "lint:js" - name: Style Lint diff --git a/.lintstagedrc b/.lintstagedrc index 1f28a28d5c9..1f902220671 100644 --- a/.lintstagedrc +++ b/.lintstagedrc @@ -1,3 +1,4 @@ { - "*": "oxfmt --no-error-on-unmatched-pattern" + "*": "oxfmt --no-error-on-unmatched-pattern", + "*.{js,jsx,ts,tsx,mjs,cjs}": "oxlint --no-error-on-unmatched-pattern" } diff --git a/apps/desktop/.eslintrc.cjs b/apps/desktop/.eslintrc.cjs deleted file mode 100644 index 7a1d06729c2..00000000000 --- a/apps/desktop/.eslintrc.cjs +++ /dev/null @@ -1,97 +0,0 @@ -module.exports = { - plugins: ["matrix-org", "n"], - extends: ["plugin:matrix-org/javascript"], - parserOptions: { - ecmaVersion: 2021, - project: ["tsconfig.json"], - }, - env: { - es6: true, - node: true, - // we also have some browser code (ie. the preload script) - browser: true, - }, - // NOTE: These rules are frozen and new rules should not be added here. - // New changes belong in https://github.com/matrix-org/eslint-plugin-matrix-org/ - rules: { - "quotes": "off", - "indent": "off", - "prefer-promise-reject-errors": "off", - "no-async-promise-executor": "off", - - "n/file-extension-in-import": ["error", "always"], - "unicorn/prefer-node-protocol": ["error"], - }, - overrides: [ - { - files: ["src/**/*.ts"], - extends: ["plugin:matrix-org/typescript"], - rules: { - // Things we do that break the ideal style - "prefer-promise-reject-errors": "off", - "quotes": "off", - - "@typescript-eslint/no-explicit-any": "off", - // We're okay with assertion errors when we ask for them - "@typescript-eslint/no-non-null-assertion": "off", - }, - }, - { - files: ["hak/**/*.ts"], - extends: ["plugin:matrix-org/typescript"], - parserOptions: { - project: ["hak/tsconfig.json"], - }, - rules: { - // Things we do that break the ideal style - "prefer-promise-reject-errors": "off", - "quotes": "off", - "n/file-extension-in-import": "off", - - "@typescript-eslint/no-explicit-any": "off", - // We're okay with assertion errors when we ask for them - "@typescript-eslint/no-non-null-assertion": "off", - }, - }, - { - files: ["scripts/**/*.ts"], - extends: ["plugin:matrix-org/typescript"], - parserOptions: { - project: ["scripts/tsconfig.json"], - }, - rules: { - // Things we do that break the ideal style - "prefer-promise-reject-errors": "off", - "quotes": "off", - "n/file-extension-in-import": "off", - - "@typescript-eslint/no-explicit-any": "off", - // We're okay with assertion errors when we ask for them - "@typescript-eslint/no-non-null-assertion": "off", - }, - }, - { - files: ["playwright/**/*.ts"], - extends: ["plugin:matrix-org/typescript"], - parserOptions: { - project: ["playwright/tsconfig.json"], - }, - rules: { - // Things we do that break the ideal style - "prefer-promise-reject-errors": "off", - "quotes": "off", - - "@typescript-eslint/no-explicit-any": "off", - // We're okay with assertion errors when we ask for them - "@typescript-eslint/no-non-null-assertion": "off", - }, - }, - { - files: ["src/**/*.test.ts", "electron-builder.ts", "vitest.config.ts"], - extends: ["plugin:matrix-org/typescript"], - parserOptions: { - project: ["tsconfig.node.json"], - }, - }, - ], -}; diff --git a/apps/desktop/hak/tsconfig.json b/apps/desktop/hak/tsconfig.json index 2dab26fbe82..2a3a2f7bddd 100644 --- a/apps/desktop/hak/tsconfig.json +++ b/apps/desktop/hak/tsconfig.json @@ -9,7 +9,8 @@ "lib": ["es2022"], "types": ["node"], "allowImportingTsExtensions": true, - "skipLibCheck": true + "skipLibCheck": true, + "noEmit": true }, "include": ["../scripts/@types/*.d.ts", "./**/*.ts"] } diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 37ff6800eb6..8557a68e37e 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -29,9 +29,7 @@ "fetch": "pnpm run mkdirs && node scripts/fetch-package.ts", "asar-webapp": "asar p webapp webapp.asar", "start": "nx start", - "lint": "pnpm lint:types && pnpm lint:js", - "lint:js": "eslint --max-warnings 0 src hak playwright scripts", - "lint:js-fix": "eslint --fix --max-warnings 0 src hak playwright scripts", + "lint": "pnpm lint:types", "lint:types": "pnpm lint:types:src && pnpm lint:types:node && pnpm lint:types:test && pnpm lint:types:scripts && pnpm lint:types:hak", "lint:types:src": "tsc --noEmit", "lint:types:node": "tsc --noEmit -p tsconfig.node.json", @@ -75,14 +73,11 @@ "@electron/asar": "4.2.0", "@electron/fuses": "^2.1.1", "@playwright/test": "catalog:", - "@stylistic/eslint-plugin": "^5.0.0", "@types/auto-launch": "^5.0.1", "@types/counterpart": "^0.18.1", "@types/minimist": "^1.2.1", "@types/node": "catalog:", "@types/pacote": "^11.1.1", - "@typescript-eslint/eslint-plugin": "^8.0.0", - "@typescript-eslint/parser": "^8.0.0", "app-builder-lib": "26.15.3", "chokidar": "^5.0.0", "detect-libc": "^2.0.0", @@ -90,12 +85,6 @@ "electron-builder": "26.15.3", "electron-builder-squirrel-windows": "26.15.3", "electron-devtools-installer": "^4.0.0", - "eslint": "^8.26.0", - "eslint-config-google": "^0.14.0", - "eslint-plugin-import": "^2.25.4", - "eslint-plugin-matrix-org": "^3.0.0", - "eslint-plugin-n": "^17.12.0", - "eslint-plugin-unicorn": "^56.0.0", "glob": "^13.0.0", "matrix-web-i18n": "catalog:", "memfs": "^4.57.2", diff --git a/apps/desktop/scripts/tsconfig.json b/apps/desktop/scripts/tsconfig.json index bff3b8ae81c..5b5a8b70963 100644 --- a/apps/desktop/scripts/tsconfig.json +++ b/apps/desktop/scripts/tsconfig.json @@ -10,7 +10,8 @@ "strict": true, "lib": ["es2022"], "types": ["node"], - "allowImportingTsExtensions": true + "allowImportingTsExtensions": true, + "noEmit": true }, "include": ["../src/@types", "./**/*.ts"] } diff --git a/apps/web/.eslintignore b/apps/web/.eslintignore deleted file mode 100644 index 8c739b4d777..00000000000 --- a/apps/web/.eslintignore +++ /dev/null @@ -1,18 +0,0 @@ -src/vector/modernizr.cjs -test/end-to-end-tests/node_modules/ -test/end-to-end-tests/element/ -test/end-to-end-tests/synapse/ -test/end-to-end-tests/lib/ -# Legacy skinning file that some people might still have -src/component-index.js -# Auto-generated file -src/modules.ts -src/modules.js -# Test result files -/playwright/test-results/ -/playwright/html-report/ - -# Shared components generated files -/packages/shared-components/dist/ -/packages/shared-components/src/i18n/i18nKeys.d.ts -/packages/shared-components/typedoc/ diff --git a/apps/web/.eslintrc.cjs b/apps/web/.eslintrc.cjs deleted file mode 100644 index 84c6d8dda9b..00000000000 --- a/apps/web/.eslintrc.cjs +++ /dev/null @@ -1,355 +0,0 @@ -/* -Copyright 2025 Element Creations Ltd. - -SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial -Please see LICENSE files in the repository root for full details. -*/ - -module.exports = { - plugins: ["matrix-org", "eslint-plugin-react-compiler"], - extends: ["plugin:matrix-org/babel", "plugin:matrix-org/react", "plugin:matrix-org/a11y"], - parserOptions: { - project: ["./tsconfig.json"], - tsconfigRootDir: __dirname, - }, - env: { - browser: true, - node: true, - }, - globals: { - LANGUAGES_FILE: "readonly", - }, - rules: { - // Things we do that break the ideal style - "no-constant-condition": "off", - "prefer-promise-reject-errors": "off", - "no-async-promise-executor": "off", - "no-extra-boolean-cast": "off", - - // Bind or arrow functions in props causes performance issues (but we - // currently use them in some places). - // It's disabled here, but we should using it sparingly. - "react/jsx-no-bind": "off", - "react/jsx-key": ["error"], - - "no-restricted-properties": [ - "error", - ...buildRestrictedPropertiesOptions( - ["window.innerHeight", "window.innerWidth", "window.visualViewport"], - "Use UIStore to access window dimensions instead.", - ), - ...buildRestrictedPropertiesOptions( - ["React.forwardRef", "*.forwardRef", "forwardRef"], - "Use ref props instead.", - ), - ...buildRestrictedPropertiesOptions( - ["*.mxcUrlToHttp", "*.getHttpUriForMxc"], - "Use Media helper instead to centralise access for customisation.", - ), - ...buildRestrictedPropertiesOptions(["window.setImmediate"], "Use setTimeout instead."), - ], - "no-restricted-globals": [ - "error", - { - name: "setImmediate", - message: "Use setTimeout instead.", - }, - { - name: "Buffer", - message: "Buffer is not available in the web.", - }, - ], - - "import/no-duplicates": ["error"], - // Ban matrix-js-sdk/src imports in favour of matrix-js-sdk/src/matrix imports to prevent unleashing hell. - // Ban compound-design-tokens raw svg imports in favour of their React component counterparts - "no-restricted-imports": [ - "error", - { - paths: [ - { - name: "react", - importNames: ["forwardRef"], - message: "Use ref props instead.", - }, - { - name: "@testing-library/react", - message: "Please use jest-matrix-react instead", - }, - { - name: "matrix-js-sdk", - message: "Please use matrix-js-sdk/src/matrix instead", - }, - { - name: "matrix-js-sdk/", - message: "Please use matrix-js-sdk/src/matrix instead", - }, - { - name: "matrix-js-sdk/src", - message: "Please use matrix-js-sdk/src/matrix instead", - }, - { - name: "matrix-js-sdk/src/", - message: "Please use matrix-js-sdk/src/matrix instead", - }, - { - name: "matrix-js-sdk/src/index", - message: "Please use matrix-js-sdk/src/matrix instead", - }, - { - name: "emojibase-regex", - message: - "This regex doesn't actually test for emoji. See the docs at https://emojibase.dev/docs/regex/ and prefer our own EMOJI_REGEX from HtmlUtils.", - }, - ], - patterns: [ - { - group: [ - "matrix-js-sdk/src/**", - "!matrix-js-sdk/src/matrix", - "!matrix-js-sdk/src/crypto-api", - "!matrix-js-sdk/src/types", - "!matrix-js-sdk/src/testing", - "!matrix-js-sdk/src/utils/**", - "matrix-js-sdk/src/utils/internal/**", - "matrix-js-sdk/lib", - "matrix-js-sdk/lib/", - "matrix-js-sdk/lib/**", - // XXX: Temporarily allow these as they are not available via the main export - "!matrix-js-sdk/src/logger", - "!matrix-js-sdk/src/errors", - "!matrix-js-sdk/src/utils", - "!matrix-js-sdk/src/version-support", - "!matrix-js-sdk/src/randomstring", - "!matrix-js-sdk/src/sliding-sync", - "!matrix-js-sdk/src/browser-index", - "!matrix-js-sdk/src/feature", - "!matrix-js-sdk/src/NamespacedValue", - "!matrix-js-sdk/src/ReEmitter", - "!matrix-js-sdk/src/event-mapper", - "!matrix-js-sdk/src/interactive-auth", - "!matrix-js-sdk/src/secret-storage", - "!matrix-js-sdk/src/room-hierarchy", - "!matrix-js-sdk/src/rendezvous", - "!matrix-js-sdk/src/indexeddb-worker", - "!matrix-js-sdk/src/pushprocessor", - "!matrix-js-sdk/src/extensible_events_v1", - "!matrix-js-sdk/src/extensible_events_v1/PollStartEvent", - "!matrix-js-sdk/src/extensible_events_v1/PollResponseEvent", - "!matrix-js-sdk/src/extensible_events_v1/PollEndEvent", - "!matrix-js-sdk/src/extensible_events_v1/InvalidEventError", - "!matrix-js-sdk/src/oidc", - "!matrix-js-sdk/src/oidc/discovery", - "!matrix-js-sdk/src/oidc/authorize", - "!matrix-js-sdk/src/oidc/validate", - "!matrix-js-sdk/src/oidc/error", - "!matrix-js-sdk/src/oidc/register", - "!matrix-js-sdk/src/webrtc", - "!matrix-js-sdk/src/webrtc/call", - "!matrix-js-sdk/src/webrtc/callFeed", - "!matrix-js-sdk/src/webrtc/mediaHandler", - "!matrix-js-sdk/src/webrtc/callEventTypes", - "!matrix-js-sdk/src/webrtc/callEventHandler", - "!matrix-js-sdk/src/webrtc/groupCallEventHandler", - "!matrix-js-sdk/src/models", - "!matrix-js-sdk/src/models/read-receipt", - "!matrix-js-sdk/src/models/relations-container", - "!matrix-js-sdk/src/models/related-relations", - "!matrix-js-sdk/src/matrixrtc", - ], - message: "Please use matrix-js-sdk/src/matrix instead", - }, - { - group: ["emojibase-regex/emoji*"], - message: - "This regex doesn't actually test for emoji. See the docs at https://emojibase.dev/docs/regex/ and prefer our own EMOJI_REGEX from HtmlUtils.", - }, - { - group: ["@vector-im/compound-design-tokens/icons/*"], - message: "Please use @vector-im/compound-design-tokens/assets/web/icons/* instead", - }, - { - group: ["**/packages/shared-components/**", "../packages/shared-components/**"], - message: "Please use @element-hq/web-shared-components", - }, - ], - }, - ], - - // There are too many a11y violations to fix at once - // Turn violated rules off until they are fixed - "jsx-a11y/aria-activedescendant-has-tabindex": "off", - "jsx-a11y/click-events-have-key-events": "off", - "jsx-a11y/interactive-supports-focus": "off", - "jsx-a11y/media-has-caption": "off", - "jsx-a11y/mouse-events-have-key-events": "off", - "jsx-a11y/no-autofocus": "off", - "jsx-a11y/no-noninteractive-element-interactions": "off", - "jsx-a11y/no-noninteractive-element-to-interactive-role": "off", - "jsx-a11y/no-noninteractive-tabindex": "off", - "jsx-a11y/no-static-element-interactions": "off", - "jsx-a11y/role-supports-aria-props": "off", - - "matrix-org/require-copyright-header": "error", - - "react-compiler/react-compiler": "error", - }, - overrides: [ - { - files: ["src/**/*.{ts,tsx}", "test/**/*.{ts,tsx}", "playwright/**/*.ts", "*.ts"], - extends: ["plugin:matrix-org/typescript", "plugin:matrix-org/react"], - rules: { - "@typescript-eslint/unbound-method": ["error", { ignoreStatic: true }], - "@typescript-eslint/explicit-function-return-type": [ - "error", - { - allowExpressions: true, - }, - ], - - // Things we do that break the ideal style - "prefer-promise-reject-errors": "off", - "no-extra-boolean-cast": "off", - - // Remove Babel things manually due to override limitations - "@babel/no-invalid-this": ["off"], - - // We're okay being explicit at the moment - "@typescript-eslint/no-empty-interface": "off", - // We disable this while we're transitioning - "@typescript-eslint/no-explicit-any": "off", - // We'd rather not do this but we do - "@typescript-eslint/ban-ts-comment": "off", - // We're okay with assertion errors when we ask for them - "@typescript-eslint/no-non-null-assertion": "off", - "@typescript-eslint/no-empty-object-type": [ - "error", - { - // We do this sometimes to brand interfaces - allowInterfaces: "with-single-extends", - }, - ], - }, - }, - { - files: [ - "src/**/*.test.{ts,tsx}", - "src/test/**/*.{ts,tsx}", - "src/**/__mocks__/*.{ts,tsx}", - "test/**/*.{ts,tsx}", - "playwright/**/*.ts", - ], - extends: [], - rules: { - // We don't need super strict typing in test utilities - "@typescript-eslint/explicit-function-return-type": "off", - "@typescript-eslint/explicit-member-accessibility": "off", - "@typescript-eslint/no-empty-object-type": "off", - "@typescript-eslint/unbound-method": "off", - // These are fine in tests - "no-restricted-globals": "off", - "react-compiler/react-compiler": "off", - }, - }, - { - files: ["test/**/*.{ts,tsx}"], - extends: ["plugin:matrix-org/jest"], - rules: { - // Disabled tests are a reality for now but as soon as all of the xits are - // eliminated, we should enforce this. - "jest/no-disabled-tests": "off", - // Also treat "oldBackendOnly" as a test function. - // Used in some crypto tests. - "jest/no-standalone-expect": [ - "error", - { - additionalTestBlockFunctions: ["beforeAll", "beforeEach", "oldBackendOnly"], - }, - ], - }, - }, - { - files: ["playwright/**/*.ts"], - parserOptions: { - project: ["./playwright/tsconfig.json"], - }, - rules: { - "react-hooks/rules-of-hooks": ["off"], - "@typescript-eslint/no-floating-promises": ["error"], - }, - }, - { - files: ["module_system/**/*.{ts,tsx}"], - parserOptions: { - project: ["./tsconfig.module_system.json"], - }, - extends: ["plugin:matrix-org/typescript", "plugin:matrix-org/react"], - // NOTE: These rules are frozen and new rules should not be added here. - // New changes belong in https://github.com/matrix-org/eslint-plugin-matrix-org/ - rules: { - // Things we do that break the ideal style - "prefer-promise-reject-errors": "off", - "quotes": "off", - - // We disable this while we're transitioning - "@typescript-eslint/no-explicit-any": "off", - // We're okay with assertion errors when we ask for them - "@typescript-eslint/no-non-null-assertion": "off", - - // Ban matrix-js-sdk/src imports in favour of matrix-js-sdk/src/matrix imports to prevent unleashing hell. - "no-restricted-imports": [ - "error", - { - paths: [ - { - name: "matrix-js-sdk", - message: "Please use matrix-js-sdk/src/matrix instead", - }, - { - name: "matrix-js-sdk/", - message: "Please use matrix-js-sdk/src/matrix instead", - }, - { - name: "matrix-js-sdk/src", - message: "Please use matrix-js-sdk/src/matrix instead", - }, - { - name: "matrix-js-sdk/src/", - message: "Please use matrix-js-sdk/src/matrix instead", - }, - { - name: "matrix-js-sdk/src/index", - message: "Please use matrix-js-sdk/src/matrix instead", - }, - ], - patterns: [ - { - group: ["matrix-js-sdk/lib", "matrix-js-sdk/lib/", "matrix-js-sdk/lib/**"], - message: "Please use matrix-js-sdk/src/* instead", - }, - ], - }, - ], - }, - }, - ], - settings: { - react: { - version: "detect", - }, - }, -}; - -function buildRestrictedPropertiesOptions(properties, message) { - return properties.map((prop) => { - let [object, property] = prop.split("."); - if (object === "*") { - object = undefined; - } - return { - object, - property, - message, - }; - }); -} diff --git a/apps/web/.lintstagedrc b/apps/web/.lintstagedrc index b417cb03624..ae8a7fc7e94 100644 --- a/apps/web/.lintstagedrc +++ b/apps/web/.lintstagedrc @@ -1,7 +1,5 @@ { "*": "oxfmt --no-error-on-unmatched-pattern", - "src/**/*.(ts|tsx)": ["eslint --fix"], - "scripts/**/*.(ts|tsx)": ["eslint --fix"], - "module_system/**/*.(ts|tsx)": ["eslint --fix"], + "*.{js,jsx,ts,tsx,mjs,cjs}": "oxlint --no-error-on-unmatched-pattern", "*.pcss": ["stylelint --fix"] } diff --git a/apps/web/package.json b/apps/web/package.json index 57fee81ac79..354a253b66d 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -24,9 +24,7 @@ "vendor:jitsi": "curl -s https://meet.element.io/libs/external_api.min.js > ./res/jitsi_external_api.min.js", "dist": "./scripts/package.sh", "start": "nx start", - "lint": "pnpm lint:types && pnpm lint:js && pnpm lint:style", - "lint:js": "eslint --max-warnings 0 src test playwright module_system", - "lint:js-fix": "eslint --fix src test playwright module_system", + "lint": "pnpm lint:types && pnpm lint:style", "lint:types": "nx lint:types", "lint:style": "stylelint \"res/css/**/*.pcss\"", "test": "nx test:unit", @@ -110,8 +108,6 @@ }, "devDependencies": { "@babel/core": "^7.12.10", - "@babel/eslint-parser": "^7.12.10", - "@babel/eslint-plugin": "^7.12.10", "@babel/plugin-proposal-decorators": "^7.25.9", "@babel/plugin-proposal-export-default-from": "^7.12.1", "@babel/plugin-syntax-dynamic-import": "^7.8.3", @@ -135,7 +131,6 @@ "@playwright/test": "catalog:", "@principalstudio/html-webpack-inject-preload": "^1.2.7", "@sentry/webpack-plugin": "^5.0.0", - "@stylistic/eslint-plugin": "^5.0.0", "@svgr/webpack": "^8.0.0", "@testing-library/dom": "^10.4.0", "@testing-library/jest-dom": "^6.4.8", @@ -165,8 +160,6 @@ "@types/semver": "^7.5.8", "@types/tar-js": "^0.3.5", "@types/ua-parser-js": "^0.7.36", - "@typescript-eslint/eslint-plugin": "^8.19.0", - "@typescript-eslint/parser": "^8.19.0", "@vitest/spy": "catalog:", "babel-jest": "^30.0.0", "babel-loader": "^10.0.0", @@ -176,17 +169,6 @@ "css-loader": "^7.0.0", "css-minimizer-webpack-plugin": "^8.0.0", "dotenv": "^17.0.0", - "eslint": "8.57.1", - "eslint-config-google": "^0.14.0", - "eslint-plugin-deprecate": "0.9.0", - "eslint-plugin-import": "^2.25.4", - "eslint-plugin-jest": "^29.0.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-matrix-org": "^3.0.0", - "eslint-plugin-react": "^7.28.0", - "eslint-plugin-react-compiler": "^19.0.0-beta-df7b47d-20241124", - "eslint-plugin-react-hooks": "^7.0.0", - "eslint-plugin-unicorn": "^56.0.0", "express": "^5.0.0", "fake-indexeddb": "^6.0.0", "file-loader": "^6.0.0", diff --git a/apps/web/playwright/tsconfig.json b/apps/web/playwright/tsconfig.json index 85ab919b487..00f45c05054 100644 --- a/apps/web/playwright/tsconfig.json +++ b/apps/web/playwright/tsconfig.json @@ -10,7 +10,8 @@ "allowImportingTsExtensions": true, "strictNullChecks": false, "noImplicitAny": false, - "types": ["node"] + "types": ["node"], + "noEmit": true }, "include": [ "**/*.ts", diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json index 6cb24220756..16e41c0535e 100644 --- a/apps/web/tsconfig.json +++ b/apps/web/tsconfig.json @@ -11,7 +11,7 @@ "target": "es2022", "noUnusedLocals": true, "sourceMap": false, - "outDir": "./lib", + "noEmit": true, "declaration": true, "jsx": "react", "lib": ["es2022", "es2024.promise", "dom", "dom.iterable", "ESNext.Collection"], diff --git a/modules/.eslintrc.cjs b/modules/.eslintrc.cjs deleted file mode 100644 index 0c4c544a6a9..00000000000 --- a/modules/.eslintrc.cjs +++ /dev/null @@ -1,75 +0,0 @@ -module.exports = { - plugins: ["matrix-org", "eslint-plugin-react-compiler"], - extends: ["plugin:matrix-org/typescript", "plugin:matrix-org/react", "plugin:matrix-org/a11y"], - parserOptions: { - project: true, - }, - env: { - browser: true, - node: true, - }, - rules: { - "react/jsx-key": ["error"], - - "no-restricted-properties": [ - "error", - ...buildRestrictedPropertiesOptions( - ["window.innerHeight", "window.innerWidth", "window.visualViewport"], - "Use UIStore to access window dimensions instead.", - ), - ...buildRestrictedPropertiesOptions( - ["*.mxcUrlToHttp", "*.getHttpUriForMxc"], - "Use Media helper instead to centralise access for customisation.", - ), - ...buildRestrictedPropertiesOptions(["window.setImmediate"], "Use setTimeout instead."), - ], - "no-restricted-globals": [ - "error", - { - name: "setImmediate", - message: "Use setTimeout instead.", - }, - { - name: "Buffer", - message: "Buffer is not available in the web.", - }, - ], - - "import/no-duplicates": ["error"], - "matrix-org/require-copyright-header": "error", - - "react-compiler/react-compiler": "error", - }, - overrides: [ - { - files: ["playwright/**/*.ts", "*/e2e/**/*.{ts,tsx}", "*/src/**/*.test.{ts,tsx}"], - rules: { - // This is necessary for Playwright fixtures - "no-empty-pattern": "off", - // This is necessary for Playwright fixtures - "react-hooks/rules-of-hooks": "off", - // This just gets annoying in test code - "@typescript-eslint/explicit-function-return-type": "off", - }, - }, - ], - settings: { - react: { - version: "19", - }, - }, -}; - -function buildRestrictedPropertiesOptions(properties, message) { - return properties.map((prop) => { - let [object, property] = prop.split("."); - if (object === "*") { - object = undefined; - } - return { - object, - property, - message, - }; - }); -} diff --git a/modules/banner/tsconfig.json b/modules/banner/tsconfig.json index ada1a94c2af..4678d3975af 100644 --- a/modules/banner/tsconfig.json +++ b/modules/banner/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "../tsconfig.json", "compilerOptions": { - "outDir": "lib", + "noEmit": true, "jsx": "react-jsx" }, "include": ["src"] diff --git a/modules/package.json b/modules/package.json index 981a9227418..7f18fa985b1 100644 --- a/modules/package.json +++ b/modules/package.json @@ -3,21 +3,13 @@ "version": "0.0.0", "type": "module", "scripts": { - "lint:js": "eslint --max-warnings 0 playwright */src -c ./.eslintrc.cjs", "lint:types": "nx lint:types --", "test:playwright": "nx test:playwright --", "test:playwright:open": "nx test:playwright -- --ui", "test:playwright:screenshots": "nx test:playwright:screenshots --" }, "devDependencies": { - "@element-hq/element-web-playwright-common": "workspace:*", - "eslint": "8", - "eslint-config-google": "^0.14.0", - "eslint-plugin-jsx-a11y": "^6.10.2", - "eslint-plugin-matrix-org": "^3.0.0", - "eslint-plugin-react": "^7.37.5", - "eslint-plugin-react-compiler": "^19.1.0-rc.2", - "eslint-plugin-unicorn": "^56.0.0" + "@element-hq/element-web-playwright-common": "workspace:*" }, "private": true } diff --git a/modules/tsconfig.json b/modules/tsconfig.json index d1b893ecd8d..03d3f708a87 100644 --- a/modules/tsconfig.json +++ b/modules/tsconfig.json @@ -10,7 +10,8 @@ "moduleResolution": "bundler", "module": "ESNext", "allowImportingTsExtensions": true, - "skipLibCheck": true + "skipLibCheck": true, + "noEmit": true }, "include": ["playwright.config.ts", "playwright"] } diff --git a/modules/widget-toggles/tsconfig.json b/modules/widget-toggles/tsconfig.json index ada1a94c2af..32abda69d76 100644 --- a/modules/widget-toggles/tsconfig.json +++ b/modules/widget-toggles/tsconfig.json @@ -1,8 +1,8 @@ { "extends": "../tsconfig.json", "compilerOptions": { - "outDir": "lib", - "jsx": "react-jsx" + "jsx": "react-jsx", + "noEmit": true }, "include": ["src"] } diff --git a/oxlint.config.ts b/oxlint.config.ts new file mode 100644 index 00000000000..0a56abe5dbf --- /dev/null +++ b/oxlint.config.ts @@ -0,0 +1,448 @@ +import { defineConfig } from "oxlint"; + +const defaultRestrictedProperties = [ + { object: "window", property: "setImmediate", message: "Use setTimeout instead" }, + // TODO we will enable this in a follow up PR + // ...buildRestrictedPropertiesOptions(["React.forwardRef", "*.forwardRef", "forwardRef"], "Use ref props instead."), +] as const; +const defaultRestrictedGlobals = [ + { + name: "setImmediate", + message: "Use setTimeout instead.", + }, +]; + +export default defineConfig({ + $schema: "./node_modules/oxlint/configuration_schema.json", + plugins: [ + "eslint", + "typescript", + "unicorn", + "import", + "jsdoc", + "node", + "promise", + "vitest", + "react", + "react-perf", + "jsx-a11y", + ], + categories: { + correctness: "error", + perf: "error", + }, + options: { + typeAware: true, + reportUnusedDisableDirectives: "off", + maxWarnings: 0, + denyWarnings: true, + }, + env: { + es6: true, + }, + ignorePatterns: [ + "**/lib", + "**/dist", + "**/node_modules", + "**/coverage", + "apps/web/src/vector/modernizr.cjs", + // Legacy skinning file that some people might still have + "apps/web/src/component-index.js", + // Auto-generated files + "apps/web/src/modules.ts", + "apps/web/src/modules.js", + // Test result files + "**/test-results", + "**/html-report", + // Shared components generated files + "/packages/shared-components/dist/", + "/packages/shared-components/src/i18n/i18nKeys.d.ts", + "/packages/shared-components/typedoc/", + ], + settings: { + jsdoc: { + tagNamePreference: { + remark: "remarks", + privateRemarks: "privateRemarks", + experimental: "experimental", + deprecated: "deprecated", + typeParam: "typeParam", + defaultValue: "defaultValue", + packageDocumentation: "packageDocumentation", + alpha: "alpha", + knipignore: "knipignore", + resolves: "resolves", + }, + }, + }, + rules: { + "no-constant-condition": ["error", { checkLoops: "allExceptWhileTrue" }], + "typescript/unbound-method": ["error", { ignoreStatic: true }], + "typescript/no-empty-object-type": [ + "error", + { + allowInterfaces: "with-single-extends", + }, + ], + "prefer-const": ["error", { destructuring: "all" }], + "import/first": "error", + + "unicorn/no-instanceof-array": "error", + "no-restricted-globals": ["error", ...defaultRestrictedGlobals], + "no-restricted-properties": ["error", ...defaultRestrictedProperties], + "import/no-duplicates": ["error"], + + // Allow the use of underscore to show args are not used. + // This is helpful for seeing that a function implements + // an interface but won't be using one of it's arguments. + "typescript/no-unused-vars": ["error", { args: "none", ignoreRestSiblings: true }], + + // Disable some rules here, but they are enabled for src + "typescript/explicit-function-return-type": "off", + "typescript/explicit-member-accessibility": "off", + + // Require us to be more explicit about type conversions to help prevent bugs + "typescript/no-base-to-string": ["error"], + + // Prevent invalid non-type re-exports of types, these can cause downstream build failures + "typescript/consistent-type-exports": ["error"], + + // Prevent unnecessary runtime dependencies between files + "typescript/consistent-type-imports": ["error", { fixStyle: "inline-type-imports" }], + + // Disable some perf rules + "no-await-in-loop": "off", + + // Disable some opinionated rules + "unicorn/switch-case-braces": "off", + "sort-keys": "off", + "typescript/require-array-sort-compare": "off", + "eslint/no-extra-boolean-cast": "off", + + // These would be nice to enable at some point + "unicorn/prefer-set-has": "off", + "unicorn/prefer-string-slice": "off", + "unicorn/prefer-number-properties": "off", + "unicorn/prefer-at": "off", + "unicorn/no-new-array": "off", + "unicorn/no-array-for-each": "off", + "unicorn/explicit-length-check": "off", + "unicorn/catch-error-name": "off", + "require-unicode-regexp": "off", + "typescript/restrict-template-expressions": "off", + "typescript/no-redundant-type-constituents": "off", + "typescript/no-useless-default-assignment": "off", + "typescript/no-duplicate-type-constituents": "off", + "no-unused-vars": "off", + "eslint/no-unused-vars": "off", + "typescript/no-floating-promises": "off", + "typescript/no-implied-eval": "off", + "typescript/no-misused-spread": "off", + "promise/valid-params": "off", + "no-extra-boolean-cast": "off", + "react-perf/jsx-no-new-function-as-prop": "off", + "react-perf/jsx-no-new-object-as-prop": "off", + "react-perf/jsx-no-jsx-as-prop": "off", + "jsx-a11y/prefer-tag-over-role": "off", + "jsx-a11y/no-autofocus": "off", + "react/no-children-prop": "off", + "jsx-a11y/no-noninteractive-tabindex": "off", + "react-perf/jsx-no-new-array-as-prop": "off", + "react/no-did-update-set-state": "off", + "react/no-did-mount-set-state": "off", + "jsx-a11y/interactive-supports-focus": "off", + "jsx-a11y/no-static-element-interactions": "off", + "jsx-a11y/click-events-have-key-events": "off", + "vitest/no-conditional-tests": "off", + "jsx-a11y/no-noninteractive-element-interactions": "off", + "react/no-array-index-key": "off", + "jsx-a11y/control-has-associated-label": "off", + "jsx-a11y/role-supports-aria-props": "off", + "jsx-a11y/media-has-caption": "off", + "jsx-a11y/no-noninteractive-element-to-interactive-role": "off", + "jsx-a11y/aria-activedescendant-has-tabindex": "off", + "jsx-a11y/role-has-required-aria-props": "off", + }, + overrides: [ + { + files: ["apps/web/src/**/*"], + rules: { + "no-restricted-properties": [ + "error", + ...defaultRestrictedProperties, + ...buildRestrictedPropertiesOptions( + ["window.innerHeight", "window.innerWidth", "window.visualViewport"], + "Use UIStore to access window dimensions instead.", + ), + ...buildRestrictedPropertiesOptions( + ["*.mxcUrlToHttp", "*.getHttpUriForMxc"], + "Use Media helper instead to centralise access for customisation.", + ), + ], + + // Ban matrix-js-sdk/src imports in favour of matrix-js-sdk/src/matrix imports to prevent unleashing hell. + // Ban compound-design-tokens raw svg imports in favour of their React component counterparts + "no-restricted-imports": [ + "error", + { + paths: [ + { + name: "react", + importNames: ["forwardRef"], + message: "Use ref props instead.", + }, + { + name: "@testing-library/react", + message: "Please use jest-matrix-react instead", + }, + { + name: "matrix-js-sdk", + message: "Please use matrix-js-sdk/src/matrix instead", + }, + { + name: "matrix-js-sdk/", + message: "Please use matrix-js-sdk/src/matrix instead", + }, + { + name: "matrix-js-sdk/src", + message: "Please use matrix-js-sdk/src/matrix instead", + }, + { + name: "matrix-js-sdk/src/", + message: "Please use matrix-js-sdk/src/matrix instead", + }, + { + name: "matrix-js-sdk/src/index", + message: "Please use matrix-js-sdk/src/matrix instead", + }, + { + name: "emojibase-regex", + message: + "This regex doesn't actually test for emoji. See the docs at https://emojibase.dev/docs/regex/ and prefer our own EMOJI_REGEX from HtmlUtils.", + }, + ], + patterns: [ + { + group: [ + "matrix-js-sdk/src/**", + "!matrix-js-sdk/src/matrix", + "!matrix-js-sdk/src/crypto-api", + "!matrix-js-sdk/src/types", + "!matrix-js-sdk/src/testing", + "!matrix-js-sdk/src/utils/**", + "matrix-js-sdk/src/utils/internal/**", + "matrix-js-sdk/lib", + "matrix-js-sdk/lib/", + "matrix-js-sdk/lib/**", + // XXX: Temporarily allow these as they are not available via the main export + "!matrix-js-sdk/src/logger", + "!matrix-js-sdk/src/errors", + "!matrix-js-sdk/src/utils", + "!matrix-js-sdk/src/version-support", + "!matrix-js-sdk/src/randomstring", + "!matrix-js-sdk/src/sliding-sync", + "!matrix-js-sdk/src/browser-index", + "!matrix-js-sdk/src/feature", + "!matrix-js-sdk/src/NamespacedValue", + "!matrix-js-sdk/src/ReEmitter", + "!matrix-js-sdk/src/event-mapper", + "!matrix-js-sdk/src/interactive-auth", + "!matrix-js-sdk/src/secret-storage", + "!matrix-js-sdk/src/room-hierarchy", + "!matrix-js-sdk/src/rendezvous", + "!matrix-js-sdk/src/indexeddb-worker", + "!matrix-js-sdk/src/pushprocessor", + "!matrix-js-sdk/src/extensible_events_v1", + "!matrix-js-sdk/src/extensible_events_v1/PollStartEvent", + "!matrix-js-sdk/src/extensible_events_v1/PollResponseEvent", + "!matrix-js-sdk/src/extensible_events_v1/PollEndEvent", + "!matrix-js-sdk/src/extensible_events_v1/InvalidEventError", + "!matrix-js-sdk/src/oidc", + "!matrix-js-sdk/src/oidc/discovery", + "!matrix-js-sdk/src/oidc/authorize", + "!matrix-js-sdk/src/oidc/validate", + "!matrix-js-sdk/src/oidc/error", + "!matrix-js-sdk/src/oidc/register", + "!matrix-js-sdk/src/webrtc", + "!matrix-js-sdk/src/webrtc/call", + "!matrix-js-sdk/src/webrtc/callFeed", + "!matrix-js-sdk/src/webrtc/mediaHandler", + "!matrix-js-sdk/src/webrtc/callEventTypes", + "!matrix-js-sdk/src/webrtc/callEventHandler", + "!matrix-js-sdk/src/webrtc/groupCallEventHandler", + "!matrix-js-sdk/src/models", + "!matrix-js-sdk/src/models/read-receipt", + "!matrix-js-sdk/src/models/relations-container", + "!matrix-js-sdk/src/models/related-relations", + "!matrix-js-sdk/src/matrixrtc", + ], + message: "Please use matrix-js-sdk/src/matrix instead", + }, + { + group: ["emojibase-regex/emoji*"], + message: + "This regex doesn't actually test for emoji. See the docs at https://emojibase.dev/docs/regex/ and prefer our own EMOJI_REGEX from HtmlUtils.", + }, + { + group: ["@vector-im/compound-design-tokens/icons/*"], + message: "Please use @vector-im/compound-design-tokens/assets/web/icons/* instead", + }, + { + group: ["**/packages/shared-components/**", "../packages/shared-components/**"], + message: "Please use @element-hq/web-shared-components", + }, + ], + }, + ], + }, + }, + { + files: ["apps/web/src/**/*", "{packages,modules}/*/src/**/*"], + rules: { + "no-restricted-globals": [ + "error", + defaultRestrictedGlobals, + { + name: "Buffer", + message: "Buffer is not available in the web.", + }, + ], + }, + }, + { + files: ["packages/shared-components/**/*"], + rules: { + "no-restricted-imports": [ + "error", + { + paths: [ + { + name: "react", + importNames: ["act"], + message: "Please use @test-utils instead.", + }, + ], + }, + ], + + // This would be good to apply globally in the future + "react/forbid-elements": [ + "error", + { + forbid: [ + { element: "h1", message: "Use Compound instead" }, + { element: "h2", message: "Use Compound instead" }, + { element: "h3", message: "Use Compound instead" }, + { element: "h4", message: "Use Compound instead" }, + { element: "h5", message: "Use Compound instead" }, + { element: "h6", message: "Use Compound instead" }, + ], + }, + ], + }, + }, + { + files: ["{packages,apps,modules/*/src/**/*"], + rules: { + "no-console": "error", + // Require method signatures to be explicit to help make signature changes more obvious in review + "typescript/explicit-function-return-type": [ + "error", + { + allowExpressions: true, + }, + ], + "typescript/explicit-member-accessibility": "error", + + "no-restricted-imports": [ + "error", + { + name: "events", + message: "Please use TypedEventEmitter instead", + }, + ], + + "react/react-compiler": "error", + }, + }, + { + files: [ + "{packages,apps,modules}/*/src/**/*.{test,stories}.{ts,tsx}", + "{packages,apps,modules}/*/src/{tests,__mocks__}/*.{ts,tsx}", + "{packages,apps,modules}/*/{test,playwright,e2e}/**/*", + "{packages,apps,modules}/*/playwright.config.ts", + "{packages,apps,modules}/*/.storybook/**/*", + "packages/playwright-common/src/**/*", + ], + rules: { + // Tests can be linted a little more flexibly + // We don't need super strict typing in test utilities + "no-empty-pattern": "off", + "no-import-assign": "off", + "no-unsafe-optional-chaining": "off", + "typescript/no-empty-object-type": "off", + "typescript/unbound-method": "off", + "typescript/no-floating-promises": "off", + "typescript/no-misused-spread": "off", + "vitest/require-mock-type-parameters": "off", + "vitest/no-disabled-tests": "off", + "vitest/no-conditional-expect": "off", + "vitest/warn-todo": "off", + "vitest/require-to-throw-message": "off", + "vitest/prefer-snapshot-hint": "off", + "vitest/no-standalone-expect": [ + "error", + { + additionalTestBlockFunctions: ["beforeAll", "beforeEach"], + }, + ], + "vitest/expect-expect": [ + "error", + { + assertFunctionNames: ["expect*", "*Test", "assert*", "test*Factory"], + }, + ], + "jsdoc/check-tag-names": "off", + + "react/jsx-no-constructed-context-values": "off", + "jsx-a11y/interactive-supports-focus": "off", + "jsx-a11y/no-static-element-interactions": "off", + "react/no-array-index-key": "off", + "jsx-a11y/click-events-have-key-events": "off", + "jsx-a11y/media-has-caption": "off", + "jsx-a11y/no-noninteractive-element-to-interactive-role": "off", + "react/forbid-elements": "off", + }, + }, + { + files: ["{packages,apps,modules}/*/src/**/*.stories.{ts,tsx}"], + jsPlugins: ["eslint-plugin-storybook"], + rules: { + "storybook/meta-satisfies-type": "error", + "storybook/default-exports": "error", + "storybook/hierarchy-separator": "error", + "storybook/no-redundant-story-name": "error", + "storybook/no-renderer-packages": "error", + "storybook/no-stories-of": "error", + "storybook/story-exports": "error", + "storybook/use-storybook-expect": "error", + "storybook/use-storybook-testing-library": "error", + "storybook/no-uninstalled-addons": "error", + }, + }, + ], +}); + +function buildRestrictedPropertiesOptions( + properties: string[], + message: string, +): { object?: string; property: string; message: string }[] { + return properties.map((prop) => { + const [object, property] = prop.split("."); + return { + object: object === "*" ? undefined : object, + property, + message, + }; + }); +} diff --git a/package.json b/package.json index d76f265bad5..dea457c0fad 100644 --- a/package.json +++ b/package.json @@ -13,9 +13,11 @@ "i18n": "pnpm -r i18n", "i18n:sort": "pnpm -r i18n:sort", "i18n:lint": "pnpm -r i18n:lint", - "lint": "pnpm -r --workspace-concurrency=1 lint:types && pnpm lint:fmt && pnpm -r lint:js && pnpm -r lint:style && pnpm lint:workflows && pnpm lint:knip", + "lint": "pnpm -r --workspace-concurrency=1 lint:types && pnpm lint:fmt && pnpm lint:js && pnpm -r lint:style && pnpm lint:workflows && pnpm lint:knip", "lint:fmt": "oxfmt --check", - "lint:fmt-fix": "oxfmt", + "lint:fmt:fix": "oxfmt", + "lint:js": "oxlint", + "lint:js:fix": "oxlint --fix", "lint:workflows": "find .github/workflows -type f \\( -iname '*.yaml' -o -iname '*.yml' \\) -print -exec action-validator {} ';'", "lint:knip": "knip --no-tag-hints && knip --strict --exclude unlisted,dependencies,binaries", "lint:unused-settings": "node scripts/find-unused-settings.ts", @@ -35,6 +37,7 @@ "@types/node": "25", "@vitest/coverage-v8": "catalog:", "cronstrue": "^3.0.0", + "eslint-plugin-storybook": "^10.4.6", "husky": "^9.0.0", "knip": "6.24.0", "lint-staged": "^17.0.0", @@ -43,6 +46,8 @@ "minimist": "^1.2.6", "nx": "23.0.1", "oxfmt": "0.56.0", + "oxlint": "^1.70.0", + "oxlint-tsgolint": "^0.23.0", "typescript": "catalog:", "vitepress": "^1.6.4", "vitepress-plugin-mermaid": "^2.0.17", diff --git a/packages/module-api/tsconfig.json b/packages/module-api/tsconfig.json index 79beeb700df..322d3c502af 100644 --- a/packages/module-api/tsconfig.json +++ b/packages/module-api/tsconfig.json @@ -10,7 +10,7 @@ "module": "es2022", "moduleResolution": "bundler", "types": [], - "outDir": "lib", + "noEmit": true, "jsx": "react-jsx", "declarationMap": true, "allowImportingTsExtensions": true diff --git a/packages/shared-components/.eslintrc.cjs b/packages/shared-components/.eslintrc.cjs deleted file mode 100644 index 1d1b657fd97..00000000000 --- a/packages/shared-components/.eslintrc.cjs +++ /dev/null @@ -1,99 +0,0 @@ -/* -Copyright 2025 Element Creations Ltd. - -SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial -Please see LICENSE files in the repository root for full details. -*/ - -module.exports = { - root: true, - plugins: ["matrix-org", "eslint-plugin-react-compiler"], - extends: [ - "plugin:matrix-org/react", - "plugin:matrix-org/a11y", - "plugin:matrix-org/typescript", - "plugin:matrix-org/react", - "plugin:storybook/recommended", - ], - parserOptions: { - project: ["./tsconfig.json"], - tsconfigRootDir: __dirname, - }, - env: { - browser: true, - node: true, - }, - rules: { - // Bind or arrow functions in props causes performance issues (but we - // currently use them in some places). - // It's disabled here, but we should using it sparingly. - "react/jsx-no-bind": "off", - "react/jsx-key": ["error"], - "matrix-org/require-copyright-header": "error", - "react-compiler/react-compiler": "error", - "no-restricted-imports": [ - "error", - { - paths: [ - { - name: "react", - importNames: ["act"], - message: "Please use @test-utils instead.", - }, - ], - }, - ], - - "@typescript-eslint/unbound-method": ["error", { ignoreStatic: true }], - "@typescript-eslint/explicit-function-return-type": [ - "error", - { - allowExpressions: true, - }, - ], - - // We're okay being explicit at the moment - // "@typescript-eslint/no-empty-interface": "off", - // We'd rather not do this but we do - // "@typescript-eslint/ban-ts-comment": "off", - // We're okay with assertion errors when we ask for them - "@typescript-eslint/no-non-null-assertion": "off", - "@typescript-eslint/no-empty-object-type": [ - "error", - { - // We do this sometimes to brand interfaces - allowInterfaces: "with-single-extends", - }, - ], - "storybook/meta-satisfies-type": "error", - - "react/forbid-elements": [ - "error", - { - forbid: [ - { element: "h1", message: "Use Compound instead" }, - { element: "h2", message: "Use Compound instead" }, - { element: "h3", message: "Use Compound instead" }, - { element: "h4", message: "Use Compound instead" }, - { element: "h5", message: "Use Compound instead" }, - { element: "h6", message: "Use Compound instead" }, - ], - }, - ], - }, - overrides: [ - { - files: ["src/**/*.test.{ts,tsx}", "src/**/*.stories.tsx"], - rules: { - "@typescript-eslint/unbound-method": "off", - "@typescript-eslint/no-explicit-any": "off", - "react/forbid-elements": "off", - }, - }, - ], - settings: { - react: { - version: "detect", - }, - }, -}; diff --git a/packages/shared-components/package.json b/packages/shared-components/package.json index cf5797a420a..6f8f2b73f7f 100644 --- a/packages/shared-components/package.json +++ b/packages/shared-components/package.json @@ -58,8 +58,7 @@ "storybook": "storybook dev -p 6007", "build:storybook": "nx storybook", "build:doc": "nx typedoc", - "lint": "pnpm lint:types && pnpm lint:js", - "lint:js": "eslint --max-warnings 0 src", + "lint": "pnpm lint:types", "lint:types": "nx lint:types" }, "dependencies": { @@ -98,7 +97,6 @@ "@storybook/addon-vitest": "^10.1.11", "@storybook/icons": "^2.0.0", "@storybook/react-vite": "^10.0.7", - "@stylistic/eslint-plugin": "^5.7.0", "@testing-library/dom": "^10.4.1", "@testing-library/react": "^16.3.2", "@testing-library/user-event": "^14.6.1", @@ -106,22 +104,9 @@ "@types/lodash": "^4.17.20", "@types/react": "catalog:", "@types/react-dom": "catalog:", - "@typescript-eslint/eslint-plugin": "^8.53.1", - "@typescript-eslint/parser": "^8.53.1", "@vector-im/compound-web": "catalog:", "@vitejs/plugin-react": "catalog:", "@vitest/browser-playwright": "catalog:", - "eslint": "8", - "eslint-config-google": "^0.14.0", - "eslint-plugin-deprecate": "^0.9.0", - "eslint-plugin-import": "^2.32.0", - "eslint-plugin-jsx-a11y": "^6.10.2", - "eslint-plugin-matrix-org": "^3.0.0", - "eslint-plugin-react": "^7.37.5", - "eslint-plugin-react-compiler": "^19.1.0-rc.2", - "eslint-plugin-react-hooks": "^7.0.1", - "eslint-plugin-storybook": "^10.0.7", - "eslint-plugin-unicorn": "^56.0.0", "oxfmt": "0.56.0", "storybook": "^10.0.7", "storybook-addon-vis": "^4.0.0", diff --git a/packages/shared-components/tsconfig.json b/packages/shared-components/tsconfig.json index 2691b1f20cc..1915d5b02e7 100644 --- a/packages/shared-components/tsconfig.json +++ b/packages/shared-components/tsconfig.json @@ -18,7 +18,8 @@ "strict": true, "paths": { "@test-utils": ["./src/test/utils/index"] - } + }, + "noEmit": true }, "include": ["./src/**/*.ts", "./src/**/*.tsx", ".storybook/*.ts", ".storybook/*.tsx"], "references": [{ "path": "./tsconfig.node.json" }] diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index eb0038257dc..2bd22234068 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -324,6 +324,9 @@ importers: cronstrue: specifier: ^3.0.0 version: 3.24.0 + eslint-plugin-storybook: + specifier: ^10.4.6 + version: 10.4.6(eslint@10.6.0(jiti@2.7.0))(storybook@10.4.6(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@2.8.8)(react@19.2.7))(typescript@6.0.3) husky: specifier: ^9.0.0 version: 9.1.7 @@ -348,15 +351,21 @@ importers: oxfmt: specifier: 0.56.0 version: 0.56.0 + oxlint: + specifier: ^1.70.0 + version: 1.72.0(oxlint-tsgolint@0.23.0) + oxlint-tsgolint: + specifier: ^0.23.0 + version: 0.23.0 typescript: specifier: 6.0.3 version: 6.0.3 vitepress: specifier: ^1.6.4 - 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.16)(qrcode@1.5.4)(search-insights@2.17.3)(sugarss@5.0.1(postcss@8.5.16))(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.16)(qrcode@1.5.4)(react@19.2.7)(search-insights@2.17.3)(sugarss@5.0.1(postcss@8.5.16))(terser@5.48.0)(typescript@6.0.3) vitepress-plugin-mermaid: specifier: ^2.0.17 - version: 2.0.17(mermaid@11.16.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.16)(qrcode@1.5.4)(search-insights@2.17.3)(sugarss@5.0.1(postcss@8.5.16))(terser@5.48.0)(typescript@6.0.3)) + version: 2.0.17(mermaid@11.16.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.16)(qrcode@1.5.4)(react@19.2.7)(search-insights@2.17.3)(sugarss@5.0.1(postcss@8.5.16))(terser@5.48.0)(typescript@6.0.3)) vitest: specifier: 'catalog:' version: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@25.9.3)(@vitest/browser-playwright@4.1.9)(@vitest/coverage-v8@4.1.9)(happy-dom@20.10.6)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.1.3(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.16))(terser@5.48.0)(yaml@2.8.4)) @@ -409,9 +418,6 @@ importers: '@playwright/test': specifier: 'catalog:' version: 1.61.1 - '@stylistic/eslint-plugin': - specifier: ^5.0.0 - version: 5.10.0(eslint@8.57.1) '@types/auto-launch': specifier: ^5.0.1 version: 5.0.5(patch_hash=b60dc9846a11a1684ce52c55493f29ea398d3dc44b88f66ab44e9843d6c01538) @@ -427,12 +433,6 @@ importers: '@types/pacote': specifier: ^11.1.1 version: 11.1.8 - '@typescript-eslint/eslint-plugin': - specifier: ^8.0.0 - version: 8.61.0(@typescript-eslint/parser@8.62.1(eslint@8.57.1)(typescript@6.0.3))(eslint@8.57.1)(typescript@6.0.3) - '@typescript-eslint/parser': - specifier: ^8.0.0 - version: 8.62.1(eslint@8.57.1)(typescript@6.0.3) app-builder-lib: specifier: 26.15.3 version: 26.15.3(dmg-builder@26.15.3)(electron-builder-squirrel-windows@26.15.3) @@ -454,24 +454,6 @@ importers: electron-devtools-installer: specifier: ^4.0.0 version: 4.0.0 - eslint: - specifier: ^8.26.0 - version: 8.57.1 - eslint-config-google: - specifier: ^0.14.0 - version: 0.14.0(eslint@8.57.1) - eslint-plugin-import: - specifier: ^2.25.4 - version: 2.32.0(@typescript-eslint/parser@8.62.1(eslint@8.57.1)(typescript@6.0.3))(eslint@8.57.1) - eslint-plugin-matrix-org: - specifier: ^3.0.0 - version: 3.0.0(6cbc0a21b6f2e971abd0652e23c76f39) - eslint-plugin-n: - specifier: ^17.12.0 - version: 17.24.0(eslint@8.57.1)(typescript@6.0.3) - eslint-plugin-unicorn: - specifier: ^56.0.0 - version: 56.0.1(eslint@8.57.1) glob: specifier: ^13.0.0 version: 13.0.6 @@ -713,12 +695,6 @@ importers: '@babel/core': specifier: ^7.12.10 version: 7.29.7 - '@babel/eslint-parser': - specifier: ^7.12.10 - version: 7.29.7(@babel/core@7.29.7)(eslint@8.57.1) - '@babel/eslint-plugin': - specifier: ^7.12.10 - version: 7.29.7(@babel/eslint-parser@7.29.7(@babel/core@7.29.7)(eslint@8.57.1))(eslint@8.57.1) '@babel/plugin-proposal-decorators': specifier: ^7.25.9 version: 7.29.7(@babel/core@7.29.7) @@ -788,9 +764,6 @@ importers: '@sentry/webpack-plugin': specifier: ^5.0.0 version: 5.3.0(webpack@5.108.3) - '@stylistic/eslint-plugin': - specifier: ^5.0.0 - version: 5.10.0(eslint@8.57.1) '@svgr/webpack': specifier: ^8.0.0 version: 8.1.0(typescript@6.0.3) @@ -878,12 +851,6 @@ importers: '@types/ua-parser-js': specifier: ^0.7.36 version: 0.7.39 - '@typescript-eslint/eslint-plugin': - specifier: ^8.19.0 - version: 8.61.0(@typescript-eslint/parser@8.62.1(eslint@8.57.1)(typescript@6.0.3))(eslint@8.57.1)(typescript@6.0.3) - '@typescript-eslint/parser': - specifier: ^8.19.0 - version: 8.62.1(eslint@8.57.1)(typescript@6.0.3) '@vitest/spy': specifier: 'catalog:' version: 4.1.9 @@ -911,39 +878,6 @@ importers: dotenv: specifier: ^17.0.0 version: 17.4.2 - eslint: - specifier: 8.57.1 - version: 8.57.1 - eslint-config-google: - specifier: ^0.14.0 - version: 0.14.0(eslint@8.57.1) - eslint-plugin-deprecate: - specifier: 0.9.0 - version: 0.9.0(eslint@8.57.1) - eslint-plugin-import: - specifier: ^2.25.4 - version: 2.32.0(@typescript-eslint/parser@8.62.1(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.61.0(@typescript-eslint/parser@8.62.1(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(6cbc0a21b6f2e971abd0652e23c76f39) - eslint-plugin-react: - specifier: ^7.28.0 - version: 7.37.5(eslint@8.57.1) - eslint-plugin-react-compiler: - specifier: ^19.0.0-beta-df7b47d-20241124 - version: 19.0.0-beta-ebf51a3-20250411(eslint@8.57.1) - eslint-plugin-react-hooks: - specifier: ^7.0.0 - version: 7.1.1(eslint@8.57.1) - eslint-plugin-unicorn: - specifier: ^56.0.0 - version: 56.0.1(eslint@8.57.1) express: specifier: ^5.0.0 version: 5.2.1 @@ -1100,27 +1034,6 @@ importers: '@element-hq/element-web-playwright-common': specifier: workspace:* version: link:../packages/playwright-common - eslint: - specifier: '8' - version: 8.57.1 - eslint-config-google: - specifier: ^0.14.0 - version: 0.14.0(eslint@8.57.1) - eslint-plugin-jsx-a11y: - specifier: ^6.10.2 - version: 6.10.2(eslint@8.57.1) - eslint-plugin-matrix-org: - specifier: ^3.0.0 - version: 3.0.0(6cbc0a21b6f2e971abd0652e23c76f39) - eslint-plugin-react: - specifier: ^7.37.5 - version: 7.37.5(eslint@8.57.1) - eslint-plugin-react-compiler: - specifier: ^19.1.0-rc.2 - version: 19.1.0-rc.2(eslint@8.57.1) - eslint-plugin-unicorn: - specifier: ^56.0.0 - version: 56.0.1(eslint@8.57.1) modules/banner: dependencies: @@ -1521,9 +1434,6 @@ importers: '@storybook/react-vite': specifier: ^10.0.7 version: 10.4.6(@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.6(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@2.8.8)(react@19.2.7))(typescript@6.0.3)(vite@8.1.3(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.16))(terser@5.48.0)(yaml@2.8.4))(webpack@5.108.3(esbuild@0.27.4)(lightningcss@1.32.0)(postcss@8.5.16)) - '@stylistic/eslint-plugin': - specifier: ^5.7.0 - version: 5.10.0(eslint@8.57.1) '@testing-library/dom': specifier: ^10.4.1 version: 10.4.1 @@ -1545,12 +1455,6 @@ importers: '@types/react-dom': specifier: ^19.2.3 version: 19.2.3(@types/react@19.2.14) - '@typescript-eslint/eslint-plugin': - specifier: ^8.53.1 - version: 8.61.0(@typescript-eslint/parser@8.62.1(eslint@8.57.1)(typescript@6.0.3))(eslint@8.57.1)(typescript@6.0.3) - '@typescript-eslint/parser': - specifier: ^8.53.1 - version: 8.62.1(eslint@8.57.1)(typescript@6.0.3) '@vector-im/compound-web': specifier: 'catalog:' version: 9.7.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) @@ -1560,39 +1464,6 @@ importers: '@vitest/browser-playwright': specifier: 'catalog:' version: 4.1.9(playwright@1.61.1)(vite@8.1.3(@types/node@25.9.3)(esbuild@0.27.4)(jiti@2.7.0)(sugarss@5.0.1(postcss@8.5.16))(terser@5.48.0)(yaml@2.8.4))(vitest@4.1.9) - eslint: - specifier: '8' - version: 8.57.1 - eslint-config-google: - specifier: ^0.14.0 - version: 0.14.0(eslint@8.57.1) - eslint-plugin-deprecate: - specifier: ^0.9.0 - version: 0.9.0(eslint@8.57.1) - eslint-plugin-import: - specifier: ^2.32.0 - version: 2.32.0(@typescript-eslint/parser@8.62.1(eslint@8.57.1)(typescript@6.0.3))(eslint@8.57.1) - eslint-plugin-jsx-a11y: - specifier: ^6.10.2 - version: 6.10.2(eslint@8.57.1) - eslint-plugin-matrix-org: - specifier: ^3.0.0 - version: 3.0.0(6cbc0a21b6f2e971abd0652e23c76f39) - eslint-plugin-react: - specifier: ^7.37.5 - version: 7.37.5(eslint@8.57.1) - eslint-plugin-react-compiler: - specifier: ^19.1.0-rc.2 - version: 19.1.0-rc.2(eslint@8.57.1) - eslint-plugin-react-hooks: - specifier: ^7.0.1 - version: 7.1.1(eslint@8.57.1) - eslint-plugin-storybook: - specifier: ^10.0.7 - version: 10.4.4(eslint@8.57.1)(storybook@10.4.6(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@2.8.8)(react@19.2.7))(typescript@6.0.3) - eslint-plugin-unicorn: - specifier: ^56.0.0 - version: 56.0.1(eslint@8.57.1) oxfmt: specifier: 0.56.0 version: 0.56.0 @@ -1770,20 +1641,6 @@ packages: resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} engines: {node: '>=6.9.0'} - '@babel/eslint-parser@7.29.7': - resolution: {integrity: sha512-zxt+UJTOMKvUt3yOg+D58MLuz334pHp93qifMFcjIIO+9hN6t+ufw2gi7vDPMpxvfnHRR+3VVXvIjineCcgyXw==} - engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} - peerDependencies: - '@babel/core': ^7.11.0 - eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 - - '@babel/eslint-plugin@7.29.7': - resolution: {integrity: sha512-9qag/N0IHYLNf0nCNvHctNGBpoY4Idr7JkPeYUf2p5J9UpvHpd+Xx6VGjHDhJKmueVBa4/cq6MPl3uxj6/8knw==} - engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} - peerDependencies: - '@babel/eslint-parser': ^7.11.0 - eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 - '@babel/generator@7.29.7': resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==} engines: {node: '>=6.9.0'} @@ -1928,13 +1785,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-proposal-private-methods@7.18.6': - resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} engines: {node: '>=6.9.0'} @@ -3153,13 +3003,25 @@ packages: resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/config-array@0.23.5': + resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/js@8.57.1': - resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/config-helpers@0.6.0': + resolution: {integrity: sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/core@1.2.1': + resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/object-schema@3.0.5': + resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/plugin-kit@0.7.2': + resolution: {integrity: sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@fetch-mock/jest@0.2.20': resolution: {integrity: sha512-DGX2bhBInodaWPMV3+UZ530aVM3wDj16sAPjFzkrwb0JwNWIQK07CNbYprQ3Tmd2ixDJeaNx2E0aNb+hRb8FFA==} @@ -3262,18 +3124,25 @@ packages: '@hapi/topo@6.0.2': resolution: {integrity: sha512-KR3rD5inZbGMrHmgPxsJ9dbi6zEK+C3ZwUwTa+eMwWLz7oijWUTWD2pMSNNYJAU6Qq+65NkxXjqHr/7LM2Xkqg==} - '@humanwhocodes/config-array@0.13.0': - resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead + '@humanfs/core@0.19.2': + resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.8': + resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} + engines: {node: '>=18.18.0'} + + '@humanfs/types@0.15.0': + resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} + engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - deprecated: Use @eslint/object-schema instead + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} '@iconify-json/simple-icons@1.2.75': resolution: {integrity: sha512-KvcCUbvcBWb0sbqLIxHoY8z5/piXY08wcY9gfMhF+ph3AfzGMaSmZFkUY71HSXAljQngXkgs4bdKdekO0HQWvg==} @@ -3666,9 +3535,6 @@ packages: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 - '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': - resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} - '@noble/hashes@1.4.0': resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} engines: {node: '>= 16'} @@ -4467,6 +4333,158 @@ packages: cpu: [x64] os: [win32] + '@oxlint-tsgolint/darwin-arm64@0.23.0': + resolution: {integrity: sha512-gOs9PVr2wEg4ox9z0aJo+RKhhImW86YL5N6yav8BK/rgPsIrwN/igSZ+pbRr723NFvUNKde9fgMhRA6JrXAOZw==} + cpu: [arm64] + os: [darwin] + + '@oxlint-tsgolint/darwin-x64@0.23.0': + resolution: {integrity: sha512-kjJ8B+7n4tB9VJdxS5A9GdJt6/bYpzbu4lXp2uO1S3sRmCB5gDEABlGoiePNApRWaW+xqL4b4xgiE727jSLhuA==} + cpu: [x64] + os: [darwin] + + '@oxlint-tsgolint/linux-arm64@0.23.0': + resolution: {integrity: sha512-6dCZuKNu135seMXilkRk9SpCx6i1XgmiipYGalLij5WVRX6ZYS8c4xI7preN/zv9fCXhsQclTIMDu2Y/cytTjw==} + cpu: [arm64] + os: [linux] + + '@oxlint-tsgolint/linux-x64@0.23.0': + resolution: {integrity: sha512-3bdilnyA7kmSTjK27rvjIjSxL5SIg3wt7vwNiRkouWB83ytssyKnuGvxSYJxgMEmFpSutzaBzcCUM2jDtPGcgA==} + cpu: [x64] + os: [linux] + + '@oxlint-tsgolint/win32-arm64@0.23.0': + resolution: {integrity: sha512-j+OEp44SVYiQ+ZD+uttsX7u6L9SvmbbQ77SO1pSFCcJlsVMeCk8qZsjhKfGKuT/jIA+ipOJMVs/+pqUfObBWNw==} + cpu: [arm64] + os: [win32] + + '@oxlint-tsgolint/win32-x64@0.23.0': + resolution: {integrity: sha512-5MyjFuqf+g8OUPJBSGWHJtmoWnzFJYyOg4To9WMQshZYEWig/vtu7JtJ03VWnzHv9LJkAUeApY0gVCOywFR/iQ==} + cpu: [x64] + os: [win32] + + '@oxlint/binding-android-arm-eabi@1.72.0': + resolution: {integrity: sha512-zhCmvn+1Mj3UchAc/90i99S0t7jJUsHmFVSPg4UWrjO8b8eaSGwscgO6QAUtvHBstkjQwBttQNswEnAF1mIQdA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxlint/binding-android-arm64@1.72.0': + resolution: {integrity: sha512-mtH+aY/ozv1eZoCUC2owjFAtyNBKHpJHygKeEu9zXXnQGW1Q2/qOpvx+I+Lf23+TvTz66F4iiXUbl2cGvoLPCQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxlint/binding-darwin-arm64@1.72.0': + resolution: {integrity: sha512-EvnajNPDtfknB3ZieeOOyDTwJn9QXDiwfnF4ZDQqART6RG6hjY4WigQcZdGoK2dkB3e1vrmEzN9aYbQCUkh/gQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxlint/binding-darwin-x64@1.72.0': + resolution: {integrity: sha512-ZkCdEa/G80A7vEHfeCDz/+L3m33DE73v32mDKhgOIgz8Uwf0DFcK7+uu6qC+7LEhmz5fpOe1osWKyjSNMydFIQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxlint/binding-freebsd-x64@1.72.0': + resolution: {integrity: sha512-NroXv2vh+sxVY1uya/rM5pjhx1hm8BzlYpx9q67QP0Xhw5MH2bf5GJylpvLEC+781p1Xli/317EoV9AlGwViag==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxlint/binding-linux-arm-gnueabihf@1.72.0': + resolution: {integrity: sha512-0NDywYgfj279Ou/BcQuCYSj7NJwBfmWn5qc5uGO/Ny7fUWmXyIpvawqX/8acQlWG6IXelJsJhj+JAy6sjsKj0A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm-musleabihf@1.72.0': + resolution: {integrity: sha512-4vpXB06h65Ezsy4hRyrGjGrfa1SkVPii09yaajiYhmVpgsFiLD+KNxIx/BNAY+XiO+i1yqp9HHdwqM8VTqa5XQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm64-gnu@1.72.0': + resolution: {integrity: sha512-immaN4g2ZGFiOkKrvRX9LvzZdd2GkQM5wR+UyzYyUuyhUTXGQ4HKUJH18xp4G8OfhCVaVAJfKZxwE1r8+4hhaQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-arm64-musl@1.72.0': + resolution: {integrity: sha512-JGHS9Mnr7iWyyLDxgCv1MhzVpAckgptg00F2gnxt/GD7lQ2SW1BRcxHqhSTaSdDpjWRrBkBxMMh4+Hn3aVtExg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxlint/binding-linux-ppc64-gnu@1.72.0': + resolution: {integrity: sha512-AOYgBZqxNshrg83P9v0RYv+m8s10Cqkj4/PxXFDhcS3k7FqsIG5+CxErshZCIN7G8iy4Y+VGfAsuEdar8AcbBg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-riscv64-gnu@1.72.0': + resolution: {integrity: sha512-QMybPS5ij3/vrKG67mqzHwW++91sYxK/PPUVi6SBtNCEzW4niS52fVBdXbQ6nou0wWbUPEpx8Sl/ZjtgE3clXA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-riscv64-musl@1.72.0': + resolution: {integrity: sha512-gOc3W7JV0PXRpIL7stUlLe3Wa9Gp0Kdlup87IT3gHDvPKck2xNgMIl/Gs2lldYY2lyXZDC4rWi3hmoLUobkgbQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxlint/binding-linux-s390x-gnu@1.72.0': + resolution: {integrity: sha512-rpGxph+FjjHcYI5q6uxB3Az+tnfmEnDbSA8+PK9ZE/VzyUAkvBOMeuY7ZQMhu5mpZH7YQDsTdW6Cx4kV/msc6w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-x64-gnu@1.72.0': + resolution: {integrity: sha512-WND+uhf/Ko13SLqQMWQUgsZuLvYYEvL0ZKgg0tgGYfLqxG7l8Ju123fHDMJyYSDl5E3bUbpFUuii/OvMreFQzw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-x64-musl@1.72.0': + resolution: {integrity: sha512-SrpbrUL70nG9vh6zP4/oKHWgLuHquwsr7MW9XOn0olBVgh10Uqr8qscKhQoBGEn6olK/IUpn5GSKcdQ5AjUhGA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxlint/binding-openharmony-arm64@1.72.0': + resolution: {integrity: sha512-qkrsEn6NmgFKr7U/QnezQMb+q/vzAy0Dd9Y95gQGQTyjzDLN+HRZMuM5u70iyH4nBLCfKBzhjMsYCehKay2jyg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxlint/binding-win32-arm64-msvc@1.72.0': + resolution: {integrity: sha512-LWR6ZlFZph+KPjXv8opgZsXRDCdrdQe8VL8Cg9zxCoBS73h6znzZpydVgmdnwj8mB9AuSM5jxEgDJDpQkjboeg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxlint/binding-win32-ia32-msvc@1.72.0': + resolution: {integrity: sha512-yt6HEh7IsHvtjRWtmeZRX134eaXKHq5Gnqlf1xBJdJl1JtdoRUEJw3nAxpZoUDS860cX/foKbztO441anVBtVQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxlint/binding-win32-x64-msvc@1.72.0': + resolution: {integrity: sha512-b2eKFD2hX7tIwmo/cyH6TDq8vzWRZ2qNHrzoGntUTmq0h3zQh/uX3eTSHCwI8OB/ADQfJCRelLItK8BsxuucDA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@peculiar/asn1-cms@2.8.0': resolution: {integrity: sha512-NgekZOrSJFSBFLFoLfwePguAWAx7z1+f2TEsWFUMyiqqfntZ4+S/S5hzqME3q4pCA0iOsFKdwiQ35dwY24eVqA==} @@ -5210,9 +5228,6 @@ packages: cpu: [x64] os: [win32] - '@rtsao/scc@1.1.0': - resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - '@rushstack/node-core-library@5.23.1': resolution: {integrity: sha512-wlKmIKIYCKuCASbITvOxLZXepPbwXvrv7S6ig6XNWFchSyhL/E2txmVXspHY49Wu2dzf7nI27a2k/yV5BA3EiA==} peerDependencies: @@ -5604,12 +5619,6 @@ packages: typescript: optional: true - '@stylistic/eslint-plugin@5.10.0': - resolution: {integrity: sha512-nPK52ZHvot8Ju/0A4ucSX1dcPV2/1clx0kLcH5wDmrE4naKso7TUC/voUyU1O9OTKTrR6MYip6LP0ogEMQ9jPQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^9.0.0 || ^10.0.0 - '@svgr/babel-plugin-add-jsx-attribute@8.0.0': resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==} engines: {node: '>=14'} @@ -5900,6 +5909,9 @@ packages: '@types/escape-html@1.0.4': resolution: {integrity: sha512-qZ72SFTgUAZ5a7Tj6kf2SHLetiH5S6f8G5frB2SPQ3EyF02kxdyBFf4Tz4banE3xCgGnKgWLt//a6VuYHKYJTg==} + '@types/esrecurse@4.3.1': + resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} + '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} @@ -5965,9 +5977,6 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/jsrsasign@10.5.15': resolution: {integrity: sha512-3stUTaSRtN09PPzVWR6aySD9gNnuymz+WviNHoTb85dKu+BjaV4uBbWWGykBBJkfwPtcNZVfTn2lbX00U+yhpQ==} @@ -6010,9 +6019,6 @@ packages: '@types/node@25.9.3': resolution: {integrity: sha512-603BddQMv3pUcr4U2dhujk83N2tTDVr/34wII2B6bJy6g+8WD6yUb11jszNs0gdi4PesVWl7ABt8nYMVpnLUcg==} - '@types/normalize-package-data@2.4.4': - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - '@types/npm-package-arg@6.1.4': resolution: {integrity: sha512-vDgdbMy2QXHnAruzlv68pUtXCjmqUk3WrBAsRboRovsOmxbfn/WiYCjmecyKjGztnMps5dWp4Uq2prp+Ilo17Q==} @@ -6140,128 +6146,39 @@ packages: '@types/yargs@17.0.35': resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} - '@typescript-eslint/eslint-plugin@8.61.0': - resolution: {integrity: sha512-bFNvl9ZczlVb+wR2Akszf3gHfKVj/8WanXaGJ3UstTA7brNKg0cNdk6X1Psu5V7MZ2oQtzZKOEzIUehaoxbDGw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - '@typescript-eslint/parser': ^8.61.0 - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: 6.0.3 - - '@typescript-eslint/parser@8.62.1': - resolution: {integrity: sha512-sPhE4iHuJDSvoAiec+Ro8JyXw8f0ql13HFR82P99nCm9GwTEKG0KYLvDe6REk8BCXuit6vJAv/Yxg5ABaNS2rA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: 6.0.3 - - '@typescript-eslint/project-service@8.61.0': - resolution: {integrity: sha512-DV42F7MLJO6Rax7SK1yg43tcnEfGUrurSpSxKuVX+a3RCTzBlH3fuxprrOJXKCJGAaw82xXocikJ0uQaqwXgGA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: 6.0.3 - - '@typescript-eslint/project-service@8.61.1': - resolution: {integrity: sha512-PrC4JYGmR241lYnfhmKGTXkFqv8+ymbTFgSAY0fVXpY82/QkMw5TZPl+vGzuDDU2QYJk9fIDOBTntF+yDv9LEA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: 6.0.3 - '@typescript-eslint/project-service@8.62.1': resolution: {integrity: sha512-yQ3RgY5RkSBpsNS1Bx/JQEcA24FOSdfGktoyprAr5u18390UQdtVcfnEv4nIrIshNnavlVyZBKxQwT1fIAE6cg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: 6.0.3 - '@typescript-eslint/scope-manager@8.61.0': - resolution: {integrity: sha512-IWdXFHFSb6mlC3HPc7QsLDm5zYEbUla6trDEHf32D3/dnuUyXd87plScSNXSbm0/RxMvObpI17sv/EDTGrGZkA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/scope-manager@8.61.1': - resolution: {integrity: sha512-L2bdIeoQS8FlKAvONAr20w6OcLXeB+qiDKbAooS9A0Ben+iSIkBef0FxqwKWYqt5sa0i4KJtxVyVmhMylKzF5w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.62.1': resolution: {integrity: sha512-r4d249KbQ1SFdpeStvob8Ih6aPPIzfqllPVOtvhve6ZcpuVcYo5/7zUWckKpHE7StASX4kTKZTLf0WQm/wPkcg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.61.0': - resolution: {integrity: sha512-O5Amvdv9ztMpxpf+vmFULGG78IE6Qwdr3bCGvqwG4nwc9H2qXkOYJJnRbRHyMkQTjv1d03olqwwwzHLMqpFePQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: 6.0.3 - - '@typescript-eslint/tsconfig-utils@8.61.1': - resolution: {integrity: sha512-UN/H4di+OO7EWx2ovME+8t31YO+KVnK0RRKEHR3kOt21/Ay8BOq3M1OMvWs5vNiqcFCYGYoxK3MXPZzmMUE+yg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: 6.0.3 - '@typescript-eslint/tsconfig-utils@8.62.1': resolution: {integrity: sha512-xadytJqX9vJVQ2fdQjkcIVigwaOJNWkpjdLt6cEQ+xPnrI1fkp+/jZE/I97k9KUjqtpd25i0HeyZf3T6dutv2g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: 6.0.3 - '@typescript-eslint/type-utils@8.61.0': - resolution: {integrity: sha512-TuBiQYIkd97yBfInHCTKVYMbX4kvEmpOEuixIuzCU9p8BGT1SfyyO0d0IfDMbPIHcjn/hWnusUX5e8v5Xg+X8A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: 6.0.3 - - '@typescript-eslint/types@8.61.0': - resolution: {integrity: sha512-9QTQpZ5Iin4CdIodfbDQFSeiSJKidgYJYug1P9CC2xWgUTvlmixViqDZNciMjwLBZyJnG4tGmPl97rVAFb1AJg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/types@8.61.1': - resolution: {integrity: sha512-G+CRlPqLv7Bz1IZVs03x5K59F1veqL0EJUROAdGhKsEq8qOiRiZbI+HUojPq5l0fEGOKModD9br6lObhB8zkoA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.62.1': resolution: {integrity: sha512-ooCzJFaf+Hg+uG6fA3NRFGuFjlfNlDhBthbv4ZPU/0elCAFUfnyXUvf/WOpHz/jYwSmvU2GkR2LtyUfy1AxZ1Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.61.0': - resolution: {integrity: sha512-42zatd5qSvvcV1JdDBCLxYRznvP4eIHpPoZXdkPFnAmanA4FuZ5dibSnCBggY8hQnqajPpoGjXFdZ7fIJKQnlA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: 6.0.3 - - '@typescript-eslint/typescript-estree@8.61.1': - resolution: {integrity: sha512-u+oQD3BqYWPc8YV9Zab4vaJElJuwOLPRc10Jm1o/qS+6Qwen14HCWwx0Seo4LnSn2wxea2Ik8DxPt2/FHmuhrg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: 6.0.3 - '@typescript-eslint/typescript-estree@8.62.1': resolution: {integrity: sha512-xMcW9oP9u7fAMXYs9A65CVmtLQe2r//oXINHfi8HV+oiqhih17sbLdhXr4540YWlgpDKQdY854OL5ZrdCiQsAA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: 6.0.3 - '@typescript-eslint/utils@8.61.0': - resolution: {integrity: sha512-3bzFt7ImFMW/jVYwJamDoe/dMOdFLSC6pom6rRjdh4SZJEYupyMzem8e7vKZLclLfpHjlwSAXOUxtKxGXUiLqA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: 6.0.3 - - '@typescript-eslint/utils@8.61.1': - resolution: {integrity: sha512-1+P/3Dj6jvtybE1q0HQ6yBt/gq+oKJyLdEv4HdnqasaEXRSYCAsD59mXEVQnM/ULNdQxbX77tdG4jPRjIS6knA==} + '@typescript-eslint/utils@8.62.1': + resolution: {integrity: sha512-sHtbPfuKNZCG+ih8SyjjucqRntSVmp8XgL5u6o9mAhiSn8ds5o/M/XdM0abweme2Tln3szOstOrZ9OXitvPh0g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: 6.0.3 - '@typescript-eslint/visitor-keys@8.61.0': - resolution: {integrity: sha512-QVLZu3ZPQEE+HICQyAMZ2yLQhxf0meY/wx6Hx14YcTNj13JB3qHlX3lJ02L3fLGHgERRH71kvYDwiXIguT3AjQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/visitor-keys@8.61.1': - resolution: {integrity: sha512-6fJ9MHWtK14C1DSkiMlHUSOmrVebL7150xZJBlJiL62jjhIA4JmOq6flwBgDxIdBKKdoiZRel+dfPD5MLfny3w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.62.1': resolution: {integrity: sha512-4g3BLxfdTMy8iZG0MaBkadnlRrCJ74cQiFbyEVMrkwIoqdyaXXQM22cotDvrl4x28wgIZ9rEJRoM+mmhSJpJ1g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -6863,38 +6780,6 @@ packages: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} - array-buffer-byte-length@1.0.2: - resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} - engines: {node: '>= 0.4'} - - array-includes@3.1.9: - resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} - engines: {node: '>= 0.4'} - - array.prototype.findlast@1.2.5: - resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} - engines: {node: '>= 0.4'} - - array.prototype.findlastindex@1.2.6: - resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} - engines: {node: '>= 0.4'} - - array.prototype.flat@1.3.3: - resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} - engines: {node: '>= 0.4'} - - array.prototype.flatmap@1.3.3: - resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} - engines: {node: '>= 0.4'} - - array.prototype.tosorted@1.1.4: - resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} - engines: {node: '>= 0.4'} - - arraybuffer.prototype.slice@1.0.4: - resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} - engines: {node: '>= 0.4'} - asn1.js@4.10.1: resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==} @@ -6912,9 +6797,6 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - ast-types-flow@0.0.8: - resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} - ast-types@0.16.1: resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} engines: {node: '>=4'} @@ -6934,10 +6816,6 @@ packages: resolution: {integrity: sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==} engines: {node: '>=0.12.0'} - async-function@1.0.0: - resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} - engines: {node: '>= 0.4'} - async-lock@1.4.1: resolution: {integrity: sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==} @@ -6985,10 +6863,6 @@ packages: axios@1.16.1: resolution: {integrity: sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A==} - axobject-query@4.1.0: - resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} - engines: {node: '>= 0.4'} - b4a@1.8.1: resolution: {integrity: sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==} peerDependencies: @@ -7279,10 +7153,6 @@ packages: resolution: {integrity: sha512-q2hn7Mbo2nFNkVekPiHFx6Nfo3hURmES3tfBn+k5Pqxl2RkmP3QGqZUhH/q9Pch/4G05NRhPjDlVj1O8q4Txvw==} engines: {node: '>=14.0.0'} - builtin-modules@3.3.0: - resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} - engines: {node: '>=6'} - builtin-status-codes@3.0.0: resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} @@ -7431,10 +7301,6 @@ packages: resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} engines: {node: '>= 10.0'} - clean-regexp@1.0.0: - resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} - engines: {node: '>=4'} - cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} @@ -7994,25 +7860,10 @@ packages: dagre-d3-es@7.0.14: resolution: {integrity: sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg==} - damerau-levenshtein@1.0.8: - resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} - data-urls@5.0.0: resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} engines: {node: '>=18'} - data-view-buffer@1.0.2: - resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} - engines: {node: '>= 0.4'} - - data-view-byte-length@1.0.2: - resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} - engines: {node: '>= 0.4'} - - data-view-byte-offset@1.0.1: - resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} - engines: {node: '>= 0.4'} - date-names@0.1.13: resolution: {integrity: sha512-IxxoeD9tdx8pXVcmqaRlPvrXIsSrSrIZzfzlOkm9u+hyzKp5Wk/odt9O/gd7Ockzy8n/WHeEpTVJ2bF3mMV4LA==} @@ -8031,14 +7882,6 @@ packages: supports-color: optional: true - debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -8191,10 +8034,6 @@ packages: resolution: {integrity: sha512-avsq/xk4YPIrn0CgleX5bjT9Y8IT1p9PxrNQ++RBQ2WEyFfHCTDsT9kmyxz+H/axnjAwg8wJWEIuPGOUuNupiA==} engines: {node: '>= 14.17'} - doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} - doctrine@3.0.0: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} @@ -8444,10 +8283,6 @@ packages: error-ex@1.3.4: resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} - es-abstract@1.24.1: - resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==} - engines: {node: '>= 0.4'} - es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} @@ -8456,10 +8291,6 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-iterator-helpers@1.2.2: - resolution: {integrity: sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==} - engines: {node: '>= 0.4'} - es-module-lexer@2.3.0: resolution: {integrity: sha512-KLdwQm2NvGLDkQDCGvmiQrhkd0JbMzXthwQAUgWjQuQdBLFa3eiBP5arXZyA+f8x+x7OXgud6bq2rxjGtHV2tw==} @@ -8471,14 +8302,6 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - es-shim-unscopables@1.1.0: - resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} - engines: {node: '>= 0.4'} - - es-to-primitive@1.3.0: - resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} - engines: {node: '>= 0.4'} - es-toolkit@1.49.0: resolution: {integrity: sha512-G5iZ6Pc/FNRY/soKZHC+TxGDD83rHUDXxzaWhGCX44vAv/tMs56WMusnm/KMNK+luUPsgA9U28cGr4RDlSzL2g==} @@ -8513,197 +8336,41 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} - eslint-compat-utils@0.5.1: - resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} - engines: {node: '>=12'} + eslint-plugin-storybook@10.4.6: + resolution: {integrity: sha512-CfGSXn6zFspeYTU8R7v797MOmJFj8xc6MWf/oGuRwbKeMoSwnliR+OlXSjMZYM1D6gfmwiuH1VX58LSHdn+ZPg==} peerDependencies: - eslint: '>=6.0.0' - - eslint-config-google@0.14.0: - resolution: {integrity: sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==} - engines: {node: '>=0.10.0'} - peerDependencies: - eslint: '>=5.16.0' - - eslint-config-prettier@10.1.8: - resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' - - eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - - eslint-module-utils@2.12.1: - resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - - eslint-plugin-deprecate@0.9.0: - resolution: {integrity: sha512-M4rP6pRQcvM/LxafQ0PzNKYkfuDn06pOW2uRB2e2WFJiE2KvQqFspxo2Rta3ee6NatHzqDQ4q8UPnaxGMtn5Zw==} - engines: {node: '>=18.18.0'} - peerDependencies: - eslint: ^8.0.0 || ^9.0.0 - - eslint-plugin-es-x@7.8.0: - resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '>=8' - - eslint-plugin-import@2.32.0: - resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - - eslint-plugin-jest@29.15.2: - resolution: {integrity: sha512-kEN4r9RZl1xcsb4arGq89LrcVdOUFII/JSCwtTPJyv16mDwmPrcuEQwpxqZHeINvcsd7oK5O/rhdGlxFRaZwvQ==} - engines: {node: ^20.12.0 || ^22.0.0 || >=24.0.0} - peerDependencies: - '@typescript-eslint/eslint-plugin': ^8.0.0 - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - jest: '*' - typescript: 6.0.3 - peerDependenciesMeta: - '@typescript-eslint/eslint-plugin': - optional: true - jest: - optional: true - typescript: - optional: true - - eslint-plugin-jsx-a11y@6.10.2: - resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} - engines: {node: '>=4.0'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 - - eslint-plugin-matrix-org@3.0.0: - resolution: {integrity: sha512-xOPMeyLxOgoB2SsPhJmIc+drorZmXozSBo3X9whk/62DvbVpJcnththOCGx8ljYScADLb+baNOeN+wKZqwkldw==} - peerDependencies: - '@babel/core': '*' - '@babel/eslint-parser': '*' - '@babel/eslint-plugin': '*' - '@stylistic/eslint-plugin': '*' - '@typescript-eslint/eslint-plugin': '*' - '@typescript-eslint/parser': '*' - eslint: <9 - eslint-config-google: '*' - eslint-config-prettier: '*' - eslint-plugin-deprecate: '*' - eslint-plugin-import: '*' - eslint-plugin-jest: '*' - eslint-plugin-jsx-a11y: '*' - eslint-plugin-react: '*' - eslint-plugin-react-hooks: '*' - eslint-plugin-unicorn: <57 - prettier: '*' - typescript: 6.0.3 - - eslint-plugin-n@17.24.0: - resolution: {integrity: sha512-/gC7/KAYmfNnPNOb3eu8vw+TdVnV0zhdQwexsw6FLXbhzroVj20vRn2qL8lDWDGnAQ2J8DhdfvXxX9EoxvERvw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: '>=8.23.0' - - eslint-plugin-react-compiler@19.0.0-beta-ebf51a3-20250411: - resolution: {integrity: sha512-R7ncuwbCPFAoeMlS56DGGSJFxmRtlWafYH/iWyep5Ks0RaPqTCL4k5gA87axUBBcITsaIgUGkbqAxDxl8Xfm5A==} - engines: {node: ^14.17.0 || ^16.0.0 || >= 18.0.0} - peerDependencies: - eslint: '>=7' - - eslint-plugin-react-compiler@19.1.0-rc.2: - resolution: {integrity: sha512-oKalwDGcD+RX9mf3NEO4zOoUMeLvjSvcbbEOpquzmzqEEM2MQdp7/FY/Hx9NzmUwFzH1W9SKTz5fihfMldpEYw==} - engines: {node: ^14.17.0 || ^16.0.0 || >= 18.0.0} - peerDependencies: - eslint: '>=7' - - eslint-plugin-react-hooks@7.1.1: - resolution: {integrity: sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==} - engines: {node: '>=18'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0 - - eslint-plugin-react@7.37.5: - resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - - eslint-plugin-storybook@10.4.4: - resolution: {integrity: sha512-RqEDQJRaeTdfSDRO9W2sKui4oLax6cSuKU/6vFXbiyEmyaACktkQce9DYEf2i5+MZ07y/X/1G0UZeY+WrPQlIg==} - peerDependencies: - eslint: '>=8' - storybook: ^10.4.4 - - eslint-plugin-unicorn@56.0.1: - resolution: {integrity: sha512-FwVV0Uwf8XPfVnKSGpMg7NtlZh0G0gBarCaFcMUOoqPxXryxdYxTRRv4kH6B9TFCVIrjRXG+emcxIk2ayZilog==} - engines: {node: '>=18.18'} - peerDependencies: - eslint: '>=8.56.0' - - eslint-rule-composer@0.3.0: - resolution: {integrity: sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==} - engines: {node: '>=4.0.0'} + eslint: '>=8' + storybook: ^10.4.6 eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-visitor-keys@2.1.0: - resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} - engines: {node: '>=10'} + eslint-scope@9.1.2: + resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-visitor-keys@4.2.1: - resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint-visitor-keys@5.0.1: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@8.57.1: - resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + eslint@10.6.0: + resolution: {integrity: sha512-6lVbcqSodALYo+4ELD0heG6lFiFxnLMuLkiMi2qV8LMp54N8tE8FT1GMH+ev4Ti00nFjNze2+Su6DsV5OQW3Dg==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true - espree@10.4.0: - resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + espree@11.2.0: + resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} @@ -8848,9 +8515,9 @@ packages: file-entry-cache@11.1.5: resolution: {integrity: sha512-+PFTHITI08JIGhnNpGNI8T8inUpgZfk3GNEqfT9R2zZV2iFXg3CvqzSl/uEhs7TSGujYRELEANyDvS8Fj7+S7Q==} - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} file-loader@6.2.0: resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} @@ -8887,9 +8554,9 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} flat-cache@6.1.23: resolution: {integrity: sha512-f++BY9pTk+983xK1FLzlLpmM0i0z+jHmx3QESGkURMXujQZz1k5wzwX6hjnQ8goaD0B+sYnDK1yZ6MTyZfUaqA==} @@ -9015,13 +8682,6 @@ packages: resolution: {integrity: sha512-0NVVC0TaP7dSTvn1yMiy6d6Q8gifzbvQafO46RtLG/kHJUBNd+pVRGOBoK44wNBvtSPUJRfdVvkFdD3p0xvyZg==} engines: {node: '>=14.16'} - function.prototype.name@1.1.8: - resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} - engines: {node: '>= 0.4'} - - functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - generator-function@2.0.1: resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} engines: {node: '>= 0.4'} @@ -9066,10 +8726,6 @@ packages: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} - get-symbol-description@1.1.0: - resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} - engines: {node: '>= 0.4'} - get-tsconfig@4.14.0: resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} @@ -9122,14 +8778,6 @@ packages: resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} engines: {node: '>=6'} - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} - - globals@15.15.0: - resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} - engines: {node: '>=18'} - globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} @@ -9141,9 +8789,6 @@ packages: globjoin@0.1.4: resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==} - globrex@0.1.2: - resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} - gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -9155,9 +8800,6 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - hachure-fill@0.5.2: resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==} @@ -9173,10 +8815,6 @@ packages: harmony-reflect@1.6.2: resolution: {integrity: sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==} - has-bigints@1.1.0: - resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} - engines: {node: '>= 0.4'} - has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -9188,10 +8826,6 @@ packages: has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - has-proto@1.2.0: - resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} - engines: {node: '>= 0.4'} - has-symbols@1.1.0: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} @@ -9229,12 +8863,6 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true - hermes-estree@0.25.1: - resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} - - hermes-parser@0.25.1: - resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} - highlight.js@11.11.1: resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} engines: {node: '>=12.0.0'} @@ -9258,9 +8886,6 @@ packages: resolution: {integrity: sha512-DeOnSPAvOndYKfw075gt8yZzQ7S2hNztw34zBTfhIzLhmBTswIBg5/y+pqu/VD5cYWm5goAFTusDmUEmKZ0PEQ==} engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} - hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - hosted-git-info@4.1.0: resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} engines: {node: '>=10'} @@ -9466,10 +9091,6 @@ packages: inline-style-parser@0.2.7: resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} - internal-slot@1.1.0: - resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} - engines: {node: '>= 0.4'} - internmap@1.0.1: resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} @@ -9501,33 +9122,13 @@ packages: resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} engines: {node: '>= 0.4'} - is-array-buffer@3.0.5: - resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} - engines: {node: '>= 0.4'} - is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-async-function@2.1.1: - resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} - engines: {node: '>= 0.4'} - - is-bigint@1.1.0: - resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} - engines: {node: '>= 0.4'} - - is-boolean-object@1.2.2: - resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} - engines: {node: '>= 0.4'} - is-buffer@2.0.5: resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} engines: {node: '>=4'} - is-builtin-module@3.2.1: - resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} - engines: {node: '>=6'} - is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} @@ -9540,14 +9141,6 @@ packages: resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} engines: {node: '>= 0.4'} - is-data-view@1.0.2: - resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} - engines: {node: '>= 0.4'} - - is-date-object@1.1.0: - resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} - engines: {node: '>= 0.4'} - is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} @@ -9562,10 +9155,6 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - is-finalizationregistry@1.1.1: - resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} - engines: {node: '>= 0.4'} - is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} @@ -9603,34 +9192,18 @@ packages: resolution: {integrity: sha512-FCsGHdlrOnZQcp0+XT5a+pYowf33itBalCl+7ovNXC/7o5BhIpG14M3OrpPPdBSIQJCm+0M5+9mO7S9VVTTCFw==} engines: {node: '>=14.16'} - is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} - is-nan@1.3.2: resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} engines: {node: '>= 0.4'} - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - is-network-error@1.3.2: resolution: {integrity: sha512-PhBY86zaxNZUuWP6h13Vu5oFe0XY6/UlKzQnYFELzGVHygP3MxmvTfYSG7GN3aIab/iWudSMgjSnG9Dq+nHrgA==} engines: {node: '>=16'} - is-number-object@1.1.1: - resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} - engines: {node: '>= 0.4'} - is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - is-path-inside@4.0.0: resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} engines: {node: '>=12'} @@ -9664,26 +9237,10 @@ packages: resolution: {integrity: sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==} engines: {node: '>=12'} - is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} - - is-shared-array-buffer@1.0.4: - resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} - engines: {node: '>= 0.4'} - is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} - is-string@1.1.1: - resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} - engines: {node: '>= 0.4'} - - is-symbol@1.1.1: - resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} - engines: {node: '>= 0.4'} - is-typed-array@1.1.15: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} @@ -9692,18 +9249,6 @@ packages: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} - is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} - - is-weakref@1.1.1: - resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} - engines: {node: '>= 0.4'} - - is-weakset@2.0.4: - resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} - engines: {node: '>= 0.4'} - is-what@5.5.0: resolution: {integrity: sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==} engines: {node: '>=18'} @@ -9769,10 +9314,6 @@ packages: resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} engines: {node: '>=8'} - iterator.prototype@1.1.5: - resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} - engines: {node: '>= 0.4'} - jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} @@ -9968,10 +9509,6 @@ packages: canvas: optional: true - jsesc@0.5.0: - resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} - hasBin: true - jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} @@ -10008,10 +9545,6 @@ packages: json-with-bigint@3.5.8: resolution: {integrity: sha512-eq/4KP6K34kwa7TcFdtvnftvHCD9KvHOGGICWwMFc4dOOKF5t4iYqnfLK8otCRCRv06FXOzGGyqE8h8ElMvvdw==} - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -10039,10 +9572,6 @@ packages: jsrsasign@11.1.3: resolution: {integrity: sha512-nPnK5D/4lv0Dwr7TlzrKtAd8JlLZwFTqTUUB3NQCbtdobcRcohGFxjbPySDVh74iWUudcCsapYT6OxoyhJLhhA==} - jsx-ast-utils@3.3.5: - resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} - engines: {node: '>=4.0'} - jszip@3.10.1: resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} @@ -10085,13 +9614,6 @@ packages: kolorist@1.8.0: resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} - language-subtag-registry@0.3.23: - resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} - - language-tags@1.0.9: - resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} - engines: {node: '>=0.10'} - launch-editor@2.14.1: resolution: {integrity: sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA==} @@ -10270,9 +9792,6 @@ packages: lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lodash.truncate@4.4.2: resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} @@ -10810,9 +10329,6 @@ packages: engines: {node: ^20.17.0 || >=22.9.0} hasBin: true - normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} - normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -10903,22 +10419,6 @@ packages: resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} - object.entries@1.1.9: - resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} - engines: {node: '>= 0.4'} - - object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} - - object.groupby@1.0.3: - resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} - engines: {node: '>= 0.4'} - - object.values@1.2.1: - resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} - engines: {node: '>= 0.4'} - obug@2.1.1: resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} @@ -10982,10 +10482,6 @@ packages: os-browserify@0.3.0: resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} - own-keys@1.0.1: - resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} - engines: {node: '>= 0.4'} - oxc-parser@0.127.0: resolution: {integrity: sha512-bkgD4qHlN7WxLdX8bLXdaU54TtQtAIg/ZBAfm0aje/mo3MRDo3P0hZSgr4U7O3xfX+fQmR5AP04JS/TGcZLcFA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -11010,6 +10506,23 @@ packages: vite-plus: optional: true + oxlint-tsgolint@0.23.0: + resolution: {integrity: sha512-3mBv3CoPbh8dFbzfDGIWa2ytZjn2v+3EX4aKRXjIhsoGFzG8GCjfRirz3rwZf1wYbZzsNLTSgpw8VjQuWdp/jA==} + hasBin: true + + oxlint@1.72.0: + resolution: {integrity: sha512-1rhdZIP/EvoI91ABIwNU5Q8+bWf8mjrS5UzIOZld4d4bXxJvtlUhlQvaoTogIGin/qdErMOrwaIJvCSIAKTLhA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + oxlint-tsgolint: '>=0.22.1' + vite-plus: '*' + peerDependenciesMeta: + oxlint-tsgolint: + optional: true + vite-plus: + optional: true + p-cancelable@2.1.1: resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} engines: {node: '>=8'} @@ -11200,10 +10713,6 @@ packages: resolution: {integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==} engines: {node: '>=10.4.0'} - pluralize@8.0.0: - resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} - engines: {node: '>=4'} - pluralizers@0.1.7: resolution: {integrity: sha512-mw6AejUiCaMQ6uPN9ObjJDTnR5AnBSmnHHy3uVTbxrSFSxO5scfwpTs8Dxyb6T2v7GSulhvOq+pm9y+hXUvtOA==} @@ -11980,14 +11489,6 @@ packages: read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} - read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} - - read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} - readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} @@ -12027,10 +11528,6 @@ packages: reflect-metadata@0.2.2: resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} - reflect.getprototypeof@1.0.10: - resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} - engines: {node: '>= 0.4'} - regenerate-unicode-properties@10.2.2: resolution: {integrity: sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==} engines: {node: '>=4'} @@ -12047,14 +11544,6 @@ packages: regex@6.1.0: resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} - regexp-tree@0.1.27: - resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} - hasBin: true - - regexp.prototype.flags@1.5.4: - resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} - engines: {node: '>= 0.4'} - regexparam@3.0.0: resolution: {integrity: sha512-RSYAtP31mvYLkAHrOlh25pCNQ5hWnT106VukGaaFfuJrZFkGRX5GhUAdPqpSDXxOhA2c4akmRuplv1mRqnBn6Q==} engines: {node: '>=8'} @@ -12066,10 +11555,6 @@ packages: regjsgen@0.8.0: resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} - regjsparser@0.10.0: - resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} - hasBin: true - regjsparser@0.13.0: resolution: {integrity: sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==} hasBin: true @@ -12135,10 +11620,6 @@ packages: engines: {node: '>= 0.4'} hasBin: true - resolve@2.0.0-next.5: - resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} - hasBin: true - responselike@2.0.1: resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} @@ -12169,11 +11650,6 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - rimraf@6.1.3: resolution: {integrity: sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA==} engines: {node: 20 || >=22} @@ -12228,20 +11704,12 @@ packages: rxjs@7.8.2: resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} - safe-array-concat@1.1.3: - resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} - engines: {node: '>=0.4'} - safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safe-push-apply@1.0.0: - resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} - engines: {node: '>= 0.4'} - safe-regex-test@1.1.0: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} @@ -12339,14 +11807,6 @@ packages: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} - set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} - - set-proto@1.0.0: - resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} - engines: {node: '>= 0.4'} - setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} @@ -12484,15 +11944,9 @@ packages: space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - spdx-exceptions@2.5.0: resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - spdx-expression-parse@4.0.0: resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} @@ -12555,10 +12009,6 @@ packages: std-env@4.1.0: resolution: {integrity: sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==} - stop-iteration-iterator@1.1.0: - resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} - engines: {node: '>= 0.4'} - storybook-addon-vis@4.2.3: resolution: {integrity: sha512-G3uZf9f1uNUWXrreuR6szz/Bs0X8PLh0Hz/VrBdhxjTIBrraAi7u1hY/2+BQtCP86lUlHPSKpYxB/Por0MLBXA==} peerDependencies: @@ -12615,29 +12065,6 @@ packages: resolution: {integrity: sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==} engines: {node: '>=20'} - string.prototype.includes@2.0.1: - resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} - engines: {node: '>= 0.4'} - - string.prototype.matchall@4.0.12: - resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} - engines: {node: '>= 0.4'} - - string.prototype.repeat@1.0.0: - resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} - - string.prototype.trim@1.2.10: - resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} - engines: {node: '>= 0.4'} - - string.prototype.trimend@1.0.9: - resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} - engines: {node: '>= 0.4'} - - string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} - string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} @@ -12931,9 +12358,6 @@ packages: text-decoder@1.2.7: resolution: {integrity: sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==} - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - thingies@2.6.0: resolution: {integrity: sha512-rMHRjmlFLM1R96UYPvpmnc3LYtdFrT33JIB7L9hetGue1qAPfn1N2LJeEjxUSidu1Iku+haLZXDuEXUHNGO/lg==} engines: {node: '>=10.18'} @@ -13053,18 +12477,10 @@ packages: peerDependencies: typescript: 6.0.3 - ts-declaration-location@1.0.7: - resolution: {integrity: sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==} - peerDependencies: - typescript: 6.0.3 - ts-dedent@2.3.0: resolution: {integrity: sha512-JfJeIHke7y2egdGGgRAvpCwYFUsHlM2gPcrVOxFkznt/4uzQ7HFmvE63iFHVLBJNDuyDOQgijDK/tXH/f6Msjg==} engines: {node: '>=6.10'} - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - tsconfig-paths@4.2.0: resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} engines: {node: '>=6'} @@ -13105,22 +12521,10 @@ packages: resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} engines: {node: '>=10'} - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} - type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - - type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - type-fest@5.5.0: resolution: {integrity: sha512-PlBfpQwiUvGViBNX84Yxwjsdhd1TUlXr6zjX7eoirtCPIr08NAmxwa+fcYBTeRQxHo9YC9wwF3m9i700sHma8g==} engines: {node: '>=20'} @@ -13138,18 +12542,6 @@ packages: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} - typed-array-byte-length@1.0.3: - resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} - engines: {node: '>= 0.4'} - - typed-array-byte-offset@1.0.4: - resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} - engines: {node: '>= 0.4'} - - typed-array-length@1.0.7: - resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} - engines: {node: '>= 0.4'} - typedoc-plugin-markdown@4.12.0: resolution: {integrity: sha512-eJDEMAfxCmede22c/Jw7d0FA13ggAQv+KkwQYKYCdqI02cin6Rc9QRwbG/7XvvHWinuFejySnZVUWDtvGk3Vbg==} engines: {node: '>= 18'} @@ -13196,10 +12588,6 @@ packages: resolution: {integrity: sha512-8gwNZ29+0/3zmXw7ToIHZtg6wK37xnniRUdBt7B27xZxaxfgR5tGMaGHT0t0dLtBV9fXE7zurh0s6Z1DHVjfWg==} engines: {node: '>=14'} - unbox-primitive@1.1.0: - resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} - engines: {node: '>= 0.4'} - underscore@1.13.8: resolution: {integrity: sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==} @@ -13389,9 +12777,6 @@ packages: resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} engines: {node: '>=10.12.0'} - validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - validate-npm-package-name@8.0.0: resolution: {integrity: sha512-SCv6OOV6Xj2/3cXy3dGmADluJTNcL3o7hZAglNPTe+WYuEuvxgJzxPrSDLZhF+CwyQOubqgecjMmTJGMVLWjYQ==} engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} @@ -13737,18 +13122,6 @@ packages: when-exit@2.1.5: resolution: {integrity: sha512-VGkKJ564kzt6Ms1dbgPP/yuIoQCrsFAnRbptpC5wOEsDaNsbCB2bnfnaA8i/vRs5tjUSEOtIuvl9/MyVsvQZCg==} - which-boxed-primitive@1.1.1: - resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} - engines: {node: '>= 0.4'} - - which-builtin-type@1.2.1: - resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} - engines: {node: '>= 0.4'} - - which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} - which-module@2.0.1: resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} @@ -13934,21 +13307,6 @@ packages: resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} engines: {node: '>= 14'} - zod-validation-error@3.5.4: - resolution: {integrity: sha512-+hEiRIiPobgyuFlEojnqjJnhFvg4r/i3cqgcm67eehZf/WBaK3g6cD02YU9mtdVxZjv8CzCA9n/Rhrs3yAAvAw==} - engines: {node: '>=18.0.0'} - peerDependencies: - zod: ^3.24.4 - - zod-validation-error@4.0.2: - resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==} - engines: {node: '>=18.0.0'} - peerDependencies: - zod: ^3.25.0 || ^4.0.0 - - zod@3.25.76: - resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} - zod@4.4.3: resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} @@ -14170,20 +13528,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/eslint-parser@7.29.7(@babel/core@7.29.7)(eslint@8.57.1)': - dependencies: - '@babel/core': 7.29.7 - '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 - eslint: 8.57.1 - eslint-visitor-keys: 2.1.0 - semver: 6.3.1 - - '@babel/eslint-plugin@7.29.7(@babel/eslint-parser@7.29.7(@babel/core@7.29.7)(eslint@8.57.1))(eslint@8.57.1)': - dependencies: - '@babel/eslint-parser': 7.29.7(@babel/core@7.29.7)(eslint@8.57.1) - eslint: 8.57.1 - eslint-rule-composer: 0.3.0 - '@babel/generator@7.29.7': dependencies: '@babel/parser': 7.29.7 @@ -14371,15 +13715,7 @@ snapshots: '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) - '@babel/helper-plugin-utils': 7.29.7 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.7)': + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 @@ -15443,9 +14779,9 @@ snapshots: '@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)': + '@docsearch/js@3.8.2(@algolia/client-search@5.50.0)(@types/react@19.2.14)(react@19.2.7)(search-insights@2.17.3)': dependencies: - '@docsearch/react': 3.8.2(@algolia/client-search@5.50.0)(@types/react@19.2.14)(search-insights@2.17.3) + '@docsearch/react': 3.8.2(@algolia/client-search@5.50.0)(@types/react@19.2.14)(react@19.2.7)(search-insights@2.17.3) preact: 10.29.3 transitivePeerDependencies: - '@algolia/client-search' @@ -15454,7 +14790,7 @@ snapshots: - react-dom - search-insights - '@docsearch/react@3.8.2(@algolia/client-search@5.50.0)(@types/react@19.2.14)(search-insights@2.17.3)': + '@docsearch/react@3.8.2(@algolia/client-search@5.50.0)(@types/react@19.2.14)(react@19.2.7)(search-insights@2.17.3)': dependencies: '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.50.0)(algoliasearch@5.50.0)(search-insights@2.17.3) '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.50.0)(algoliasearch@5.50.0) @@ -15462,6 +14798,7 @@ snapshots: algoliasearch: 5.50.0 optionalDependencies: '@types/react': 19.2.14 + react: 19.2.7 search-insights: 2.17.3 transitivePeerDependencies: - '@algolia/client-search' @@ -15718,28 +15055,35 @@ snapshots: '@esbuild/win32-x64@0.27.4': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@8.57.1)': + '@eslint-community/eslint-utils@4.9.1(eslint@10.6.0(jiti@2.7.0))': dependencies: - eslint: 8.57.1 + eslint: 10.6.0(jiti@2.7.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/eslintrc@2.1.4': + '@eslint/config-array@0.23.5': dependencies: - ajv: 6.15.0 + '@eslint/object-schema': 3.0.5 debug: 4.4.3 - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.2 - import-fresh: 3.3.1 - js-yaml: 4.3.0 - minimatch: 3.1.5 - strip-json-comments: 3.1.1 + minimatch: 10.2.5 transitivePeerDependencies: - supports-color - '@eslint/js@8.57.1': {} + '@eslint/config-helpers@0.6.0': + dependencies: + '@eslint/core': 1.2.1 + + '@eslint/core@1.2.1': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/object-schema@3.0.5': {} + + '@eslint/plugin-kit@0.7.2': + dependencies: + '@eslint/core': 1.2.1 + levn: 0.4.1 '@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: @@ -15848,17 +15192,21 @@ snapshots: dependencies: '@hapi/hoek': 11.0.7 - '@humanwhocodes/config-array@0.13.0': + '@humanfs/core@0.19.2': dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.3 - minimatch: 3.1.5 - transitivePeerDependencies: - - supports-color + '@humanfs/types': 0.15.0 + + '@humanfs/node@0.16.8': + dependencies: + '@humanfs/core': 0.19.2 + '@humanfs/types': 0.15.0 + '@humanwhocodes/retry': 0.4.3 + + '@humanfs/types@0.15.0': {} '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/object-schema@2.0.3': {} + '@humanwhocodes/retry@0.4.3': {} '@iconify-json/simple-icons@1.2.75': dependencies: @@ -16437,10 +15785,6 @@ snapshots: '@tybys/wasm-util': 0.10.3 optional: true - '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': - dependencies: - eslint-scope: 5.1.1 - '@noble/hashes@1.4.0': {} '@noble/hashes@2.2.0': {} @@ -17061,6 +16405,81 @@ snapshots: '@oxfmt/binding-win32-x64-msvc@0.56.0': optional: true + '@oxlint-tsgolint/darwin-arm64@0.23.0': + optional: true + + '@oxlint-tsgolint/darwin-x64@0.23.0': + optional: true + + '@oxlint-tsgolint/linux-arm64@0.23.0': + optional: true + + '@oxlint-tsgolint/linux-x64@0.23.0': + optional: true + + '@oxlint-tsgolint/win32-arm64@0.23.0': + optional: true + + '@oxlint-tsgolint/win32-x64@0.23.0': + optional: true + + '@oxlint/binding-android-arm-eabi@1.72.0': + optional: true + + '@oxlint/binding-android-arm64@1.72.0': + optional: true + + '@oxlint/binding-darwin-arm64@1.72.0': + optional: true + + '@oxlint/binding-darwin-x64@1.72.0': + optional: true + + '@oxlint/binding-freebsd-x64@1.72.0': + optional: true + + '@oxlint/binding-linux-arm-gnueabihf@1.72.0': + optional: true + + '@oxlint/binding-linux-arm-musleabihf@1.72.0': + optional: true + + '@oxlint/binding-linux-arm64-gnu@1.72.0': + optional: true + + '@oxlint/binding-linux-arm64-musl@1.72.0': + optional: true + + '@oxlint/binding-linux-ppc64-gnu@1.72.0': + optional: true + + '@oxlint/binding-linux-riscv64-gnu@1.72.0': + optional: true + + '@oxlint/binding-linux-riscv64-musl@1.72.0': + optional: true + + '@oxlint/binding-linux-s390x-gnu@1.72.0': + optional: true + + '@oxlint/binding-linux-x64-gnu@1.72.0': + optional: true + + '@oxlint/binding-linux-x64-musl@1.72.0': + optional: true + + '@oxlint/binding-openharmony-arm64@1.72.0': + optional: true + + '@oxlint/binding-win32-arm64-msvc@1.72.0': + optional: true + + '@oxlint/binding-win32-ia32-msvc@1.72.0': + optional: true + + '@oxlint/binding-win32-x64-msvc@1.72.0': + optional: true + '@peculiar/asn1-cms@2.8.0': dependencies: '@peculiar/asn1-schema': 2.8.0 @@ -17699,8 +17118,6 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.60.1': optional: true - '@rtsao/scc@1.1.0': {} - '@rushstack/node-core-library@5.23.1(@types/node@25.9.3)': dependencies: ajv: 8.18.0 @@ -18154,16 +17571,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@stylistic/eslint-plugin@5.10.0(eslint@8.57.1)': - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) - '@typescript-eslint/types': 8.62.1 - eslint: 8.57.1 - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 - estraverse: 5.3.0 - picomatch: 4.0.4 - '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 @@ -18523,6 +17930,8 @@ snapshots: '@types/escape-html@1.0.4': {} + '@types/esrecurse@4.3.1': {} + '@types/estree@1.0.8': {} '@types/estree@1.0.9': {} @@ -18592,8 +18001,6 @@ snapshots: '@types/json-schema@7.0.15': {} - '@types/json5@0.0.29': {} - '@types/jsrsasign@10.5.15': {} '@types/keyv@3.1.4': @@ -18636,8 +18043,6 @@ snapshots: dependencies: undici-types: 7.24.6 - '@types/normalize-package-data@2.4.4': {} - '@types/npm-package-arg@6.1.4': {} '@types/npm-registry-fetch@8.0.9': @@ -18777,52 +18182,6 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.61.0(@typescript-eslint/parser@8.62.1(eslint@8.57.1)(typescript@6.0.3))(eslint@8.57.1)(typescript@6.0.3)': - dependencies: - '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.62.1(eslint@8.57.1)(typescript@6.0.3) - '@typescript-eslint/scope-manager': 8.61.0 - '@typescript-eslint/type-utils': 8.61.0(eslint@8.57.1)(typescript@6.0.3) - '@typescript-eslint/utils': 8.61.0(eslint@8.57.1)(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.61.0 - eslint: 8.57.1 - ignore: 7.0.5 - natural-compare: 1.4.0 - ts-api-utils: 2.5.0(typescript@6.0.3) - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@8.62.1(eslint@8.57.1)(typescript@6.0.3)': - dependencies: - '@typescript-eslint/scope-manager': 8.62.1 - '@typescript-eslint/types': 8.62.1 - '@typescript-eslint/typescript-estree': 8.62.1(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.62.1 - debug: 4.4.3 - eslint: 8.57.1 - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/project-service@8.61.0(typescript@6.0.3)': - dependencies: - '@typescript-eslint/tsconfig-utils': 8.62.1(typescript@6.0.3) - '@typescript-eslint/types': 8.62.1 - debug: 4.4.3 - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/project-service@8.61.1(typescript@6.0.3)': - dependencies: - '@typescript-eslint/tsconfig-utils': 8.62.1(typescript@6.0.3) - '@typescript-eslint/types': 8.62.1 - debug: 4.4.3 - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/project-service@8.62.1(typescript@6.0.3)': dependencies: '@typescript-eslint/tsconfig-utils': 8.62.1(typescript@6.0.3) @@ -18832,81 +18191,17 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.61.0': - dependencies: - '@typescript-eslint/types': 8.61.0 - '@typescript-eslint/visitor-keys': 8.61.0 - - '@typescript-eslint/scope-manager@8.61.1': - dependencies: - '@typescript-eslint/types': 8.61.1 - '@typescript-eslint/visitor-keys': 8.61.1 - '@typescript-eslint/scope-manager@8.62.1': dependencies: '@typescript-eslint/types': 8.62.1 '@typescript-eslint/visitor-keys': 8.62.1 - '@typescript-eslint/tsconfig-utils@8.61.0(typescript@6.0.3)': - dependencies: - typescript: 6.0.3 - - '@typescript-eslint/tsconfig-utils@8.61.1(typescript@6.0.3)': - dependencies: - typescript: 6.0.3 - '@typescript-eslint/tsconfig-utils@8.62.1(typescript@6.0.3)': dependencies: typescript: 6.0.3 - '@typescript-eslint/type-utils@8.61.0(eslint@8.57.1)(typescript@6.0.3)': - dependencies: - '@typescript-eslint/types': 8.61.0 - '@typescript-eslint/typescript-estree': 8.61.0(typescript@6.0.3) - '@typescript-eslint/utils': 8.61.0(eslint@8.57.1)(typescript@6.0.3) - debug: 4.4.3 - eslint: 8.57.1 - ts-api-utils: 2.5.0(typescript@6.0.3) - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/types@8.61.0': {} - - '@typescript-eslint/types@8.61.1': {} - '@typescript-eslint/types@8.62.1': {} - '@typescript-eslint/typescript-estree@8.61.0(typescript@6.0.3)': - dependencies: - '@typescript-eslint/project-service': 8.61.0(typescript@6.0.3) - '@typescript-eslint/tsconfig-utils': 8.61.0(typescript@6.0.3) - '@typescript-eslint/types': 8.61.0 - '@typescript-eslint/visitor-keys': 8.61.0 - debug: 4.4.3 - minimatch: 10.2.5 - semver: 7.8.5 - tinyglobby: 0.2.17 - ts-api-utils: 2.5.0(typescript@6.0.3) - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/typescript-estree@8.61.1(typescript@6.0.3)': - dependencies: - '@typescript-eslint/project-service': 8.61.1(typescript@6.0.3) - '@typescript-eslint/tsconfig-utils': 8.61.1(typescript@6.0.3) - '@typescript-eslint/types': 8.61.1 - '@typescript-eslint/visitor-keys': 8.61.1 - debug: 4.4.3 - minimatch: 10.2.5 - semver: 7.8.5 - tinyglobby: 0.2.17 - ts-api-utils: 2.5.0(typescript@6.0.3) - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/typescript-estree@8.62.1(typescript@6.0.3)': dependencies: '@typescript-eslint/project-service': 8.62.1(typescript@6.0.3) @@ -18922,38 +18217,17 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.61.0(eslint@8.57.1)(typescript@6.0.3)': - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) - '@typescript-eslint/scope-manager': 8.61.0 - '@typescript-eslint/types': 8.61.0 - '@typescript-eslint/typescript-estree': 8.61.0(typescript@6.0.3) - eslint: 8.57.1 - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@8.61.1(eslint@8.57.1)(typescript@6.0.3)': + '@typescript-eslint/utils@8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) - '@typescript-eslint/scope-manager': 8.61.1 - '@typescript-eslint/types': 8.61.1 - '@typescript-eslint/typescript-estree': 8.61.1(typescript@6.0.3) - eslint: 8.57.1 + '@eslint-community/eslint-utils': 4.9.1(eslint@10.6.0(jiti@2.7.0)) + '@typescript-eslint/scope-manager': 8.62.1 + '@typescript-eslint/types': 8.62.1 + '@typescript-eslint/typescript-estree': 8.62.1(typescript@6.0.3) + eslint: 10.6.0(jiti@2.7.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.61.0': - dependencies: - '@typescript-eslint/types': 8.61.0 - eslint-visitor-keys: 5.0.1 - - '@typescript-eslint/visitor-keys@8.61.1': - dependencies: - '@typescript-eslint/types': 8.61.1 - eslint-visitor-keys: 5.0.1 - '@typescript-eslint/visitor-keys@8.62.1': dependencies: '@typescript-eslint/types': 8.62.1 @@ -19636,73 +18910,6 @@ snapshots: aria-query@5.3.2: {} - array-buffer-byte-length@1.0.2: - dependencies: - call-bound: 1.0.4 - is-array-buffer: 3.0.5 - - array-includes@3.1.9: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.1 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - is-string: 1.1.1 - math-intrinsics: 1.1.0 - - array.prototype.findlast@1.2.5: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-shim-unscopables: 1.1.0 - - array.prototype.findlastindex@1.2.6: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-shim-unscopables: 1.1.0 - - array.prototype.flat@1.3.3: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.1 - es-shim-unscopables: 1.1.0 - - array.prototype.flatmap@1.3.3: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.1 - es-shim-unscopables: 1.1.0 - - array.prototype.tosorted@1.1.4: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.1 - es-errors: 1.3.0 - es-shim-unscopables: 1.1.0 - - arraybuffer.prototype.slice@1.0.4: - dependencies: - array-buffer-byte-length: 1.0.2 - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.1 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - is-array-buffer: 3.0.5 - asn1.js@4.10.1: dependencies: bn.js: 4.12.3 @@ -19729,8 +18936,6 @@ snapshots: assertion-error@2.0.1: {} - ast-types-flow@0.0.8: {} - ast-types@0.16.1: dependencies: tslib: 2.8.1 @@ -19747,8 +18952,6 @@ snapshots: async-exit-hook@2.0.1: {} - async-function@1.0.0: {} - async-lock@1.4.1: {} async@3.2.6: {} @@ -19807,8 +19010,6 @@ snapshots: - debug - supports-color - axobject-query@4.1.0: {} - b4a@1.8.1: {} babel-jest@30.4.1(@babel/core@7.29.7): @@ -20170,8 +19371,6 @@ snapshots: transitivePeerDependencies: - supports-color - builtin-modules@3.3.0: {} - builtin-status-codes@3.0.0: {} bundle-name@4.1.0: @@ -20326,10 +19525,6 @@ snapshots: dependencies: source-map: 0.6.1 - clean-regexp@1.0.0: - dependencies: - escape-string-regexp: 1.0.5 - cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 @@ -20949,31 +20144,11 @@ snapshots: d3: 7.9.0 lodash-es: 4.18.1 - damerau-levenshtein@1.0.8: {} - data-urls@5.0.0: dependencies: whatwg-mimetype: 4.0.0 whatwg-url: 14.2.0 - data-view-buffer@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 - - data-view-byte-length@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 - - data-view-byte-offset@1.0.1: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 - date-names@0.1.13: {} dayjs@1.11.21: {} @@ -20986,10 +20161,6 @@ snapshots: dependencies: ms: 2.0.0 - debug@3.2.7: - dependencies: - ms: 2.1.3 - debug@4.4.3: dependencies: ms: 2.1.3 @@ -21135,10 +20306,6 @@ snapshots: transitivePeerDependencies: - supports-color - doctrine@2.1.0: - dependencies: - esutils: 2.0.3 - doctrine@3.0.0: dependencies: esutils: 2.0.3 @@ -21407,89 +20574,13 @@ snapshots: dependencies: is-arrayish: 0.2.1 - es-abstract@1.24.1: - dependencies: - array-buffer-byte-length: 1.0.2 - arraybuffer.prototype.slice: 1.0.4 - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - data-view-buffer: 1.0.2 - data-view-byte-length: 1.0.2 - data-view-byte-offset: 1.0.1 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-set-tostringtag: 2.1.0 - es-to-primitive: 1.3.0 - function.prototype.name: 1.1.8 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - get-symbol-description: 1.1.0 - globalthis: 1.0.4 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - has-proto: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.4 - internal-slot: 1.1.0 - is-array-buffer: 3.0.5 - is-callable: 1.2.7 - is-data-view: 1.0.2 - is-negative-zero: 2.0.3 - is-regex: 1.2.1 - is-set: 2.0.3 - is-shared-array-buffer: 1.0.4 - is-string: 1.1.1 - is-typed-array: 1.1.15 - is-weakref: 1.1.1 - math-intrinsics: 1.1.0 - object-inspect: 1.13.4 - object-keys: 1.1.1 - object.assign: 4.1.7 - own-keys: 1.0.1 - regexp.prototype.flags: 1.5.4 - safe-array-concat: 1.1.3 - safe-push-apply: 1.0.0 - safe-regex-test: 1.1.0 - set-proto: 1.0.0 - stop-iteration-iterator: 1.1.0 - string.prototype.trim: 1.2.10 - string.prototype.trimend: 1.0.9 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.3 - typed-array-byte-length: 1.0.3 - typed-array-byte-offset: 1.0.4 - typed-array-length: 1.0.7 - unbox-primitive: 1.1.0 - which-typed-array: 1.1.20 - - es-define-property@1.0.1: {} - - es-errors@1.3.0: {} - - es-iterator-helpers@1.2.2: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.1 - es-errors: 1.3.0 - es-set-tostringtag: 2.1.0 - function-bind: 1.1.2 - get-intrinsic: 1.3.0 - globalthis: 1.0.4 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - has-proto: 1.2.0 - has-symbols: 1.1.0 - internal-slot: 1.1.0 - iterator.prototype: 1.1.5 - safe-array-concat: 1.1.3 - - es-module-lexer@2.3.0: {} - - es-object-atoms@1.1.1: + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-module-lexer@2.3.0: {} + + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 @@ -21500,16 +20591,6 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.4 - es-shim-unscopables@1.1.0: - dependencies: - hasown: 2.0.4 - - es-to-primitive@1.3.0: - dependencies: - is-callable: 1.2.7 - is-date-object: 1.1.0 - is-symbol: 1.1.1 - es-toolkit@1.49.0: {} es6-error@4.1.1: @@ -21556,303 +20637,73 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-compat-utils@0.5.1(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - semver: 7.8.5 - - eslint-config-google@0.14.0(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - - eslint-config-prettier@10.1.8(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - - eslint-import-resolver-node@0.3.9: + eslint-plugin-storybook@10.4.6(eslint@10.6.0(jiti@2.7.0))(storybook@10.4.6(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@2.8.8)(react@19.2.7))(typescript@6.0.3): dependencies: - debug: 3.2.7 - is-core-module: 2.16.2 - resolve: 1.22.12 - transitivePeerDependencies: - - supports-color - - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.62.1(eslint@8.57.1)(typescript@6.0.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 8.62.1(eslint@8.57.1)(typescript@6.0.3) - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.9 - transitivePeerDependencies: - - supports-color - - eslint-plugin-deprecate@0.9.0(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - - eslint-plugin-es-x@7.8.0(eslint@8.57.1): - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) - '@eslint-community/regexpp': 4.12.2 - eslint: 8.57.1 - eslint-compat-utils: 0.5.1(eslint@8.57.1) - - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.62.1(eslint@8.57.1)(typescript@6.0.3))(eslint@8.57.1): - dependencies: - '@rtsao/scc': 1.1.0 - array-includes: 3.1.9 - array.prototype.findlastindex: 1.2.6 - array.prototype.flat: 1.3.3 - array.prototype.flatmap: 1.3.3 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.62.1(eslint@8.57.1)(typescript@6.0.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) - hasown: 2.0.4 - is-core-module: 2.16.2 - is-glob: 4.0.3 - minimatch: 3.1.5 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.1 - semver: 6.3.1 - string.prototype.trimend: 1.0.9 - tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 8.62.1(eslint@8.57.1)(typescript@6.0.3) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - - eslint-plugin-jest@29.15.2(@typescript-eslint/eslint-plugin@8.61.0(@typescript-eslint/parser@8.62.1(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.1(eslint@8.57.1)(typescript@6.0.3) - eslint: 8.57.1 - optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.61.0(@typescript-eslint/parser@8.62.1(eslint@8.57.1)(typescript@6.0.3))(eslint@8.57.1)(typescript@6.0.3) - jest: 30.4.2(@types/node@25.9.3)(babel-plugin-macros@3.1.0) - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - - eslint-plugin-jsx-a11y@6.10.2(eslint@8.57.1): - dependencies: - aria-query: 5.3.2 - array-includes: 3.1.9 - array.prototype.flatmap: 1.3.3 - ast-types-flow: 0.0.8 - axe-core: 4.12.1 - axobject-query: 4.1.0 - damerau-levenshtein: 1.0.8 - emoji-regex: 9.2.2 - eslint: 8.57.1 - hasown: 2.0.4 - jsx-ast-utils: 3.3.5 - language-tags: 1.0.9 - minimatch: 3.1.5 - object.fromentries: 2.0.8 - safe-regex-test: 1.1.0 - string.prototype.includes: 2.0.1 - - eslint-plugin-matrix-org@3.0.0(6cbc0a21b6f2e971abd0652e23c76f39): - dependencies: - '@babel/core': 7.29.7 - '@babel/eslint-parser': 7.29.7(@babel/core@7.29.7)(eslint@8.57.1) - '@babel/eslint-plugin': 7.29.7(@babel/eslint-parser@7.29.7(@babel/core@7.29.7)(eslint@8.57.1))(eslint@8.57.1) - '@stylistic/eslint-plugin': 5.10.0(eslint@8.57.1) - '@typescript-eslint/eslint-plugin': 8.61.0(@typescript-eslint/parser@8.62.1(eslint@8.57.1)(typescript@6.0.3))(eslint@8.57.1)(typescript@6.0.3) - '@typescript-eslint/parser': 8.62.1(eslint@8.57.1)(typescript@6.0.3) - eslint: 8.57.1 - eslint-config-google: 0.14.0(eslint@8.57.1) - 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.62.1(eslint@8.57.1)(typescript@6.0.3))(eslint@8.57.1) - eslint-plugin-jest: 29.15.2(@typescript-eslint/eslint-plugin@8.61.0(@typescript-eslint/parser@8.62.1(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) - eslint-plugin-unicorn: 56.0.1(eslint@8.57.1) - prettier: 2.8.8 - typescript: 6.0.3 - - eslint-plugin-n@17.24.0(eslint@8.57.1)(typescript@6.0.3): - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) - enhanced-resolve: 5.24.1 - eslint: 8.57.1 - eslint-plugin-es-x: 7.8.0(eslint@8.57.1) - get-tsconfig: 4.14.0 - globals: 15.15.0 - globrex: 0.1.2 - ignore: 5.3.2 - semver: 7.8.5 - ts-declaration-location: 1.0.7(typescript@6.0.3) - transitivePeerDependencies: - - typescript - - eslint-plugin-react-compiler@19.0.0-beta-ebf51a3-20250411(eslint@8.57.1): - dependencies: - '@babel/core': 7.29.7 - '@babel/parser': 7.29.7 - '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.29.7) - eslint: 8.57.1 - hermes-parser: 0.25.1 - zod: 3.25.76 - zod-validation-error: 3.5.4(zod@3.25.76) - transitivePeerDependencies: - - supports-color - - eslint-plugin-react-compiler@19.1.0-rc.2(eslint@8.57.1): - dependencies: - '@babel/core': 7.29.7 - '@babel/parser': 7.29.7 - '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.29.7) - eslint: 8.57.1 - hermes-parser: 0.25.1 - zod: 3.25.76 - zod-validation-error: 3.5.4(zod@3.25.76) - transitivePeerDependencies: - - supports-color - - eslint-plugin-react-hooks@7.1.1(eslint@8.57.1): - dependencies: - '@babel/core': 7.29.7 - '@babel/parser': 7.29.7 - eslint: 8.57.1 - hermes-parser: 0.25.1 - zod: 4.4.3 - zod-validation-error: 4.0.2(zod@4.4.3) - transitivePeerDependencies: - - supports-color - - eslint-plugin-react@7.37.5(eslint@8.57.1): - dependencies: - array-includes: 3.1.9 - array.prototype.findlast: 1.2.5 - array.prototype.flatmap: 1.3.3 - array.prototype.tosorted: 1.1.4 - doctrine: 2.1.0 - es-iterator-helpers: 1.2.2 - eslint: 8.57.1 - estraverse: 5.3.0 - hasown: 2.0.4 - jsx-ast-utils: 3.3.5 - minimatch: 3.1.5 - object.entries: 1.1.9 - object.fromentries: 2.0.8 - object.values: 1.2.1 - prop-types: 15.8.1 - resolve: 2.0.0-next.5 - semver: 6.3.1 - string.prototype.matchall: 4.0.12 - string.prototype.repeat: 1.0.0 - - eslint-plugin-storybook@10.4.4(eslint@8.57.1)(storybook@10.4.6(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@2.8.8)(react@19.2.7))(typescript@6.0.3): - dependencies: - '@typescript-eslint/utils': 8.61.1(eslint@8.57.1)(typescript@6.0.3) - eslint: 8.57.1 + '@typescript-eslint/utils': 8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + eslint: 10.6.0(jiti@2.7.0) storybook: 10.4.6(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@2.8.8)(react@19.2.7) transitivePeerDependencies: - supports-color - typescript - eslint-plugin-unicorn@56.0.1(eslint@8.57.1): - dependencies: - '@babel/helper-validator-identifier': 7.29.7 - '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) - ci-info: 4.4.0 - clean-regexp: 1.0.0 - core-js-compat: 3.49.0 - eslint: 8.57.1 - esquery: 1.7.0 - globals: 15.15.0 - indent-string: 4.0.0 - is-builtin-module: 3.2.1 - jsesc: 3.1.0 - pluralize: 8.0.0 - read-pkg-up: 7.0.1 - regexp-tree: 0.1.27 - regjsparser: 0.10.0 - semver: 7.8.5 - strip-indent: 3.0.0 - - eslint-rule-composer@0.3.0: {} - eslint-scope@5.1.1: dependencies: esrecurse: 4.3.0 estraverse: 4.3.0 - eslint-scope@7.2.2: + eslint-scope@9.1.2: dependencies: + '@types/esrecurse': 4.3.1 + '@types/estree': 1.0.9 esrecurse: 4.3.0 estraverse: 5.3.0 - eslint-visitor-keys@2.1.0: {} - eslint-visitor-keys@3.4.3: {} - eslint-visitor-keys@4.2.1: {} - eslint-visitor-keys@5.0.1: {} - eslint@8.57.1: + eslint@10.6.0(jiti@2.7.0): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.6.0(jiti@2.7.0)) '@eslint-community/regexpp': 4.12.2 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.1 - '@humanwhocodes/config-array': 0.13.0 + '@eslint/config-array': 0.23.5 + '@eslint/config-helpers': 0.6.0 + '@eslint/core': 1.2.1 + '@eslint/plugin-kit': 0.7.2 + '@humanfs/node': 0.16.8 '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.3.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.9 ajv: 6.15.0 - chalk: 4.1.2 cross-spawn: 7.0.6 debug: 4.4.3 - doctrine: 3.0.0 escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 + eslint-scope: 9.1.2 + eslint-visitor-keys: 5.0.1 + espree: 11.2.0 esquery: 1.7.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 + file-entry-cache: 8.0.0 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.3.0 json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.5 + minimatch: 10.2.5 natural-compare: 1.4.0 optionator: 0.9.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 + optionalDependencies: + jiti: 2.7.0 transitivePeerDependencies: - supports-color - espree@10.4.0: + espree@11.2.0: dependencies: acorn: 8.17.0 acorn-jsx: 5.3.2(acorn@8.17.0) - eslint-visitor-keys: 4.2.1 - - espree@9.6.1: - dependencies: - acorn: 8.17.0 - acorn-jsx: 5.3.2(acorn@8.17.0) - eslint-visitor-keys: 3.4.3 + eslint-visitor-keys: 5.0.1 esprima@4.0.1: {} @@ -22020,9 +20871,9 @@ snapshots: dependencies: flat-cache: 6.1.23 - file-entry-cache@6.0.1: + file-entry-cache@8.0.0: dependencies: - flat-cache: 3.2.0 + flat-cache: 4.0.1 file-loader@6.2.0(webpack@5.108.3): dependencies: @@ -22065,11 +20916,10 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 - flat-cache@3.2.0: + flat-cache@4.0.1: dependencies: flatted: 3.4.2 keyv: 4.5.4 - rimraf: 3.0.2 flat-cache@6.1.23: dependencies: @@ -22185,17 +21035,6 @@ snapshots: function-timeout@0.1.1: {} - function.prototype.name@1.1.8: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - functions-have-names: 1.2.3 - hasown: 2.0.4 - is-callable: 1.2.7 - - functions-have-names@1.2.3: {} - generator-function@2.0.1: {} gensync@1.0.0-beta.2: {} @@ -22234,12 +21073,6 @@ snapshots: get-stream@6.0.1: {} - get-symbol-description@1.1.0: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - get-tsconfig@4.14.0: dependencies: resolve-pkg-maps: 1.0.0 @@ -22306,16 +21139,11 @@ snapshots: kind-of: 6.0.3 which: 1.3.1 - globals@13.24.0: - dependencies: - type-fest: 0.20.2 - - globals@15.15.0: {} - globalthis@1.0.4: dependencies: define-properties: 1.2.1 gopd: 1.2.0 + optional: true globby@16.2.0: dependencies: @@ -22328,8 +21156,6 @@ snapshots: globjoin@0.1.4: {} - globrex@0.1.2: {} - gopd@1.2.0: {} got@11.8.6: @@ -22348,8 +21174,6 @@ snapshots: graceful-fs@4.2.11: {} - graphemer@1.4.0: {} - hachure-fill@0.5.2: {} handlebars@4.7.9: @@ -22376,8 +21200,6 @@ snapshots: harmony-reflect@1.6.2: {} - has-bigints@1.1.0: {} - has-flag@4.0.0: {} has-flag@5.0.1: {} @@ -22386,10 +21208,6 @@ snapshots: dependencies: es-define-property: 1.0.1 - has-proto@1.2.0: - dependencies: - dunder-proto: 1.0.1 - has-symbols@1.1.0: {} has-tostringtag@1.0.2: @@ -22441,12 +21259,6 @@ snapshots: he@1.2.0: {} - hermes-estree@0.25.1: {} - - hermes-parser@0.25.1: - dependencies: - hermes-estree: 0.25.1 - highlight.js@11.11.1: {} hmac-drbg@1.0.1: @@ -22469,8 +21281,6 @@ snapshots: dependencies: lru-cache: 11.2.6 - hosted-git-info@2.8.9: {} - hosted-git-info@4.1.0: dependencies: lru-cache: 6.0.0 @@ -22694,12 +21504,6 @@ snapshots: inline-style-parser@0.2.7: {} - internal-slot@1.1.0: - dependencies: - es-errors: 1.3.0 - hasown: 2.0.4 - side-channel: 1.1.1 - internmap@1.0.1: {} internmap@2.0.3: {} @@ -22719,37 +21523,10 @@ snapshots: call-bound: 1.0.4 has-tostringtag: 1.0.2 - is-array-buffer@3.0.5: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - is-arrayish@0.2.1: {} - is-async-function@2.1.1: - dependencies: - async-function: 1.0.0 - call-bound: 1.0.4 - get-proto: 1.0.1 - has-tostringtag: 1.0.2 - safe-regex-test: 1.1.0 - - is-bigint@1.1.0: - dependencies: - has-bigints: 1.1.0 - - is-boolean-object@1.2.2: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - is-buffer@2.0.5: {} - is-builtin-module@3.2.1: - dependencies: - builtin-modules: 3.3.0 - is-callable@1.2.7: {} is-ci@4.1.0: @@ -22760,27 +21537,12 @@ snapshots: dependencies: hasown: 2.0.4 - is-data-view@1.0.2: - dependencies: - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - is-typed-array: 1.1.15 - - is-date-object@1.1.0: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - is-docker@2.2.1: {} is-docker@3.0.0: {} is-extglob@2.1.1: {} - is-finalizationregistry@1.1.1: - dependencies: - call-bound: 1.0.4 - is-fullwidth-code-point@3.0.0: {} is-fullwidth-code-point@5.1.0: @@ -22814,26 +21576,15 @@ snapshots: ip-regex: 5.0.0 super-regex: 0.2.0 - is-map@2.0.3: {} - is-nan@1.3.2: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - is-negative-zero@2.0.3: {} - is-network-error@1.3.2: {} - is-number-object@1.1.1: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - is-number@7.0.0: {} - is-path-inside@3.0.3: {} - is-path-inside@4.0.0: {} is-plain-obj@4.1.0: {} @@ -22861,42 +21612,14 @@ snapshots: is-regexp@3.1.0: {} - is-set@2.0.3: {} - - is-shared-array-buffer@1.0.4: - dependencies: - call-bound: 1.0.4 - is-stream@2.0.1: {} - is-string@1.1.1: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - is-symbol@1.1.1: - dependencies: - call-bound: 1.0.4 - has-symbols: 1.1.0 - safe-regex-test: 1.1.0 - is-typed-array@1.1.15: dependencies: which-typed-array: 1.1.20 is-unicode-supported@0.1.0: {} - is-weakmap@2.0.2: {} - - is-weakref@1.1.1: - dependencies: - call-bound: 1.0.4 - - is-weakset@2.0.4: - dependencies: - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - is-what@5.5.0: {} is-wsl@2.2.0: @@ -22956,15 +21679,6 @@ snapshots: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 - iterator.prototype@1.1.5: - dependencies: - define-data-property: 1.1.4 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - has-symbols: 1.1.0 - set-function-name: 2.0.2 - jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 @@ -23369,8 +22083,6 @@ snapshots: - supports-color - utf-8-validate - jsesc@0.5.0: {} - jsesc@3.1.0: {} json-buffer@3.0.1: {} @@ -23394,10 +22106,6 @@ snapshots: json-with-bigint@3.5.8: {} - json5@1.0.2: - dependencies: - minimist: 1.2.8 - json5@2.2.3: {} jsonc-parser@3.2.0: {} @@ -23420,13 +22128,6 @@ snapshots: jsrsasign@11.1.3: {} - jsx-ast-utils@3.3.5: - dependencies: - array-includes: 3.1.9 - array.prototype.flat: 1.3.3 - object.assign: 4.1.7 - object.values: 1.2.1 - jszip@3.10.1: dependencies: lie: 3.3.0 @@ -23478,12 +22179,6 @@ snapshots: kolorist@1.8.0: {} - language-subtag-registry@0.3.23: {} - - language-tags@1.0.9: - dependencies: - language-subtag-registry: 0.3.23 - launch-editor@2.14.1: dependencies: picocolors: 1.1.1 @@ -23635,8 +22330,6 @@ snapshots: lodash.memoize@4.1.2: {} - lodash.merge@4.6.2: {} - lodash.truncate@4.4.2: {} lodash.uniq@4.5.0: {} @@ -24243,13 +22936,6 @@ snapshots: dependencies: abbrev: 4.0.0 - normalize-package-data@2.5.0: - dependencies: - hosted-git-info: 2.8.9 - resolve: 1.22.12 - semver: 5.7.2 - validate-npm-package-license: 3.0.4 - normalize-path@3.0.0: {} normalize-url@6.1.0: {} @@ -24508,33 +23194,6 @@ snapshots: has-symbols: 1.1.0 object-keys: 1.1.1 - object.entries@1.1.9: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - - object.fromentries@2.0.8: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.1 - es-object-atoms: 1.1.1 - - object.groupby@1.0.3: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.1 - - object.values@1.2.1: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - obug@2.1.1: {} oidc-client-ts@3.5.0: @@ -24625,12 +23284,6 @@ snapshots: os-browserify@0.3.0: {} - own-keys@1.0.1: - dependencies: - get-intrinsic: 1.3.0 - object-keys: 1.1.1 - safe-push-apply: 1.0.0 - oxc-parser@0.127.0: dependencies: '@oxc-project/types': 0.127.0 @@ -24727,6 +23380,38 @@ snapshots: '@oxfmt/binding-win32-ia32-msvc': 0.56.0 '@oxfmt/binding-win32-x64-msvc': 0.56.0 + oxlint-tsgolint@0.23.0: + optionalDependencies: + '@oxlint-tsgolint/darwin-arm64': 0.23.0 + '@oxlint-tsgolint/darwin-x64': 0.23.0 + '@oxlint-tsgolint/linux-arm64': 0.23.0 + '@oxlint-tsgolint/linux-x64': 0.23.0 + '@oxlint-tsgolint/win32-arm64': 0.23.0 + '@oxlint-tsgolint/win32-x64': 0.23.0 + + oxlint@1.72.0(oxlint-tsgolint@0.23.0): + optionalDependencies: + '@oxlint/binding-android-arm-eabi': 1.72.0 + '@oxlint/binding-android-arm64': 1.72.0 + '@oxlint/binding-darwin-arm64': 1.72.0 + '@oxlint/binding-darwin-x64': 1.72.0 + '@oxlint/binding-freebsd-x64': 1.72.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.72.0 + '@oxlint/binding-linux-arm-musleabihf': 1.72.0 + '@oxlint/binding-linux-arm64-gnu': 1.72.0 + '@oxlint/binding-linux-arm64-musl': 1.72.0 + '@oxlint/binding-linux-ppc64-gnu': 1.72.0 + '@oxlint/binding-linux-riscv64-gnu': 1.72.0 + '@oxlint/binding-linux-riscv64-musl': 1.72.0 + '@oxlint/binding-linux-s390x-gnu': 1.72.0 + '@oxlint/binding-linux-x64-gnu': 1.72.0 + '@oxlint/binding-linux-x64-musl': 1.72.0 + '@oxlint/binding-openharmony-arm64': 1.72.0 + '@oxlint/binding-win32-arm64-msvc': 1.72.0 + '@oxlint/binding-win32-ia32-msvc': 1.72.0 + '@oxlint/binding-win32-x64-msvc': 1.72.0 + oxlint-tsgolint: 0.23.0 + p-cancelable@2.1.1: {} p-limit@2.3.0: @@ -24925,8 +23610,6 @@ snapshots: base64-js: 1.5.1 xmlbuilder: 15.1.1 - pluralize@8.0.0: {} - pluralizers@0.1.7: {} png-chunks-extract@1.0.0: @@ -25757,19 +24440,6 @@ snapshots: dependencies: pify: 2.3.0 - read-pkg-up@7.0.1: - dependencies: - find-up: 4.1.0 - read-pkg: 5.2.0 - type-fest: 0.8.1 - - read-pkg@5.2.0: - dependencies: - '@types/normalize-package-data': 2.4.4 - normalize-package-data: 2.5.0 - parse-json: 5.2.0 - type-fest: 0.6.0 - readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 @@ -25825,17 +24495,6 @@ snapshots: reflect-metadata@0.2.2: {} - reflect.getprototypeof@1.0.10: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - which-builtin-type: 1.2.1 - regenerate-unicode-properties@10.2.2: dependencies: regenerate: 1.4.2 @@ -25852,17 +24511,6 @@ snapshots: dependencies: regex-utilities: 2.3.0 - regexp-tree@0.1.27: {} - - regexp.prototype.flags@1.5.4: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-errors: 1.3.0 - get-proto: 1.0.1 - gopd: 1.2.0 - set-function-name: 2.0.2 - regexparam@3.0.0: {} regexpu-core@6.4.0: @@ -25876,10 +24524,6 @@ snapshots: regjsgen@0.8.0: {} - regjsparser@0.10.0: - dependencies: - jsesc: 0.5.0 - regjsparser@0.13.0: dependencies: jsesc: 3.1.0 @@ -25938,12 +24582,6 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - resolve@2.0.0-next.5: - dependencies: - is-core-module: 2.16.2 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - responselike@2.0.1: dependencies: lowercase-keys: 2.0.0 @@ -25970,10 +24608,6 @@ snapshots: dependencies: glob: 7.2.3 - rimraf@3.0.2: - dependencies: - glob: 7.2.3 - rimraf@6.1.3: dependencies: glob: 13.0.6 @@ -26087,23 +24721,10 @@ snapshots: dependencies: tslib: 2.8.1 - safe-array-concat@1.1.3: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - has-symbols: 1.1.0 - isarray: 2.0.5 - safe-buffer@5.1.2: {} safe-buffer@5.2.1: {} - safe-push-apply@1.0.0: - dependencies: - es-errors: 1.3.0 - isarray: 2.0.5 - safe-regex-test@1.1.0: dependencies: call-bound: 1.0.4 @@ -26226,19 +24847,6 @@ snapshots: gopd: 1.2.0 has-property-descriptors: 1.0.2 - set-function-name@2.0.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.2 - - set-proto@1.0.0: - dependencies: - dunder-proto: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - setimmediate@1.0.5: {} setprototypeof@1.2.0: {} @@ -26405,18 +25013,8 @@ snapshots: space-separated-tokens@2.0.2: {} - spdx-correct@3.2.0: - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.22 - spdx-exceptions@2.5.0: {} - spdx-expression-parse@3.0.1: - dependencies: - spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.22 - spdx-expression-parse@4.0.0: dependencies: spdx-exceptions: 2.5.0 @@ -26471,11 +25069,6 @@ snapshots: std-env@4.1.0: {} - stop-iteration-iterator@1.1.0: - dependencies: - es-errors: 1.3.0 - internal-slot: 1.1.0 - storybook-addon-vis@4.2.3(@storybook/addon-vitest@10.4.6(@vitest/browser-playwright@4.1.9)(@vitest/browser@4.1.9)(@vitest/runner@4.1.9)(react@19.2.7)(storybook@10.4.6(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@2.8.8)(react@19.2.7))(vitest@4.1.9))(@vitest/browser-playwright@4.1.9)(@vitest/browser@4.1.9)(babel-plugin-macros@3.1.0)(react@19.2.7)(storybook@10.4.6(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@2.8.8)(react@19.2.7))(typescript@6.0.3)(vitest@4.1.9): dependencies: '@repobuddy/test': 1.0.1 @@ -26574,56 +25167,6 @@ snapshots: get-east-asian-width: 1.6.0 strip-ansi: 7.2.0 - string.prototype.includes@2.0.1: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.1 - - string.prototype.matchall@4.0.12: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - gopd: 1.2.0 - has-symbols: 1.1.0 - internal-slot: 1.1.0 - regexp.prototype.flags: 1.5.4 - set-function-name: 2.0.2 - side-channel: 1.1.1 - - string.prototype.repeat@1.0.0: - dependencies: - define-properties: 1.2.1 - es-abstract: 1.24.1 - - string.prototype.trim@1.2.10: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-data-property: 1.1.4 - define-properties: 1.2.1 - es-abstract: 1.24.1 - es-object-atoms: 1.1.1 - has-property-descriptors: 1.0.2 - - string.prototype.trimend@1.0.9: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - - string.prototype.trimstart@1.0.8: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 @@ -26984,8 +25527,6 @@ snapshots: transitivePeerDependencies: - react-native-b4a - text-table@0.2.0: {} - thingies@2.6.0(tslib@2.8.1): dependencies: tslib: 2.8.1 @@ -27079,20 +25620,8 @@ snapshots: dependencies: typescript: 6.0.3 - ts-declaration-location@1.0.7(typescript@6.0.3): - dependencies: - picomatch: 4.0.4 - typescript: 6.0.3 - ts-dedent@2.3.0: {} - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - tsconfig-paths@4.2.0: dependencies: json5: 2.2.3 @@ -27130,14 +25659,8 @@ snapshots: type-fest@0.13.1: optional: true - type-fest@0.20.2: {} - type-fest@0.21.3: {} - type-fest@0.6.0: {} - - type-fest@0.8.1: {} - type-fest@5.5.0: dependencies: tagged-tag: 1.0.0 @@ -27160,33 +25683,6 @@ snapshots: es-errors: 1.3.0 is-typed-array: 1.1.15 - typed-array-byte-length@1.0.3: - dependencies: - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - has-proto: 1.2.0 - is-typed-array: 1.1.15 - - typed-array-byte-offset@1.0.4: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - has-proto: 1.2.0 - is-typed-array: 1.1.15 - reflect.getprototypeof: 1.0.10 - - typed-array-length@1.0.7: - dependencies: - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - is-typed-array: 1.1.15 - possible-typed-array-names: 1.1.0 - reflect.getprototypeof: 1.0.10 - typedoc-plugin-markdown@4.12.0(typedoc@0.28.19(typescript@6.0.3)): dependencies: typedoc: 0.28.19(typescript@6.0.3) @@ -27219,13 +25715,6 @@ snapshots: unbash@4.0.2: {} - unbox-primitive@1.1.0: - dependencies: - call-bound: 1.0.4 - has-bigints: 1.1.0 - has-symbols: 1.1.0 - which-boxed-primitive: 1.1.1 - underscore@1.13.8: {} undici-types@7.24.6: {} @@ -27418,11 +25907,6 @@ snapshots: '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 - validate-npm-package-license@3.0.4: - dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 - validate-npm-package-name@8.0.0: {} vary@1.1.2: {} @@ -27493,17 +25977,17 @@ snapshots: terser: 5.48.0 yaml: 2.8.4 - vitepress-plugin-mermaid@2.0.17(mermaid@11.16.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.16)(qrcode@1.5.4)(search-insights@2.17.3)(sugarss@5.0.1(postcss@8.5.16))(terser@5.48.0)(typescript@6.0.3)): + vitepress-plugin-mermaid@2.0.17(mermaid@11.16.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.16)(qrcode@1.5.4)(react@19.2.7)(search-insights@2.17.3)(sugarss@5.0.1(postcss@8.5.16))(terser@5.48.0)(typescript@6.0.3)): dependencies: mermaid: 11.16.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.16)(qrcode@1.5.4)(search-insights@2.17.3)(sugarss@5.0.1(postcss@8.5.16))(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.16)(qrcode@1.5.4)(react@19.2.7)(search-insights@2.17.3)(sugarss@5.0.1(postcss@8.5.16))(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@25.9.3)(@types/react@19.2.14)(axios@1.16.1)(jwt-decode@4.0.0)(lightningcss@1.32.0)(postcss@8.5.16)(qrcode@1.5.4)(search-insights@2.17.3)(sugarss@5.0.1(postcss@8.5.16))(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.16)(qrcode@1.5.4)(react@19.2.7)(search-insights@2.17.3)(sugarss@5.0.1(postcss@8.5.16))(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) + '@docsearch/js': 3.8.2(@algolia/client-search@5.50.0)(@types/react@19.2.14)(react@19.2.7)(search-insights@2.17.3) '@iconify-json/simple-icons': 1.2.75 '@shikijs/core': 2.5.0 '@shikijs/transformers': 2.5.0 @@ -27874,37 +26358,6 @@ snapshots: when-exit@2.1.5: {} - which-boxed-primitive@1.1.1: - dependencies: - is-bigint: 1.1.0 - is-boolean-object: 1.2.2 - is-number-object: 1.1.1 - is-string: 1.1.1 - is-symbol: 1.1.1 - - which-builtin-type@1.2.1: - dependencies: - call-bound: 1.0.4 - function.prototype.name: 1.1.8 - has-tostringtag: 1.0.2 - is-async-function: 2.1.1 - is-date-object: 1.1.0 - is-finalizationregistry: 1.1.1 - is-generator-function: 1.1.2 - is-regex: 1.2.1 - is-weakref: 1.1.1 - isarray: 2.0.5 - which-boxed-primitive: 1.1.1 - which-collection: 1.0.2 - which-typed-array: 1.1.20 - - which-collection@1.0.2: - dependencies: - is-map: 2.0.3 - is-set: 2.0.3 - is-weakmap: 2.0.2 - is-weakset: 2.0.4 - which-module@2.0.1: {} which-typed-array@1.1.20: @@ -28085,16 +26538,6 @@ snapshots: compress-commons: 6.0.2 readable-stream: 4.7.0 - zod-validation-error@3.5.4(zod@3.25.76): - dependencies: - zod: 3.25.76 - - zod-validation-error@4.0.2(zod@4.4.3): - dependencies: - zod: 4.4.3 - - zod@3.25.76: {} - zod@4.4.3: {} zwitch@2.0.4: {} From d6a2009a864cf38b6f5fd4f1caf94210bd342c4b Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 7 Jul 2026 13:01:30 +0100 Subject: [PATCH 15/23] Some oxlint-related tweaks --- apps/desktop/src/electron-main.ts | 2 + apps/web/res/decoder-ring/decoder.js | 2 +- apps/web/src/@types/global.d.ts | 4 +- apps/web/src/Notifier.ts | 1 + .../components/structures/LoggedInView.tsx | 2 +- .../views/dialogs/UploadFailureDialog.tsx | 6 +- apps/web/src/hooks/useEventEmitter.ts | 2 +- apps/web/src/stores/OwnBeaconStore.ts | 4 +- .../src/stores/widgets/ElementWidgetDriver.ts | 1 + apps/web/src/test/setupGlobals.ts | 2 +- apps/web/src/utils/LruCache.test.ts | 6 +- .../utils/MegolmExportEncryption-test.ts | 1 + .../src/expect/screenshot.ts | 1 + .../playwright-common/src/flaky-reporter.ts | 1 + .../src/core/roving/RovingTabIndex.test.tsx | 68 +++++++++---------- scripts/gen-workflow-mermaid.ts | 14 ++-- 16 files changed, 61 insertions(+), 56 deletions(-) diff --git a/apps/desktop/src/electron-main.ts b/apps/desktop/src/electron-main.ts index b3c89b717e8..261a2a390f2 100644 --- a/apps/desktop/src/electron-main.ts +++ b/apps/desktop/src/electron-main.ts @@ -385,11 +385,13 @@ app.on("ready", async () => { desktopCapturer .getSources({ types: ["screen", "window"] }) .then((sources) => { + // oxlint-disable-next-line promise/no-callback-in-promise callback({ video: sources[0] }); }) .catch((err) => { // If the user cancels the dialog an error occurs "Failed to get sources" console.error("Wayland: failed to get user-selected source:", err); + // oxlint-disable-next-line promise/no-callback-in-promise callback({ video: { id: "", name: "" } }); // The promise does not return if no dummy is passed here as source }); } else { diff --git a/apps/web/res/decoder-ring/decoder.js b/apps/web/res/decoder-ring/decoder.js index 8a62ed2c8b0..d158bd03fa9 100644 --- a/apps/web/res/decoder-ring/decoder.js +++ b/apps/web/res/decoder-ring/decoder.js @@ -165,7 +165,7 @@ function BundlePicker() { setBundle(name); } }, console.log.bind(console)); - }, [baseUrl]); + }, [baseUrl, bundle]); /* ------------------------- */ /* Follow user state changes */ diff --git a/apps/web/src/@types/global.d.ts b/apps/web/src/@types/global.d.ts index b65d95d3b5b..35de846ac51 100644 --- a/apps/web/src/@types/global.d.ts +++ b/apps/web/src/@types/global.d.ts @@ -71,8 +71,8 @@ declare global { // so we don't accidentally use the methods on NodeJS.Timeout - they only exist in a subset of environments. // The overload for clear{Interval,Timeout} is resolved as expected. // We use `ReturnType` in the code to be agnostic of if this definition gets loaded. - function setInterval(handler: TimerHandler, timeout: number, ...arguments: any[]): number; - function setTimeout(handler: TimerHandler, timeout: number, ...arguments: any[]): number; + function setInterval(handler: TimerHandler, timeout: number, ...args: any[]): number; + function setTimeout(handler: TimerHandler, timeout: number, ...args: any[]): number; interface Window { mxSendRageshake: (text: string, withLogs?: boolean) => Promise; diff --git a/apps/web/src/Notifier.ts b/apps/web/src/Notifier.ts index 411092bbe30..5f0ccd18d56 100644 --- a/apps/web/src/Notifier.ts +++ b/apps/web/src/Notifier.ts @@ -393,6 +393,7 @@ export default class Notifier extends TypedEventEmitter({ diff --git a/apps/web/src/components/structures/LoggedInView.tsx b/apps/web/src/components/structures/LoggedInView.tsx index 1de5d2e31c7..1a0b39471a8 100644 --- a/apps/web/src/components/structures/LoggedInView.tsx +++ b/apps/web/src/components/structures/LoggedInView.tsx @@ -311,7 +311,7 @@ class LoggedInView extends React.Component { private calculateServerLimitToast(syncError: IState["syncErrorData"], usageLimitEventContent?: IUsageLimit): void { const error = (syncError?.error as MatrixError)?.errcode === "M_RESOURCE_LIMIT_EXCEEDED"; if (error) { - usageLimitEventContent = (syncError?.error as MatrixError).data as IUsageLimit; + usageLimitEventContent = (syncError?.error as MatrixError)?.data as IUsageLimit; } // usageLimitDismissed is true when the user has explicitly hidden the toast diff --git a/apps/web/src/components/views/dialogs/UploadFailureDialog.tsx b/apps/web/src/components/views/dialogs/UploadFailureDialog.tsx index 75ee17fda63..e3715d032ed 100644 --- a/apps/web/src/components/views/dialogs/UploadFailureDialog.tsx +++ b/apps/web/src/components/views/dialogs/UploadFailureDialog.tsx @@ -36,7 +36,6 @@ export default class UploadFailureDialog extends React.Component { public render(): React.ReactNode { let message; - let preview; let buttons; if (this.props.totalFiles === 1 && this.props.badFiles.length === 1) { message = _t( @@ -105,10 +104,7 @@ export default class UploadFailureDialog extends React.Component { title={_t("upload_file|error_title")} contentId="mx_Dialog_content" > -
- {message} - {preview} -
+
{message}
{buttons} diff --git a/apps/web/src/hooks/useEventEmitter.ts b/apps/web/src/hooks/useEventEmitter.ts index 12bb57a1eeb..f5f2f6a82bb 100644 --- a/apps/web/src/hooks/useEventEmitter.ts +++ b/apps/web/src/hooks/useEventEmitter.ts @@ -177,7 +177,7 @@ export function useEventEmitterAsyncState { this.lastPublishedPositionTimestamp = Date.now(); await Promise.all( this.healthyLiveBeaconIds.map((beaconId) => - this.beacons.has(beaconId) ? this.sendLocationToBeacon(this.beacons.get(beaconId)!, position) : null, + this.beacons.has(beaconId) + ? this.sendLocationToBeacon(this.beacons.get(beaconId)!, position) + : Promise.resolve(), ), ); }; diff --git a/apps/web/src/stores/widgets/ElementWidgetDriver.ts b/apps/web/src/stores/widgets/ElementWidgetDriver.ts index 2b36b70e123..08a08acc6a6 100644 --- a/apps/web/src/stores/widgets/ElementWidgetDriver.ts +++ b/apps/web/src/stores/widgets/ElementWidgetDriver.ts @@ -600,6 +600,7 @@ export class ElementWidgetDriver extends WidgetDriver { * Otherwise, the event ID at which only subsequent events will be returned, as many as specified * in "limit". * @returns A generator that emits events. + * @yields IRoomEvents from the room timeline */ private *readRoomTimelineIterator( room: Room, diff --git a/apps/web/src/test/setupGlobals.ts b/apps/web/src/test/setupGlobals.ts index 83aa3a0c575..1b00f0b6622 100644 --- a/apps/web/src/test/setupGlobals.ts +++ b/apps/web/src/test/setupGlobals.ts @@ -23,7 +23,7 @@ if (globalThis.window === undefined) { vi.stubGlobal("window", { // Mock this as some code assumes it exists (needs to be done at the top level as // things try to access it before the beforeEach blocks run) - addEventListener: vi.fn(), + addEventListener: vi.fn(), location: locationStub, setTimeout: globalThis.setTimeout, }); diff --git a/apps/web/src/utils/LruCache.test.ts b/apps/web/src/utils/LruCache.test.ts index 155c38a9df8..76904c2653b 100644 --- a/apps/web/src/utils/LruCache.test.ts +++ b/apps/web/src/utils/LruCache.test.ts @@ -40,7 +40,7 @@ describe("LruCache", () => { }); it("delete() should not raise an error", () => { - cache.delete("a"); + expect(() => cache.delete("a")).not.toThrow(); }); describe("when the cache contains 2 items", () => { @@ -87,8 +87,8 @@ describe("LruCache", () => { cache.set("c", "c value"); }); - it("deleting an unkonwn item should not raise an error", () => { - cache.delete("unknown"); + it("deleting an unknown item should not raise an error", () => { + expect(() => cache.delete("unknown")).not.toThrow(); }); it("deleting the first item should work", () => { diff --git a/apps/web/test/unit-tests/utils/MegolmExportEncryption-test.ts b/apps/web/test/unit-tests/utils/MegolmExportEncryption-test.ts index 17193137956..e5c95879b37 100644 --- a/apps/web/test/unit-tests/utils/MegolmExportEncryption-test.ts +++ b/apps/web/test/unit-tests/utils/MegolmExportEncryption-test.ts @@ -130,6 +130,7 @@ cissyYBxjsfsAn const [plain, password, input] = TEST_VECTORS[i]; return MegolmExportEncryption.decryptMegolmKeyFile(stringToArray(input), password).then((decrypted) => { expect(decrypted).toEqual(plain); + // oxlint-disable-next-line promise/no-callback-in-promise return next(i + 1); }); } diff --git a/packages/playwright-common/src/expect/screenshot.ts b/packages/playwright-common/src/expect/screenshot.ts index 8c2165a1cb3..ad8dc1a7b79 100644 --- a/packages/playwright-common/src/expect/screenshot.ts +++ b/packages/playwright-common/src/expect/screenshot.ts @@ -22,6 +22,7 @@ import { ANNOTATION } from "../stale-screenshot-reporter.js"; // Taken from playwright utils, but it's not importable function sanitizeForFilePath(s: string): string { + // oxlint-disable-next-line no-control-regex return s.replace(/[\x00-\x2C\x2E-\x2F\x3A-\x40\x5B-\x60\x7B-\x7F]+/g, "-"); } diff --git a/packages/playwright-common/src/flaky-reporter.ts b/packages/playwright-common/src/flaky-reporter.ts index 0a88f6b03c5..449d6c649b8 100644 --- a/packages/playwright-common/src/flaky-reporter.ts +++ b/packages/playwright-common/src/flaky-reporter.ts @@ -24,6 +24,7 @@ type PaginationLinks = { first?: string; }; +// oxlint-disable-next-line no-control-regex const ANSI_COLOUR_REGEX = /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g; // We see quite a few test flakes which are caused by the app exploding diff --git a/packages/shared-components/src/core/roving/RovingTabIndex.test.tsx b/packages/shared-components/src/core/roving/RovingTabIndex.test.tsx index 48035582edb..2b605d574e4 100644 --- a/packages/shared-components/src/core/roving/RovingTabIndex.test.tsx +++ b/packages/shared-components/src/core/roving/RovingTabIndex.test.tsx @@ -25,7 +25,7 @@ const Button = (props: HTMLAttributes): React.JSX.Element => return