diff --git a/e2e-tests/.ci/server.generate.sh b/e2e-tests/.ci/server.generate.sh index b327d1a67c5..3f775b0eb47 100755 --- a/e2e-tests/.ci/server.generate.sh +++ b/e2e-tests/.ci/server.generate.sh @@ -284,7 +284,7 @@ $(if mme2e_is_token_in_list "playwright" "$ENABLED_DOCKER_SERVICES"; then # shellcheck disable=SC2016 echo ' playwright: - image: mcr.microsoft.com/playwright:v1.58.0-noble + image: mcr.microsoft.com/playwright:v1.59.1-noble entrypoint: ["/bin/bash", "-c"] command: - | diff --git a/e2e-tests/playwright/README.md b/e2e-tests/playwright/README.md index 8d902ed3e6a..6c255295b27 100644 --- a/e2e-tests/playwright/README.md +++ b/e2e-tests/playwright/README.md @@ -150,7 +150,7 @@ test( Change to the `./` project directory, then run the docker container. (See https://playwright.dev/docs/docker for reference.) ```bash -docker run -it --rm -v "$(pwd):/mattermost/" --ipc=host mcr.microsoft.com/playwright:v1.58.0-noble /bin/bash +docker run -it --rm -v "$(pwd):/mattermost/" --ipc=host mcr.microsoft.com/playwright:v1.59.1-noble /bin/bash ``` #### 2. Inside the docker container diff --git a/e2e-tests/playwright/lib/package.json b/e2e-tests/playwright/lib/package.json index 525588644dc..8f325f1b3b8 100644 --- a/e2e-tests/playwright/lib/package.json +++ b/e2e-tests/playwright/lib/package.json @@ -1,6 +1,6 @@ { "name": "@mattermost/playwright-lib", - "version": "11.4.0", + "version": "11.7.0", "description": "A comprehensive end-to-end testing library for Mattermost web, desktop and plugin applications using Playwright", "repository": { "type": "git", @@ -20,6 +20,7 @@ "types": "dist/index.d.ts", "exports": { ".": { + "types": "./dist/index.d.ts", "import": "./dist/index.js", "require": "./dist/index.js" } @@ -45,13 +46,13 @@ "@axe-core/playwright": "4.11.1", "@mattermost/client": "file:../../../webapp/platform/client", "@mattermost/types": "file:../../../webapp/platform/types", - "@percy/cli": "1.31.8", - "@percy/playwright": "1.0.10", + "@percy/cli": "1.31.11", + "@percy/playwright": "1.1.0", "async-wait-until": "2.0.31", - "axe-core": "4.11.1", + "axe-core": "4.11.2", "chalk": "5.6.2", "deepmerge": "4.3.1", - "dotenv": "17.2.3", + "dotenv": "17.4.2", "luxon": "3.7.2", "mime-types": "3.0.2", "uuid": "13.0.0" @@ -60,11 +61,11 @@ "@rollup/plugin-typescript": "12.3.0", "@types/luxon": "3.7.1", "@types/mime-types": "3.0.1", - "@types/node": "25.2.0", - "rollup": "4.57.1", + "@types/node": "25.6.0", + "rollup": "4.60.1", "rollup-plugin-copy": "3.5.0" }, "peerDependencies": { - "@playwright/test": ">=1.55.0" + "@playwright/test": ">=1.59.0" } } diff --git a/e2e-tests/playwright/lib/src/browser_context.ts b/e2e-tests/playwright/lib/src/browser_context.ts index 917d82bd95f..4659137748e 100644 --- a/e2e-tests/playwright/lib/src/browser_context.ts +++ b/e2e-tests/playwright/lib/src/browser_context.ts @@ -55,6 +55,16 @@ export class TestBrowser { }; } + /** + * Switch the auth state of an existing context to a different user + * without creating a new context. After switching, pages in the context + * should be reloaded to pick up the new auth state. + */ + async switchUser(context: BrowserContext, user: UserProfile) { + const storagePath = await loginByAPI(user.username, user.password); + await context.setStorageState(storagePath); + } + async close() { for (const context of this.contexts) { await context.close(); diff --git a/e2e-tests/playwright/lib/src/index.ts b/e2e-tests/playwright/lib/src/index.ts index a7c67933e22..fad3266e093 100644 --- a/e2e-tests/playwright/lib/src/index.ts +++ b/e2e-tests/playwright/lib/src/index.ts @@ -7,7 +7,7 @@ export {baseGlobalSetup} from './global_setup'; export {TestBrowser} from './browser_context'; export {getBlobFromAsset, getFileFromAsset} from './file'; export {decomposeKorean, koreanTestPhrase, typeHangulCharacterWithIme, typeHangulWithIme} from './ime'; -export {duration, wait, newTestPassword} from './util'; +export {duration, getRandomId, wait, newTestPassword} from './util'; export { ChannelsPage, diff --git a/e2e-tests/playwright/lib/src/server/abac_helpers.ts b/e2e-tests/playwright/lib/src/server/abac_helpers.ts index ef29202d8f3..3c477a30b34 100644 --- a/e2e-tests/playwright/lib/src/server/abac_helpers.ts +++ b/e2e-tests/playwright/lib/src/server/abac_helpers.ts @@ -15,7 +15,7 @@ export async function createUserWithAttributes( client: Client4, attributes: Record, ): Promise { - const randomId = await getRandomId(); + const randomId = getRandomId(); // Ensure username starts with a letter (Mattermost requirement) const username = `user${randomId}`.toLowerCase(); diff --git a/e2e-tests/playwright/lib/src/server/ai_bridge.ts b/e2e-tests/playwright/lib/src/server/ai_bridge.ts index f31ceb1482c..8efed4b3a99 100644 --- a/e2e-tests/playwright/lib/src/server/ai_bridge.ts +++ b/e2e-tests/playwright/lib/src/server/ai_bridge.ts @@ -144,7 +144,7 @@ export async function createMockAIAgent( overrides: CreateMockAIAgentOverrides = {}, ): Promise<{agent: AIBridgeMockAgent; service: AIBridgeMockService; state: AIBridgeMockState}> { const state = await getAIBridgeMock(adminClient); - const randomId = await getRandomId(); + const randomId = getRandomId(); const service: AIBridgeMockService = { id: overrides.service?.id ?? overrides.agent?.service_id ?? `mock-service-${randomId}`, diff --git a/e2e-tests/playwright/lib/src/server/default_config.ts b/e2e-tests/playwright/lib/src/server/default_config.ts index b893f626120..d7419baab1e 100644 --- a/e2e-tests/playwright/lib/src/server/default_config.ts +++ b/e2e-tests/playwright/lib/src/server/default_config.ts @@ -86,7 +86,7 @@ const onPremServerConfig = (): Partial => { }; // Should be based only from the generated default config from ./server via "make config-reset" -// Based on v11.4 server +// Based on v11.7 server const defaultServerConfig: AdminConfig = { ServiceSettings: { SiteURL: '', @@ -175,6 +175,7 @@ const defaultServerConfig: AdminConfig = { EnableAPIUserDeletion: false, EnableAPIPostDeletion: false, EnableDesktopLandingPage: true, + MinimumDesktopAppVersion: '', ExperimentalEnableHardenedMode: false, ExperimentalStrictCSRFEnforcement: false, EnableEmailInvitations: false, @@ -214,7 +215,6 @@ const defaultServerConfig: AdminConfig = { EnableWebHubChannelIteration: false, FrameAncestors: '', DeleteAccountLink: '', - MinimumDesktopAppVersion: '', }, TeamSettings: { SiteName: 'Mattermost', @@ -431,6 +431,7 @@ const defaultServerConfig: AdminConfig = { DiscoveryEndpoint: '', ButtonText: '', ButtonColor: '', + UsePreferredUsername: false, }, GoogleSettings: { Enable: false, @@ -444,6 +445,7 @@ const defaultServerConfig: AdminConfig = { DiscoveryEndpoint: '', ButtonText: '', ButtonColor: '', + UsePreferredUsername: false, }, Office365Settings: { Enable: false, @@ -455,6 +457,7 @@ const defaultServerConfig: AdminConfig = { UserAPIEndpoint: 'https://graph.microsoft.com/v1.0/me', DiscoveryEndpoint: '', DirectoryId: '', + UsePreferredUsername: false, }, OpenIdSettings: { Enable: false, @@ -467,6 +470,7 @@ const defaultServerConfig: AdminConfig = { DiscoveryEndpoint: '', ButtonText: '', ButtonColor: '#145DBF', + UsePreferredUsername: false, }, LdapSettings: { Enable: false, @@ -775,11 +779,13 @@ const defaultServerConfig: AdminConfig = { ContentFlagging: true, InteractiveDialogAppsForm: true, EnableMattermostEntry: true, - MobileSSOCodeExchange: true, - AutoTranslation: false, + MobileSSOCodeExchange: false, + AutoTranslation: true, BurnOnRead: true, EnableAIPluginBridge: false, EnableAIRecaps: false, + IntegratedBoards: false, + CJKSearch: false, }, ImportSettings: { Directory: './import', @@ -845,9 +851,10 @@ const defaultServerConfig: AdminConfig = { }, AutoTranslationSettings: { Enable: false, + RestrictDMAndGM: false, Provider: '', TargetLanguages: ['en'], - Workers: 4, + Workers: 6, TimeoutMs: 5000, LibreTranslate: { URL: '', @@ -856,6 +863,5 @@ const defaultServerConfig: AdminConfig = { Agents: { LLMServiceID: '', }, - RestrictDMAndGM: false, }, }; diff --git a/e2e-tests/playwright/lib/src/server/team.ts b/e2e-tests/playwright/lib/src/server/team.ts index 8b646a43bb9..681205603ef 100644 --- a/e2e-tests/playwright/lib/src/server/team.ts +++ b/e2e-tests/playwright/lib/src/server/team.ts @@ -27,7 +27,7 @@ export async function createRandomTeam( type: TeamType = 'O', unique = true, ): Promise { - const randomSuffix = await getRandomId(); + const randomSuffix = getRandomId(); const team = { name: unique ? `${name}-${randomSuffix}` : name, diff --git a/e2e-tests/playwright/lib/src/server/user.ts b/e2e-tests/playwright/lib/src/server/user.ts index c706dffc935..f6b7de12bd9 100644 --- a/e2e-tests/playwright/lib/src/server/user.ts +++ b/e2e-tests/playwright/lib/src/server/user.ts @@ -41,7 +41,7 @@ export async function createNewUserProfile( } export async function createRandomUser(prefix = 'user') { - const randomId = await getRandomId(); + const randomId = getRandomId(); const user = { email: `${prefix}${randomId}@sample.mattermost.com`, diff --git a/e2e-tests/playwright/lib/src/test_fixture.ts b/e2e-tests/playwright/lib/src/test_fixture.ts index d8c25e9cc48..a082612ca46 100644 --- a/e2e-tests/playwright/lib/src/test_fixture.ts +++ b/e2e-tests/playwright/lib/src/test_fixture.ts @@ -50,7 +50,7 @@ import { import {pages} from './ui/pages'; import {matchSnapshot} from './visual'; import {stubNotification, waitForNotification} from './mock_browser_api'; -import {duration, getRandomId, simpleEmailRe, wait} from './util'; +import {duration, getRandomId, newTestPassword, simpleEmailRe, wait} from './util'; export {expect} from '@playwright/test'; @@ -131,6 +131,7 @@ export class PlaywrightExtended { // ./util readonly duration; + readonly newTestPassword; readonly simpleEmailRe; readonly wait; @@ -206,6 +207,7 @@ export class PlaywrightExtended { // ./util this.duration = duration; this.wait = wait; + this.newTestPassword = newTestPassword; this.simpleEmailRe = simpleEmailRe; this.random = { diff --git a/e2e-tests/playwright/lib/src/util.ts b/e2e-tests/playwright/lib/src/util.ts index 15a066e77aa..f6278a2469f 100644 --- a/e2e-tests/playwright/lib/src/util.ts +++ b/e2e-tests/playwright/lib/src/util.ts @@ -4,16 +4,7 @@ import path from 'node:path'; import fs from 'node:fs'; -// Lazy-load the ESM-only uuid package dynamically -let uuidv4: (() => string) | null = null; - -async function loadUuid() { - if (!uuidv4) { - const {v4} = await import('uuid'); - uuidv4 = v4; - } - return uuidv4!; -} +import {v4 as uuidv4} from 'uuid'; const second = 1000; const minute = 60 * 1000; @@ -38,15 +29,9 @@ export const wait = async (ms = 0): Promise => { return new Promise((resolve) => setTimeout(resolve, ms)); }; -/** - * Generate a random ID string. - * Because uuid is dynamically loaded, this is async. - */ -export async function getRandomId(length = 7): Promise { +export function getRandomId(length = 7): string { const MAX_SUBSTRING_INDEX = 27; - - const v4 = await loadUuid(); - return v4() + return uuidv4() .replace(/-/g, '') .substring(MAX_SUBSTRING_INDEX - length, MAX_SUBSTRING_INDEX); } diff --git a/e2e-tests/playwright/lib/tsconfig.json b/e2e-tests/playwright/lib/tsconfig.json index 506b2775cf8..0e97e004275 100644 --- a/e2e-tests/playwright/lib/tsconfig.json +++ b/e2e-tests/playwright/lib/tsconfig.json @@ -9,10 +9,9 @@ "module": "ESNext", "resolveJsonModule": true, "skipLibCheck": true, - "downlevelIteration": true, - "baseUrl": "src", + "rootDir": "src", "paths": { - "@/*": ["*"] + "@/*": ["./src/*"] } }, "include": ["src"], diff --git a/e2e-tests/playwright/package-lock.json b/e2e-tests/playwright/package-lock.json index a464ad2466d..5c1a25810d8 100644 --- a/e2e-tests/playwright/package-lock.json +++ b/e2e-tests/playwright/package-lock.json @@ -15,25 +15,25 @@ "@mattermost/types": "file:../../webapp/platform/types" }, "devDependencies": { - "@playwright/test": "1.58.1", + "@playwright/test": "1.59.1", "@types/luxon": "3.7.1", - "@typescript-eslint/eslint-plugin": "8.54.0", + "@typescript-eslint/eslint-plugin": "8.58.1", "cross-env": "10.1.0", - "dayjs": "1.11.19", + "dayjs": "1.11.20", "eslint": "9.39.2", "eslint-import-resolver-typescript": "4.4.4", "eslint-plugin-header": "3.1.1", "eslint-plugin-import": "2.32.0", - "glob": "13.0.1", + "glob": "13.0.6", "luxon": "3.7.2", - "prettier": "3.8.1", - "typescript": "5.9.3", + "prettier": "3.8.2", + "typescript": "6.0.2", "zod": "4.3.6" } }, "../../webapp/platform/client": { "name": "@mattermost/client", - "version": "11.4.0", + "version": "11.7.0", "license": "MIT", "devDependencies": { "@types/jest": "30.0.0", @@ -44,7 +44,7 @@ "typescript": "^5.0.0" }, "peerDependencies": { - "@mattermost/types": "11.4.0", + "@mattermost/types": "11.7.0", "typescript": "^4.3.0 || ^5.0.0" }, "peerDependenciesMeta": { @@ -55,7 +55,7 @@ }, "../../webapp/platform/types": { "name": "@mattermost/types", - "version": "11.4.0", + "version": "11.7.0", "license": "MIT", "devDependencies": { "typescript": "^5.0.0" @@ -71,19 +71,19 @@ }, "lib": { "name": "@mattermost/playwright-lib", - "version": "11.4.0", + "version": "11.7.0", "license": "MIT", "dependencies": { "@axe-core/playwright": "4.11.1", "@mattermost/client": "file:../../../webapp/platform/client", "@mattermost/types": "file:../../../webapp/platform/types", - "@percy/cli": "1.31.8", - "@percy/playwright": "1.0.10", + "@percy/cli": "1.31.11", + "@percy/playwright": "1.1.0", "async-wait-until": "2.0.31", - "axe-core": "4.11.1", + "axe-core": "4.11.2", "chalk": "5.6.2", "deepmerge": "4.3.1", - "dotenv": "17.2.3", + "dotenv": "17.4.2", "luxon": "3.7.2", "mime-types": "3.0.2", "uuid": "13.0.0" @@ -92,12 +92,12 @@ "@rollup/plugin-typescript": "12.3.0", "@types/luxon": "3.7.1", "@types/mime-types": "3.0.1", - "@types/node": "25.2.0", - "rollup": "4.57.1", + "@types/node": "25.6.0", + "rollup": "4.60.1", "rollup-plugin-copy": "3.5.0" }, "peerDependencies": { - "@playwright/test": ">=1.55.0" + "@playwright/test": ">=1.59.0" } }, "lib/node_modules/chalk": { @@ -148,21 +148,21 @@ } }, "node_modules/@emnapi/core": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz", - "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.2.tgz", + "integrity": "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "@emnapi/wasi-threads": "1.1.0", + "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" } }, "node_modules/@emnapi/runtime": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", - "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.2.tgz", + "integrity": "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==", "dev": true, "license": "MIT", "optional": true, @@ -171,9 +171,9 @@ } }, "node_modules/@emnapi/wasi-threads": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", - "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", "dev": true, "license": "MIT", "optional": true, @@ -218,24 +218,31 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", - "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", "dev": true, "license": "Apache-2.0", "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", - "minimatch": "^3.1.2" + "minimatch": "^3.1.5" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@eslint/config-array/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", "dev": true, "license": "MIT", "dependencies": { @@ -244,9 +251,9 @@ } }, "node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -283,20 +290,20 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", - "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", + "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", "dev": true, "license": "MIT", "dependencies": { - "ajv": "^6.12.4", + "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", - "minimatch": "^3.1.2", + "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" }, "engines": { @@ -306,10 +313,17 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", "dev": true, "license": "MIT", "dependencies": { @@ -328,9 +342,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -429,29 +443,6 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@isaacs/balanced-match": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", - "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@isaacs/brace-expansion": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.1.tgz", - "integrity": "sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@isaacs/balanced-match": "^4.0.1" - }, - "engines": { - "node": "20 || >=22" - } - }, "node_modules/@mattermost/client": { "resolved": "../../webapp/platform/client", "link": true @@ -513,20 +504,21 @@ } }, "node_modules/@percy/cli": { - "version": "1.31.8", - "resolved": "https://registry.npmjs.org/@percy/cli/-/cli-1.31.8.tgz", - "integrity": "sha512-soyU/AgK3dkKIv1tNKIaU4oi+JBroWhpvm29LlQMeLk87cItkt/Lp3aTs3HHXUKZqYGuhLQlci11n2uLtUvmVA==", + "version": "1.31.11", + "resolved": "https://registry.npmjs.org/@percy/cli/-/cli-1.31.11.tgz", + "integrity": "sha512-BiOS8oky0d7j4I3wIPSR7+BjeDMk3Hk/a6UuNzReWuhqsqAPex0hEUM+OZ3AK4hboPj6k5z61ydhfzS0UmKZSw==", "license": "MIT", "dependencies": { - "@percy/cli-app": "1.31.8", - "@percy/cli-build": "1.31.8", - "@percy/cli-command": "1.31.8", - "@percy/cli-config": "1.31.8", - "@percy/cli-exec": "1.31.8", - "@percy/cli-snapshot": "1.31.8", - "@percy/cli-upload": "1.31.8", - "@percy/client": "1.31.8", - "@percy/logger": "1.31.8" + "@percy/cli-app": "1.31.11", + "@percy/cli-build": "1.31.11", + "@percy/cli-command": "1.31.11", + "@percy/cli-config": "1.31.11", + "@percy/cli-doctor": "1.31.11", + "@percy/cli-exec": "1.31.11", + "@percy/cli-snapshot": "1.31.11", + "@percy/cli-upload": "1.31.11", + "@percy/client": "1.31.11", + "@percy/logger": "1.31.11" }, "bin": { "percy": "bin/run.cjs" @@ -536,39 +528,39 @@ } }, "node_modules/@percy/cli-app": { - "version": "1.31.8", - "resolved": "https://registry.npmjs.org/@percy/cli-app/-/cli-app-1.31.8.tgz", - "integrity": "sha512-kbSv+ZVf/fpk5R8ewLb8LwHftTOHT2XJ6MNU9s81sKEv9iDqsf6vIiDF+/nKMSsMX+ns1evw+4I2vEjASmDzoA==", + "version": "1.31.11", + "resolved": "https://registry.npmjs.org/@percy/cli-app/-/cli-app-1.31.11.tgz", + "integrity": "sha512-V5w2hKAGENHCQxIC0PnjwMd2hHNTah16YYuCm908A6dvW5eLZEYSHpGdly5sOktUgwz7WZpnEy1G9qQ+Xc3UOw==", "license": "MIT", "dependencies": { - "@percy/cli-command": "1.31.8", - "@percy/cli-exec": "1.31.8" + "@percy/cli-command": "1.31.11", + "@percy/cli-exec": "1.31.11" }, "engines": { "node": ">=14" } }, "node_modules/@percy/cli-build": { - "version": "1.31.8", - "resolved": "https://registry.npmjs.org/@percy/cli-build/-/cli-build-1.31.8.tgz", - "integrity": "sha512-aPZV6Lv7BRbGFqdGGPgfV8mMjgnoYQQQ7E1GFyVbZvsOrmqOif3osrmvwSwO7kd730cmKfhzg2iHbVBzEg+z4g==", + "version": "1.31.11", + "resolved": "https://registry.npmjs.org/@percy/cli-build/-/cli-build-1.31.11.tgz", + "integrity": "sha512-UB+FemxGPYMVdYbuFf8AzLdN7s6sRiPb0+wkleAWPX7t96Zj2vrsGicUif0SkQFyYBWd/8HL28gF/7NlAX8LSg==", "license": "MIT", "dependencies": { - "@percy/cli-command": "1.31.8" + "@percy/cli-command": "1.31.11" }, "engines": { "node": ">=14" } }, "node_modules/@percy/cli-command": { - "version": "1.31.8", - "resolved": "https://registry.npmjs.org/@percy/cli-command/-/cli-command-1.31.8.tgz", - "integrity": "sha512-nANwIfbLS78OJ9LV7WE4A6Tp1bN9OLpIPsZR7RgfNxG8YZFkyprbDA2zV+p6IYcfKoSnJBBD9isIUL+ITK+cgw==", + "version": "1.31.11", + "resolved": "https://registry.npmjs.org/@percy/cli-command/-/cli-command-1.31.11.tgz", + "integrity": "sha512-0FbuxlQ36gdVQ9DOjVgwFn4Gj0e6nPVfl6IKjcnRzt/FxytBAx84ZaxT8U4sR7CdNySOacorEo+pG8Qw+suQsQ==", "license": "MIT", "dependencies": { - "@percy/config": "1.31.8", - "@percy/core": "1.31.8", - "@percy/logger": "1.31.8" + "@percy/config": "1.31.11", + "@percy/core": "1.31.11", + "@percy/logger": "1.31.11" }, "bin": { "percy-cli-readme": "bin/readme.js" @@ -578,25 +570,75 @@ } }, "node_modules/@percy/cli-config": { - "version": "1.31.8", - "resolved": "https://registry.npmjs.org/@percy/cli-config/-/cli-config-1.31.8.tgz", - "integrity": "sha512-VmJkkwUkckbQVXecgQAewHR1lMWh/t8mEbVR9W/8iX/H1hOg1ONADFxNC/qfi3PhOO5kdWktS4r51jc0BgIEDg==", + "version": "1.31.11", + "resolved": "https://registry.npmjs.org/@percy/cli-config/-/cli-config-1.31.11.tgz", + "integrity": "sha512-kdQ7MDl+EtdOmw649J0RYdGCtEVHFZY5m51GZFO/mGDIkyQFiymeZrduqOrDcytz6hy7ttPYK+afgTYsBMmrqA==", "license": "MIT", "dependencies": { - "@percy/cli-command": "1.31.8" + "@percy/cli-command": "1.31.11" }, "engines": { "node": ">=14" } }, - "node_modules/@percy/cli-exec": { - "version": "1.31.8", - "resolved": "https://registry.npmjs.org/@percy/cli-exec/-/cli-exec-1.31.8.tgz", - "integrity": "sha512-SRZNwIZCyh38OtGWwPcQuwMVxeViHy4kP/Y0QJleDaOdH34MITwQuNMquf4Q7vZmEJ1mCamZpy/WUCDJICTuWg==", + "node_modules/@percy/cli-doctor": { + "version": "1.31.11", + "resolved": "https://registry.npmjs.org/@percy/cli-doctor/-/cli-doctor-1.31.11.tgz", + "integrity": "sha512-TRBqf+NSkf3ph9rPxLb5hLOTlWEhe9dtx3JZK1zWCRR1d/0g5NeI2RQUfWFLFF4nWIv51ljo07eUN9B1//FLag==", "license": "MIT", "dependencies": { - "@percy/cli-command": "1.31.8", - "@percy/logger": "1.31.8", + "@percy/cli-command": "1.31.11", + "@percy/client": "1.31.11", + "@percy/config": "1.31.11", + "@percy/core": "1.31.11", + "@percy/env": "1.31.11", + "@percy/logger": "1.31.11", + "@percy/monitoring": "1.31.11", + "minimatch": "^9.0.0", + "ws": "^8.17.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@percy/cli-doctor/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/@percy/cli-doctor/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@percy/cli-doctor/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@percy/cli-exec": { + "version": "1.31.11", + "resolved": "https://registry.npmjs.org/@percy/cli-exec/-/cli-exec-1.31.11.tgz", + "integrity": "sha512-AGgDVceCe/RPno7GcbqM2gWs5rjxlJLDv0+88Bi2FdkLy4mnED/m8GijgyoPDuCK8u0KFzHMEdLJYdcMtvkuFg==", + "license": "MIT", + "dependencies": { + "@percy/cli-command": "1.31.11", + "@percy/logger": "1.31.11", "cross-spawn": "^7.0.3", "which": "^2.0.2" }, @@ -605,12 +647,12 @@ } }, "node_modules/@percy/cli-snapshot": { - "version": "1.31.8", - "resolved": "https://registry.npmjs.org/@percy/cli-snapshot/-/cli-snapshot-1.31.8.tgz", - "integrity": "sha512-RQNx7eUq7Xml/EtQjsYvb9nWP/Wk4vf5SqAYHjAXSDDiK1K4BHdcxT7+GO1F+qq720/KgjwnC/JmBTulpC5a5A==", + "version": "1.31.11", + "resolved": "https://registry.npmjs.org/@percy/cli-snapshot/-/cli-snapshot-1.31.11.tgz", + "integrity": "sha512-iy7L41iFSBLqeWcadw/gBYbPs3mB+FMDt/9imFbP8YcPOLIAwf4ppAgHRxgNkUfk/8NrdfS2YQ9qWdzxmCca4w==", "license": "MIT", "dependencies": { - "@percy/cli-command": "1.31.8", + "@percy/cli-command": "1.31.11", "yaml": "^2.0.0" }, "engines": { @@ -618,12 +660,12 @@ } }, "node_modules/@percy/cli-upload": { - "version": "1.31.8", - "resolved": "https://registry.npmjs.org/@percy/cli-upload/-/cli-upload-1.31.8.tgz", - "integrity": "sha512-yuegEGVcxd/PneheBfd0D9HE36EkdPS6u3m9m6Y8GPkN0UN7eOVxoOqfPHT9wCRfUjR3K9qcdBvo11S6biLWTA==", + "version": "1.31.11", + "resolved": "https://registry.npmjs.org/@percy/cli-upload/-/cli-upload-1.31.11.tgz", + "integrity": "sha512-Iq3d+GuB2Hx9P58eOv6AsG0NzYWnXDej1c00HenUEmDpnjB1xUkYpcu3JdhO+wCOeeKBWiwXl5gOG+jPgqEJfw==", "license": "MIT", "dependencies": { - "@percy/cli-command": "1.31.8", + "@percy/cli-command": "1.31.11", "fast-glob": "^3.2.11", "image-size": "^1.0.0" }, @@ -632,14 +674,14 @@ } }, "node_modules/@percy/client": { - "version": "1.31.8", - "resolved": "https://registry.npmjs.org/@percy/client/-/client-1.31.8.tgz", - "integrity": "sha512-MxhOY5DWJnW3dsmzYICgYOyKCFLwJcaC19jTsonfmQHBa8/cKs4mUKnrUgvtJlOsW6mSk6WrAn8vUUwZ4438xQ==", + "version": "1.31.11", + "resolved": "https://registry.npmjs.org/@percy/client/-/client-1.31.11.tgz", + "integrity": "sha512-punb/KazVLSGI547BxVcOFS/qxeeVNTn/k6gRStLRx2pmHrDqOHbQ+09y59+Z/sD4irvhZPjz90nvOTUeR6L3Q==", "license": "MIT", "dependencies": { - "@percy/config": "1.31.8", - "@percy/env": "1.31.8", - "@percy/logger": "1.31.8", + "@percy/config": "1.31.11", + "@percy/env": "1.31.11", + "@percy/logger": "1.31.11", "pac-proxy-agent": "^7.0.2", "pako": "^2.1.0" }, @@ -648,12 +690,12 @@ } }, "node_modules/@percy/config": { - "version": "1.31.8", - "resolved": "https://registry.npmjs.org/@percy/config/-/config-1.31.8.tgz", - "integrity": "sha512-iK7n0YOlmk4ITvQ8l4BeaInrS/cE8MqD+368cAEGVhPjGjarDKZ06FvEZXoxU8J+4LZbNyN9h/o+2UDtFRPYyg==", + "version": "1.31.11", + "resolved": "https://registry.npmjs.org/@percy/config/-/config-1.31.11.tgz", + "integrity": "sha512-ETMiyMH9Oq5DXjZzJakgA7wt5ttNc5eGJWVsdmWwZhPEbHqJ9cS8p+YtM1xXOQajNxndLtjPdg53fsEI5O/Khg==", "license": "MIT", "dependencies": { - "@percy/logger": "1.31.8", + "@percy/logger": "1.31.11", "ajv": "^8.6.2", "cosmiconfig": "^8.0.0", "yaml": "^2.0.0" @@ -663,9 +705,9 @@ } }, "node_modules/@percy/config/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -685,18 +727,18 @@ "license": "MIT" }, "node_modules/@percy/core": { - "version": "1.31.8", - "resolved": "https://registry.npmjs.org/@percy/core/-/core-1.31.8.tgz", - "integrity": "sha512-p5KWNvbU8GUlA/DxV8q9N0alSzaEKx8aJxgO8TkmMA3HalMl/HogYw5+B7tvOUU0CAw9ar5vXyPXuOIm4wpqvA==", + "version": "1.31.11", + "resolved": "https://registry.npmjs.org/@percy/core/-/core-1.31.11.tgz", + "integrity": "sha512-3wIqC8zGocKXzTEWhauOy1xL8/adkUISgd7kix2zJvM6CPsiaxQWJdNszVKF26EKV7pvSuZWhnnAfnuS4a62+Q==", "hasInstallScript": true, "license": "MIT", "dependencies": { - "@percy/client": "1.31.8", - "@percy/config": "1.31.8", - "@percy/dom": "1.31.8", - "@percy/logger": "1.31.8", - "@percy/monitoring": "1.31.8", - "@percy/webdriver-utils": "1.31.8", + "@percy/client": "1.31.11", + "@percy/config": "1.31.11", + "@percy/dom": "1.31.11", + "@percy/logger": "1.31.11", + "@percy/monitoring": "1.31.11", + "@percy/webdriver-utils": "1.31.11", "content-disposition": "^0.5.4", "cross-spawn": "^7.0.3", "extract-zip": "^2.0.1", @@ -711,6 +753,9 @@ }, "engines": { "node": ">=14" + }, + "optionalDependencies": { + "@percy/cli-doctor": "1.31.11" } }, "node_modules/@percy/core/node_modules/mime-db": { @@ -735,41 +780,41 @@ } }, "node_modules/@percy/dom": { - "version": "1.31.8", - "resolved": "https://registry.npmjs.org/@percy/dom/-/dom-1.31.8.tgz", - "integrity": "sha512-uw4aOTTXWgj3dZPrDlM+j0+MzwDz9u8EfE92fi2HsyqDXgp0hw957b3F/YEE9TMR27s9OgwXKnOCd8zauoj0Ew==", + "version": "1.31.11", + "resolved": "https://registry.npmjs.org/@percy/dom/-/dom-1.31.11.tgz", + "integrity": "sha512-xd+2XN/NVMEoXLRfyoZqeio+MWcad7nwVHzBj99xTHWfppbJxUusV1mPmcXKuIlBgN6btBSXLsFST/YJBu804w==", "license": "MIT" }, "node_modules/@percy/env": { - "version": "1.31.8", - "resolved": "https://registry.npmjs.org/@percy/env/-/env-1.31.8.tgz", - "integrity": "sha512-nIwSkwIijMCxvRZE2MV1rn51NGHM3EgRayuKxgkhevzc1s4Y785GTS8CZyJaPshs1fWVBork87Tm9Tbuh3u1PQ==", + "version": "1.31.11", + "resolved": "https://registry.npmjs.org/@percy/env/-/env-1.31.11.tgz", + "integrity": "sha512-t+LZAeeRYzy0FAY6jtBr3loX+Z2BbIiLUW5dufzt/f2oggxPim/bLw+KIplvpL2uUdpi1/hhTpei8ZiQFiIklw==", "license": "MIT", "dependencies": { - "@percy/logger": "1.31.8" + "@percy/logger": "1.31.11" }, "engines": { "node": ">=14" } }, "node_modules/@percy/logger": { - "version": "1.31.8", - "resolved": "https://registry.npmjs.org/@percy/logger/-/logger-1.31.8.tgz", - "integrity": "sha512-OqnrtfmCdKW+2Z8LYk8Jc9HK0P89TJqp2qWnM913eDeoYZOKJX+2IyAZfsaFTcfEBAqHn0v1eynfldRedbTk3A==", + "version": "1.31.11", + "resolved": "https://registry.npmjs.org/@percy/logger/-/logger-1.31.11.tgz", + "integrity": "sha512-DX2HYqfwrbLOOSGuQf714ZqNSc51Ez4eQKPImdHg6dyMsdYMj9GBI1sIQupt43d5iOYpM/HIHNkjQnTEiku3mg==", "license": "MIT", "engines": { "node": ">=14" } }, "node_modules/@percy/monitoring": { - "version": "1.31.8", - "resolved": "https://registry.npmjs.org/@percy/monitoring/-/monitoring-1.31.8.tgz", - "integrity": "sha512-NBLQIoXWZb1Oi8M6Q6o8rmA6PzZi+65cxgyoKXHboxF7wAb8i8Vyc2JM7zTvay6RZ6JGuVHpqkxPcQaarxM1IQ==", + "version": "1.31.11", + "resolved": "https://registry.npmjs.org/@percy/monitoring/-/monitoring-1.31.11.tgz", + "integrity": "sha512-tFAKbJNgPlA+OjlfHKQmUUD8UYIl+zpPXVQ8MqObtsTVOax9TZiJEiaRNv0upfnNBZEhmQkvSiU6Gezn9zPcJw==", "license": "MIT", "dependencies": { - "@percy/config": "1.31.8", - "@percy/logger": "1.31.8", - "@percy/sdk-utils": "1.31.8", + "@percy/config": "1.31.11", + "@percy/logger": "1.31.11", + "@percy/sdk-utils": "1.31.11", "systeminformation": "^5.25.11" }, "engines": { @@ -777,9 +822,9 @@ } }, "node_modules/@percy/playwright": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/@percy/playwright/-/playwright-1.0.10.tgz", - "integrity": "sha512-lq2Mbqz/SfguQn4PdbNwApmzZpA/3gWO7STLlyLNYd0r4btGd7Nfxyxkf/t78rgh2ErwGcLUuPbxGPpZ3XXLVw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@percy/playwright/-/playwright-1.1.0.tgz", + "integrity": "sha512-4js7xbz5RqEv/Fee3kypmiwsPsHrXGwGPWR7HWS5iNywh2qfK8O8mI/XfZb+FTFR6Ebi2Cy2vNNiaaoYKCsCPQ==", "license": "MIT", "engines": { "node": ">=14" @@ -789,9 +834,9 @@ } }, "node_modules/@percy/sdk-utils": { - "version": "1.31.8", - "resolved": "https://registry.npmjs.org/@percy/sdk-utils/-/sdk-utils-1.31.8.tgz", - "integrity": "sha512-S+qxi4TIOvToAD5j89nkdDj0Xj5CH8YJxpI6ZRVJE/UQE+amHIP34KiTdrWKw5aPlYEwNPeNn9UlXz5HUr5Z9g==", + "version": "1.31.11", + "resolved": "https://registry.npmjs.org/@percy/sdk-utils/-/sdk-utils-1.31.11.tgz", + "integrity": "sha512-I4/Bx2RqSx/k00qVU0t/wcYudeyVRARQPdMnRZ/JvEZRZmXo0u+mHHpvZ5liHvnlpvWq6dv2WRA5MVy+GZHUhA==", "license": "MIT", "dependencies": { "pac-proxy-agent": "^7.0.2" @@ -801,26 +846,26 @@ } }, "node_modules/@percy/webdriver-utils": { - "version": "1.31.8", - "resolved": "https://registry.npmjs.org/@percy/webdriver-utils/-/webdriver-utils-1.31.8.tgz", - "integrity": "sha512-mfKR5EaXTTTLXX2JBFKmz9OphhHHBIMwe6lkI/hVgl1jvnTV2FXSSS2xb2Sume86uGFyj53NRH+HTNf/tepQKg==", + "version": "1.31.11", + "resolved": "https://registry.npmjs.org/@percy/webdriver-utils/-/webdriver-utils-1.31.11.tgz", + "integrity": "sha512-qz57iILE7ac+LroNQ/Hr49yRdVWwXjIWU+qO+yPl/CnEtD1TkPRk2OWrawx/OrL0qwNWqPlS8YddiJnaMtzy6A==", "license": "MIT", "dependencies": { - "@percy/config": "1.31.8", - "@percy/sdk-utils": "1.31.8" + "@percy/config": "1.31.11", + "@percy/sdk-utils": "1.31.11" }, "engines": { "node": ">=14" } }, "node_modules/@playwright/test": { - "version": "1.58.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.58.1.tgz", - "integrity": "sha512-6LdVIUERWxQMmUSSQi0I53GgCBYgM2RpGngCPY7hSeju+VrKjq3lvs7HpJoPbDiY5QM5EYRtRX5fvrinnMAz3w==", + "version": "1.59.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.59.1.tgz", + "integrity": "sha512-PG6q63nQg5c9rIi4/Z5lR5IVF7yU5MqmKaPOe0HSc0O2cX1fPi96sUQu5j7eo4gKCkB2AnNGoWt7y4/Xx3Kcqg==", "license": "Apache-2.0", "peer": true, "dependencies": { - "playwright": "1.58.1" + "playwright": "1.59.1" }, "bin": { "playwright": "cli.js" @@ -880,9 +925,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz", - "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.1.tgz", + "integrity": "sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA==", "cpu": [ "arm" ], @@ -894,9 +939,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz", - "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.1.tgz", + "integrity": "sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA==", "cpu": [ "arm64" ], @@ -908,9 +953,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz", - "integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.1.tgz", + "integrity": "sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==", "cpu": [ "arm64" ], @@ -922,9 +967,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz", - "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.1.tgz", + "integrity": "sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew==", "cpu": [ "x64" ], @@ -936,9 +981,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz", - "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.1.tgz", + "integrity": "sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w==", "cpu": [ "arm64" ], @@ -950,9 +995,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz", - "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.1.tgz", + "integrity": "sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g==", "cpu": [ "x64" ], @@ -964,9 +1009,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz", - "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.1.tgz", + "integrity": "sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==", "cpu": [ "arm" ], @@ -978,9 +1023,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz", - "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.1.tgz", + "integrity": "sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==", "cpu": [ "arm" ], @@ -992,9 +1037,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz", - "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.1.tgz", + "integrity": "sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==", "cpu": [ "arm64" ], @@ -1006,9 +1051,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz", - "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.1.tgz", + "integrity": "sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==", "cpu": [ "arm64" ], @@ -1020,9 +1065,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz", - "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.1.tgz", + "integrity": "sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==", "cpu": [ "loong64" ], @@ -1034,9 +1079,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz", - "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.1.tgz", + "integrity": "sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==", "cpu": [ "loong64" ], @@ -1048,9 +1093,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz", - "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.1.tgz", + "integrity": "sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==", "cpu": [ "ppc64" ], @@ -1062,9 +1107,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz", - "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.1.tgz", + "integrity": "sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==", "cpu": [ "ppc64" ], @@ -1076,9 +1121,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz", - "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.1.tgz", + "integrity": "sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==", "cpu": [ "riscv64" ], @@ -1090,9 +1135,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz", - "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.1.tgz", + "integrity": "sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==", "cpu": [ "riscv64" ], @@ -1104,9 +1149,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz", - "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.1.tgz", + "integrity": "sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==", "cpu": [ "s390x" ], @@ -1118,9 +1163,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz", - "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.1.tgz", + "integrity": "sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==", "cpu": [ "x64" ], @@ -1132,9 +1177,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz", - "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.1.tgz", + "integrity": "sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==", "cpu": [ "x64" ], @@ -1146,9 +1191,9 @@ ] }, "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz", - "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.1.tgz", + "integrity": "sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==", "cpu": [ "x64" ], @@ -1160,9 +1205,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz", - "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.1.tgz", + "integrity": "sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA==", "cpu": [ "arm64" ], @@ -1174,9 +1219,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz", - "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.1.tgz", + "integrity": "sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g==", "cpu": [ "arm64" ], @@ -1188,9 +1233,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz", - "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.1.tgz", + "integrity": "sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg==", "cpu": [ "ia32" ], @@ -1202,9 +1247,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz", - "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.1.tgz", + "integrity": "sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg==", "cpu": [ "x64" ], @@ -1216,9 +1261,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz", - "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.1.tgz", + "integrity": "sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ==", "cpu": [ "x64" ], @@ -1317,13 +1362,13 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "25.2.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.0.tgz", - "integrity": "sha512-DZ8VwRFUNzuqJ5khrvwMXHmvPe+zGayJhr2CDNiKB1WBE1ST8Djl00D0IC4vvNmHMdj6DlbYRIaFE7WHjlDl5w==", + "version": "25.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.6.0.tgz", + "integrity": "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==", "devOptional": true, "license": "MIT", "dependencies": { - "undici-types": "~7.16.0" + "undici-types": "~7.19.0" } }, "node_modules/@types/yauzl": { @@ -1337,20 +1382,20 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.54.0.tgz", - "integrity": "sha512-hAAP5io/7csFStuOmR782YmTthKBJ9ND3WVL60hcOjvtGFb+HJxH4O5huAcmcZ9v9G8P+JETiZ/G1B8MALnWZQ==", + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.58.1.tgz", + "integrity": "sha512-eSkwoemjo76bdXl2MYqtxg51HNwUSkWfODUOQ3PaTLZGh9uIWWFZIjyjaJnex7wXDu+TRx+ATsnSxdN9YWfRTQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.54.0", - "@typescript-eslint/type-utils": "8.54.0", - "@typescript-eslint/utils": "8.54.0", - "@typescript-eslint/visitor-keys": "8.54.0", + "@typescript-eslint/scope-manager": "8.58.1", + "@typescript-eslint/type-utils": "8.58.1", + "@typescript-eslint/utils": "8.58.1", + "@typescript-eslint/visitor-keys": "8.58.1", "ignore": "^7.0.5", "natural-compare": "^1.4.0", - "ts-api-utils": "^2.4.0" + "ts-api-utils": "^2.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1360,23 +1405,22 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.54.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "@typescript-eslint/parser": "^8.58.1", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/parser": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.54.0.tgz", - "integrity": "sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA==", + "version": "8.58.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.58.2.tgz", + "integrity": "sha512-/Zb/xaIDfxeJnvishjGdcR4jmr7S+bda8PKNhRGdljDM+elXhlvN0FyPSsMnLmJUrVG9aPO6dof80wjMawsASg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.54.0", - "@typescript-eslint/types": "8.54.0", - "@typescript-eslint/typescript-estree": "8.54.0", - "@typescript-eslint/visitor-keys": "8.54.0", + "@typescript-eslint/scope-manager": "8.58.2", + "@typescript-eslint/types": "8.58.2", + "@typescript-eslint/typescript-estree": "8.58.2", + "@typescript-eslint/visitor-keys": "8.58.2", "debug": "^4.4.3" }, "engines": { @@ -1387,19 +1431,68 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "version": "8.58.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.58.2.tgz", + "integrity": "sha512-SgmyvDPexWETQek+qzZnrG6844IaO02UVyOLhI4wpo82dpZJY9+6YZCKAMFzXb7qhx37mFK1QcPQ18tud+vo6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.58.2", + "@typescript-eslint/visitor-keys": "8.58.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.58.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.58.2.tgz", + "integrity": "sha512-f1WO2Lx8a9t8DARmcWAUPJbu0G20bJlj8L4z72K00TMeJAoyLr/tHhI/pzYBLrR4dXWkcxO1cWYZEOX8DKHTqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.58.2", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.54.0.tgz", - "integrity": "sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g==", + "version": "8.58.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.58.2.tgz", + "integrity": "sha512-Cq6UfpZZk15+r87BkIh5rDpi38W4b+Sjnb8wQCPPDDweS/LRCFjCyViEbzHk5Ck3f2QDfgmlxqSa7S7clDtlfg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.54.0", - "@typescript-eslint/types": "^8.54.0", + "@typescript-eslint/tsconfig-utils": "^8.58.2", + "@typescript-eslint/types": "^8.58.2", "debug": "^4.4.3" }, "engines": { @@ -1410,18 +1503,18 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.54.0.tgz", - "integrity": "sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg==", + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.58.1.tgz", + "integrity": "sha512-TPYUEqJK6avLcEjumWsIuTpuYODTTDAtoMdt8ZZa93uWMTX13Nb8L5leSje1NluammvU+oI3QRr5lLXPgihX3w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.54.0", - "@typescript-eslint/visitor-keys": "8.54.0" + "@typescript-eslint/types": "8.58.1", + "@typescript-eslint/visitor-keys": "8.58.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1431,10 +1524,24 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/types": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.58.1.tgz", + "integrity": "sha512-io/dV5Aw5ezwzfPBBWLoT+5QfVtP8O7q4Kftjn5azJ88bYyp/ZMCsyW1lpKK46EXJcaYMZ1JtYj+s/7TdzmQMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.54.0.tgz", - "integrity": "sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw==", + "version": "8.58.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.58.2.tgz", + "integrity": "sha512-3SR+RukipDvkkKp/d0jP0dyzuls3DbGmwDpVEc5wqk5f38KFThakqAAO0XMirWAE+kT00oTauTbzMFGPoAzB0A==", "dev": true, "license": "MIT", "engines": { @@ -1445,21 +1552,21 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.54.0.tgz", - "integrity": "sha512-hiLguxJWHjjwL6xMBwD903ciAwd7DmK30Y9Axs/etOkftC3ZNN9K44IuRD/EB08amu+Zw6W37x9RecLkOo3pMA==", + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.58.1.tgz", + "integrity": "sha512-HUFxvTJVroT+0rXVJC7eD5zol6ID+Sn5npVPWoFuHGg9Ncq5Q4EYstqR+UOqaNRFXi5TYkpXXkLhoCHe3G0+7w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.54.0", - "@typescript-eslint/typescript-estree": "8.54.0", - "@typescript-eslint/utils": "8.54.0", + "@typescript-eslint/types": "8.58.1", + "@typescript-eslint/typescript-estree": "8.58.1", + "@typescript-eslint/utils": "8.58.1", "debug": "^4.4.3", - "ts-api-utils": "^2.4.0" + "ts-api-utils": "^2.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1469,14 +1576,95 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/project-service": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.58.1.tgz", + "integrity": "sha512-gfQ8fk6cxhtptek+/8ZIqw8YrRW5048Gug8Ts5IYcMLCw18iUgrZAEY/D7s4hkI0FxEfGakKuPK/XUMPzPxi5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.58.1", + "@typescript-eslint/types": "^8.58.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.58.1.tgz", + "integrity": "sha512-JAr2hOIct2Q+qk3G+8YFfqkqi7sC86uNryT+2i5HzMa2MPjw4qNFvtjnw1IiA1rP7QhNKVe21mSSLaSjwA1Olw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.58.1.tgz", + "integrity": "sha512-io/dV5Aw5ezwzfPBBWLoT+5QfVtP8O7q4Kftjn5azJ88bYyp/ZMCsyW1lpKK46EXJcaYMZ1JtYj+s/7TdzmQMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.58.1.tgz", + "integrity": "sha512-w4w7WR7GHOjqqPnvAYbazq+Y5oS68b9CzasGtnd6jIeOIeKUzYzupGTB2T4LTPSv4d+WPeccbxuneTFHYgAAWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.58.1", + "@typescript-eslint/tsconfig-utils": "8.58.1", + "@typescript-eslint/types": "8.58.1", + "@typescript-eslint/visitor-keys": "8.58.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/types": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.54.0.tgz", - "integrity": "sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==", + "version": "8.58.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.58.2.tgz", + "integrity": "sha512-9TukXyATBQf/Jq9AMQXfvurk+G5R2MwfqQGDR2GzGz28HvY/lXNKGhkY+6IOubwcquikWk5cjlgPvD2uAA7htQ==", "dev": true, "license": "MIT", "engines": { @@ -1488,21 +1676,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.54.0.tgz", - "integrity": "sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA==", + "version": "8.58.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.58.2.tgz", + "integrity": "sha512-ELGuoofuhhoCvNbQjFFiobFcGgcDCEm0ThWdmO4Z0UzLqPXS3KFvnEZ+SHewwOYHjM09tkzOWXNTv9u6Gqtyuw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.54.0", - "@typescript-eslint/tsconfig-utils": "8.54.0", - "@typescript-eslint/types": "8.54.0", - "@typescript-eslint/visitor-keys": "8.54.0", + "@typescript-eslint/project-service": "8.58.2", + "@typescript-eslint/tsconfig-utils": "8.58.2", + "@typescript-eslint/types": "8.58.2", + "@typescript-eslint/visitor-keys": "8.58.2", "debug": "^4.4.3", - "minimatch": "^9.0.5", + "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.4.0" + "ts-api-utils": "^2.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1512,20 +1700,51 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.58.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.58.2.tgz", + "integrity": "sha512-f1WO2Lx8a9t8DARmcWAUPJbu0G20bJlj8L4z72K00TMeJAoyLr/tHhI/pzYBLrR4dXWkcxO1cWYZEOX8DKHTqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.58.2", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/@typescript-eslint/utils": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.54.0.tgz", - "integrity": "sha512-9Cnda8GS57AQakvRyG0PTejJNlA2xhvyNtEVIMlDWOOeEyBkYWhGPnfrIAnqxLMTSTo6q8g12XVjjev5l1NvMA==", + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.58.1.tgz", + "integrity": "sha512-Ln8R0tmWC7pTtLOzgJzYTXSCjJ9rDNHAqTaVONF4FEi2qwce8mD9iSOxOpLFFvWp/wBFlew0mjM1L1ihYWfBdQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.54.0", - "@typescript-eslint/types": "8.54.0", - "@typescript-eslint/typescript-estree": "8.54.0" + "@typescript-eslint/scope-manager": "8.58.1", + "@typescript-eslint/types": "8.58.1", + "@typescript-eslint/typescript-estree": "8.58.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1535,36 +1754,131 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.54.0.tgz", - "integrity": "sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==", + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/project-service": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.58.1.tgz", + "integrity": "sha512-gfQ8fk6cxhtptek+/8ZIqw8YrRW5048Gug8Ts5IYcMLCw18iUgrZAEY/D7s4hkI0FxEfGakKuPK/XUMPzPxi5g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.54.0", - "eslint-visitor-keys": "^4.2.1" + "@typescript-eslint/tsconfig-utils": "^8.58.1", + "@typescript-eslint/types": "^8.58.1", + "debug": "^4.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.58.1.tgz", + "integrity": "sha512-JAr2hOIct2Q+qk3G+8YFfqkqi7sC86uNryT+2i5HzMa2MPjw4qNFvtjnw1IiA1rP7QhNKVe21mSSLaSjwA1Olw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.58.1.tgz", + "integrity": "sha512-io/dV5Aw5ezwzfPBBWLoT+5QfVtP8O7q4Kftjn5azJ88bYyp/ZMCsyW1lpKK46EXJcaYMZ1JtYj+s/7TdzmQMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.58.1.tgz", + "integrity": "sha512-w4w7WR7GHOjqqPnvAYbazq+Y5oS68b9CzasGtnd6jIeOIeKUzYzupGTB2T4LTPSv4d+WPeccbxuneTFHYgAAWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.58.1", + "@typescript-eslint/tsconfig-utils": "8.58.1", + "@typescript-eslint/types": "8.58.1", + "@typescript-eslint/visitor-keys": "8.58.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.58.1.tgz", + "integrity": "sha512-y+vH7QE8ycjoa0bWciFg7OpFcipUuem1ujhrdLtq1gByKwfbC7bPeKsiny9e0urg93DqwGcHey+bGRKCnF1nZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.58.1", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/@typescript-eslint/types": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.58.1.tgz", + "integrity": "sha512-io/dV5Aw5ezwzfPBBWLoT+5QfVtP8O7q4Kftjn5azJ88bYyp/ZMCsyW1lpKK46EXJcaYMZ1JtYj+s/7TdzmQMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" @@ -1840,9 +2154,9 @@ ] }, "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "license": "MIT", "peer": true, @@ -1873,9 +2187,9 @@ } }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "dev": true, "license": "MIT", "dependencies": { @@ -2096,37 +2410,44 @@ } }, "node_modules/axe-core": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.1.tgz", - "integrity": "sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A==", + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.2.tgz", + "integrity": "sha512-byD6KPdvo72y/wj2T/4zGEvvlis+PsZsn/yPS3pEO+sFpcrqRpX/TJCxvVaEsNeMrfQbCr7w163YqoD9IYwHXw==", "license": "MPL-2.0", "engines": { "node": ">=4" } }, "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } }, "node_modules/basic-ftp": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.1.0.tgz", - "integrity": "sha512-RkaJzeJKDbaDWTIPiJwubyljaEPwpVWkm9Rt5h9Nd6h7tEXTJ3VB4qxdZBioV7JO5yLUaOKwz7vDOzlncUsegw==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.2.2.tgz", + "integrity": "sha512-1tDrzKsdCg70WGvbFss/ulVAxupNauGnOlgpyjKzeQxzyllBLS0CGLV7tjIXTK3ZQA9/FBEm9qyFFN1bciA6pw==", "license": "MIT", "engines": { "node": ">=10.0.0" } }, "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" } }, "node_modules/braces": { @@ -2151,15 +2472,15 @@ } }, "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", "set-function-length": "^1.2.2" }, "engines": { @@ -2393,9 +2714,9 @@ } }, "node_modules/dayjs": { - "version": "1.11.19", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz", - "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==", + "version": "1.11.20", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.20.tgz", + "integrity": "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==", "dev": true, "license": "MIT" }, @@ -2509,9 +2830,9 @@ } }, "node_modules/dotenv": { - "version": "17.2.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz", - "integrity": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==", + "version": "17.4.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.4.2.tgz", + "integrity": "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==", "license": "BSD-2-Clause", "engines": { "node": ">=12" @@ -2554,9 +2875,9 @@ } }, "node_modules/es-abstract": { - "version": "1.24.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", - "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", + "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", "dev": true, "license": "MIT", "dependencies": { @@ -2823,15 +3144,15 @@ } }, "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz", + "integrity": "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==", "dev": true, "license": "MIT", "dependencies": { "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" + "is-core-module": "^2.16.1", + "resolve": "^2.0.0-next.6" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { @@ -2844,6 +3165,30 @@ "ms": "^2.1.1" } }, + "node_modules/eslint-import-resolver-node/node_modules/resolve": { + "version": "2.0.0-next.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.6.tgz", + "integrity": "sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/eslint-import-resolver-typescript": { "version": "4.4.4", "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-4.4.4.tgz", @@ -2952,10 +3297,17 @@ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, + "node_modules/eslint-plugin-import/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/eslint-plugin-import/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", "dev": true, "license": "MIT", "dependencies": { @@ -2974,9 +3326,9 @@ } }, "node_modules/eslint-plugin-import/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -3026,10 +3378,17 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", "dev": true, "license": "MIT", "dependencies": { @@ -3061,9 +3420,9 @@ } }, "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -3345,9 +3704,9 @@ } }, "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", "dev": true, "license": "ISC" }, @@ -3526,9 +3885,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.1.tgz", - "integrity": "sha512-EoY1N2xCn44xU6750Sx7OjOIT59FkmstNc3X6y5xpz7D5cBtZRe/3pSlTkDJgqsOk3WwZPkWfonhhUJfttQo3w==", + "version": "4.13.7", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.7.tgz", + "integrity": "sha512-7tN6rFgBlMgpBML5j8typ92BKFi2sFQvIdpAqLA2beia5avZDrMs0FLZiM5etShWq5irVyGcGMEA1jcDaK7A/Q==", "dev": true, "license": "MIT", "dependencies": { @@ -3553,18 +3912,18 @@ } }, "node_modules/glob": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.1.tgz", - "integrity": "sha512-B7U/vJpE3DkJ5WXTgTpTRN63uV42DseiXXKMwG14LQBXmsdeIoHAPbU/MEo6II0k5ED74uc2ZGTC6MwHFQhF6w==", + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "minimatch": "^10.1.2", - "minipass": "^7.1.2", - "path-scurry": "^2.0.0" + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -3583,22 +3942,6 @@ "node": ">=10.13.0" } }, - "node_modules/glob/node_modules/minimatch": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.2.tgz", - "integrity": "sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/brace-expansion": "^5.0.1" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/globals": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", @@ -3649,10 +3992,17 @@ "node": ">=8" } }, + "node_modules/globby/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/globby/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", "dev": true, "license": "MIT", "dependencies": { @@ -3693,9 +4043,9 @@ } }, "node_modules/globby/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -4487,9 +4837,9 @@ "license": "MIT" }, "node_modules/lru-cache": { - "version": "11.2.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.5.tgz", - "integrity": "sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==", + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.5.tgz", + "integrity": "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==", "dev": true, "license": "BlueOak-1.0.0", "engines": { @@ -4538,9 +4888,9 @@ } }, "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "license": "MIT", "engines": { "node": ">=8.6" @@ -4575,16 +4925,16 @@ } }, "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^5.0.5" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -4601,11 +4951,11 @@ } }, "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "engines": { "node": ">=16 || 14 >=14.17" } @@ -4640,14 +4990,43 @@ "license": "MIT" }, "node_modules/netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.1.1.tgz", + "integrity": "sha512-eonl3sLUha+S1GzTPxychyhnUzKyeQkZ7jLjKrBagJgPla13F+uQ71HgpFefyHgqrjEbCPkDArxYsjY8/+gLKA==", "license": "MIT", "engines": { "node": ">= 0.4.0" } }, + "node_modules/node-exports-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz", + "integrity": "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array.prototype.flatmap": "^1.3.3", + "es-errors": "^1.3.0", + "object.entries": "^1.1.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/node-exports-info/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", @@ -4692,6 +5071,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/object.fromentries": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", @@ -4926,9 +5321,9 @@ "license": "MIT" }, "node_modules/path-scurry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", - "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -4936,7 +5331,7 @@ "minipass": "^7.1.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -4970,9 +5365,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { @@ -4983,12 +5378,12 @@ } }, "node_modules/playwright": { - "version": "1.58.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.1.tgz", - "integrity": "sha512-+2uTZHxSCcxjvGc5C891LrS1/NlxglGxzrC4seZiVjcYVQfUa87wBL6rTDqzGjuoWNjnBzRqKmF6zRYGMvQUaQ==", + "version": "1.59.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.59.1.tgz", + "integrity": "sha512-C8oWjPR3F81yljW9o5OxcWzfh6avkVwDD2VYdwIGqTkl+OGFISgypqzfu7dOe4QNLL2aqcWBmI3PMtLIK233lw==", "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.58.1" + "playwright-core": "1.59.1" }, "bin": { "playwright": "cli.js" @@ -5001,9 +5396,9 @@ } }, "node_modules/playwright-core": { - "version": "1.58.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.1.tgz", - "integrity": "sha512-bcWzOaTxcW+VOOGBCQgnaKToLJ65d6AqfLVKEWvexyS3AS6rbXl+xdpYRMGSRBClPvyj44njOWoxjNdL/H9UNg==", + "version": "1.59.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.59.1.tgz", + "integrity": "sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg==", "license": "Apache-2.0", "peer": true, "bin": { @@ -5034,9 +5429,9 @@ } }, "node_modules/prettier": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", - "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.2.tgz", + "integrity": "sha512-8c3mgTe0ASwWAJK+78dpviD+A8EqhndQPUBpNUIPt6+xWlIigCwfN01lWr9MAede4uqXGTEKeQWTvzb3vjia0Q==", "dev": true, "license": "MIT", "bin": { @@ -5050,9 +5445,9 @@ } }, "node_modules/pump": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", - "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", @@ -5152,12 +5547,13 @@ } }, "node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", "dev": true, "license": "MIT", "dependencies": { + "es-errors": "^1.3.0", "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" @@ -5217,10 +5613,16 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rimraf/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, "node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -5249,9 +5651,9 @@ } }, "node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -5261,9 +5663,9 @@ } }, "node_modules/rollup": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.1.tgz", - "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.1.tgz", + "integrity": "sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==", "dev": true, "license": "MIT", "peer": true, @@ -5278,31 +5680,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.57.1", - "@rollup/rollup-android-arm64": "4.57.1", - "@rollup/rollup-darwin-arm64": "4.57.1", - "@rollup/rollup-darwin-x64": "4.57.1", - "@rollup/rollup-freebsd-arm64": "4.57.1", - "@rollup/rollup-freebsd-x64": "4.57.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.57.1", - "@rollup/rollup-linux-arm-musleabihf": "4.57.1", - "@rollup/rollup-linux-arm64-gnu": "4.57.1", - "@rollup/rollup-linux-arm64-musl": "4.57.1", - "@rollup/rollup-linux-loong64-gnu": "4.57.1", - "@rollup/rollup-linux-loong64-musl": "4.57.1", - "@rollup/rollup-linux-ppc64-gnu": "4.57.1", - "@rollup/rollup-linux-ppc64-musl": "4.57.1", - "@rollup/rollup-linux-riscv64-gnu": "4.57.1", - "@rollup/rollup-linux-riscv64-musl": "4.57.1", - "@rollup/rollup-linux-s390x-gnu": "4.57.1", - "@rollup/rollup-linux-x64-gnu": "4.57.1", - "@rollup/rollup-linux-x64-musl": "4.57.1", - "@rollup/rollup-openbsd-x64": "4.57.1", - "@rollup/rollup-openharmony-arm64": "4.57.1", - "@rollup/rollup-win32-arm64-msvc": "4.57.1", - "@rollup/rollup-win32-ia32-msvc": "4.57.1", - "@rollup/rollup-win32-x64-gnu": "4.57.1", - "@rollup/rollup-win32-x64-msvc": "4.57.1", + "@rollup/rollup-android-arm-eabi": "4.60.1", + "@rollup/rollup-android-arm64": "4.60.1", + "@rollup/rollup-darwin-arm64": "4.60.1", + "@rollup/rollup-darwin-x64": "4.60.1", + "@rollup/rollup-freebsd-arm64": "4.60.1", + "@rollup/rollup-freebsd-x64": "4.60.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.1", + "@rollup/rollup-linux-arm-musleabihf": "4.60.1", + "@rollup/rollup-linux-arm64-gnu": "4.60.1", + "@rollup/rollup-linux-arm64-musl": "4.60.1", + "@rollup/rollup-linux-loong64-gnu": "4.60.1", + "@rollup/rollup-linux-loong64-musl": "4.60.1", + "@rollup/rollup-linux-ppc64-gnu": "4.60.1", + "@rollup/rollup-linux-ppc64-musl": "4.60.1", + "@rollup/rollup-linux-riscv64-gnu": "4.60.1", + "@rollup/rollup-linux-riscv64-musl": "4.60.1", + "@rollup/rollup-linux-s390x-gnu": "4.60.1", + "@rollup/rollup-linux-x64-gnu": "4.60.1", + "@rollup/rollup-linux-x64-musl": "4.60.1", + "@rollup/rollup-openbsd-x64": "4.60.1", + "@rollup/rollup-openharmony-arm64": "4.60.1", + "@rollup/rollup-win32-arm64-msvc": "4.60.1", + "@rollup/rollup-win32-ia32-msvc": "4.60.1", + "@rollup/rollup-win32-x64-gnu": "4.60.1", + "@rollup/rollup-win32-x64-msvc": "4.60.1", "fsevents": "~2.3.2" } }, @@ -5422,9 +5824,9 @@ } }, "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, "license": "ISC", "bin": { @@ -5525,14 +5927,14 @@ } }, "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" + "object-inspect": "^1.13.4" }, "engines": { "node": ">= 0.4" @@ -5771,9 +6173,9 @@ } }, "node_modules/systeminformation": { - "version": "5.30.7", - "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.30.7.tgz", - "integrity": "sha512-33B/cftpaWdpvH+Ho9U1b08ss8GQuLxrWHelbJT1yw4M48Taj8W3ezcPuaLoIHZz5V6tVHuQPr5BprEfnBLBMw==", + "version": "5.31.5", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.31.5.tgz", + "integrity": "sha512-5SyLdip4/3alxD4Kh+63bUQTJmu7YMfYQTC+koZy7X73HgNqZSD2P4wOZQWtUncvPvcEmnfIjCoygN4MRoEejQ==", "license": "MIT", "os": [ "darwin", @@ -5797,14 +6199,14 @@ } }, "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", "dev": true, "license": "MIT", "dependencies": { "fdir": "^6.5.0", - "picomatch": "^4.0.3" + "picomatch": "^4.0.4" }, "engines": { "node": ">=12.0.0" @@ -5826,9 +6228,9 @@ } }, "node_modules/ts-api-utils": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", - "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", "dev": true, "license": "MIT", "engines": { @@ -5949,9 +6351,9 @@ } }, "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.2.tgz", + "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", "devOptional": true, "license": "Apache-2.0", "peer": true, @@ -5983,9 +6385,9 @@ } }, "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "version": "7.19.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.19.2.tgz", + "integrity": "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==", "devOptional": true, "license": "MIT" }, @@ -6179,9 +6581,9 @@ "license": "ISC" }, "node_modules/ws": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", - "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz", + "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -6200,9 +6602,9 @@ } }, "node_modules/yaml": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", - "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", + "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", "license": "ISC", "bin": { "yaml": "bin.mjs" diff --git a/e2e-tests/playwright/package.json b/e2e-tests/playwright/package.json index c7caea83213..5d59935868d 100644 --- a/e2e-tests/playwright/package.json +++ b/e2e-tests/playwright/package.json @@ -34,19 +34,19 @@ "@mattermost/types": "file:../../webapp/platform/types" }, "devDependencies": { - "@playwright/test": "1.58.1", + "@playwright/test": "1.59.1", "@types/luxon": "3.7.1", - "@typescript-eslint/eslint-plugin": "8.54.0", + "@typescript-eslint/eslint-plugin": "8.58.1", "cross-env": "10.1.0", - "dayjs": "1.11.19", + "dayjs": "1.11.20", "eslint": "9.39.2", "eslint-import-resolver-typescript": "4.4.4", "eslint-plugin-header": "3.1.1", "eslint-plugin-import": "2.32.0", - "glob": "13.0.1", + "glob": "13.0.6", "luxon": "3.7.2", - "prettier": "3.8.1", - "typescript": "5.9.3", + "prettier": "3.8.2", + "typescript": "6.0.2", "zod": "4.3.6" } } diff --git a/e2e-tests/playwright/playwright.config.ts b/e2e-tests/playwright/playwright.config.ts index e3502eb1763..95f3e955a3d 100644 --- a/e2e-tests/playwright/playwright.config.ts +++ b/e2e-tests/playwright/playwright.config.ts @@ -40,7 +40,7 @@ export default defineConfig({ }, screenshot: 'only-on-failure', timezoneId: Intl.DateTimeFormat().resolvedOptions().timeZone, - trace: 'off', + trace: 'retain-on-failure-and-retries', video: 'retain-on-failure', actionTimeout: duration.half_min, }, diff --git a/e2e-tests/playwright/specs/client/upload_file.spec.ts b/e2e-tests/playwright/specs/client/upload_file.spec.ts index c8016ba1b0f..f333d225c61 100644 --- a/e2e-tests/playwright/specs/client/upload_file.spec.ts +++ b/e2e-tests/playwright/specs/client/upload_file.spec.ts @@ -27,7 +27,7 @@ test.beforeEach(async ({pw}) => { test('should succeed with File', async ({pw}) => { // # Prepare data with File - const clientId = await pw.random.id(); + const clientId = pw.random.id(); const formData = new FormData(); formData.set('channel_id', townSquareChannel.id); formData.set('client_ids', clientId); @@ -40,7 +40,7 @@ test('should succeed with File', async ({pw}) => { test('should succeed with Blob', async ({pw}) => { // # Prepare data with Blob - const clientId = await pw.random.id(); + const clientId = pw.random.id(); const formData = new FormData(); formData.set('channel_id', townSquareChannel.id); formData.set('client_ids', clientId); @@ -69,7 +69,7 @@ test('should succeed even with channel_id only', async () => { }); test('should fail on invalid channel ID', async ({pw}) => { - const clientId = await pw.random.id(); + const clientId = pw.random.id(); // # Set with invalid channel ID let formData = new FormData(); @@ -92,7 +92,7 @@ test('should fail on invalid channel ID', async ({pw}) => { }); test('should fail on missing files', async ({pw}) => { - const clientId = await pw.random.id(); + const clientId = pw.random.id(); // # Set with invalid channel ID const formData = new FormData(); @@ -105,7 +105,7 @@ test('should fail on missing files', async ({pw}) => { }); test('should fail on incorrect order setting up FormData', async ({pw}) => { - const clientId = await pw.random.id(); + const clientId = pw.random.id(); // # Set with files before client_ids const formData = new FormData(); diff --git a/e2e-tests/playwright/specs/functional/channels/ai/recaps.spec.ts b/e2e-tests/playwright/specs/functional/channels/ai/recaps.spec.ts index 21541d12175..61bccbc7db9 100644 --- a/e2e-tests/playwright/specs/functional/channels/ai/recaps.spec.ts +++ b/e2e-tests/playwright/specs/functional/channels/ai/recaps.spec.ts @@ -11,10 +11,10 @@ import type {PlaywrightExtended} from '@mattermost/playwright-lib'; * @objective Verify a user can create a selected-channels AI recap and receive the mocked summary without reloading the page */ test('creates selected-channels recap and auto-renders mocked summary', {tag: '@ai_recaps'}, async ({pw}) => { - const recapHighlight = `Deterministic highlight ${await pw.random.id()}`; - const recapActionItem = `Deterministic action item ${await pw.random.id()}`; - const recapTitle = `AI recap ${await pw.random.id()}`; - const sourceMessage = `Please summarize this update ${await pw.random.id()}`; + const recapHighlight = `Deterministic highlight ${pw.random.id()}`; + const recapActionItem = `Deterministic action item ${pw.random.id()}`; + const recapTitle = `AI recap ${pw.random.id()}`; + const sourceMessage = `Please summarize this update ${pw.random.id()}`; // # Initialize the test server state and configure one deterministic recap agent. const {adminClient, adminUser, team, user, userClient} = await pw.initSetup(); @@ -82,11 +82,11 @@ test('creates selected-channels recap and auto-renders mocked summary', {tag: '@ * @objective Verify the all-unreads recap flow skips channel selection and only summarizes unread channels */ test('creates all-unreads recap for only unread channels', {tag: '@ai_recaps'}, async ({pw}) => { - const recapTitle = `Unread recap ${await pw.random.id()}`; - const sourceMessageOne = `Unread source one ${await pw.random.id()}`; - const sourceMessageTwo = `Unread source two ${await pw.random.id()}`; - const highlightOne = `Unread highlight one ${await pw.random.id()}`; - const highlightTwo = `Unread highlight two ${await pw.random.id()}`; + const recapTitle = `Unread recap ${pw.random.id()}`; + const sourceMessageOne = `Unread source one ${pw.random.id()}`; + const sourceMessageTwo = `Unread source two ${pw.random.id()}`; + const highlightOne = `Unread highlight one ${pw.random.id()}`; + const highlightTwo = `Unread highlight two ${pw.random.id()}`; // # Initialize the test server state, clear baseline unread state, and configure two deterministic recap completions. const {adminClient, adminUser, team, user, userClient} = await pw.initSetup(); @@ -190,9 +190,9 @@ test('disables recap creation when the bridge is unavailable', {tag: '@ai_recaps * @objective Verify marking a recap as read moves it from the Unread tab to the Read tab */ test('moves a recap from unread to read when marked read', {tag: '@ai_recaps'}, async ({pw}) => { - const recapTitle = `Read state recap ${await pw.random.id()}`; - const recapHighlight = `Read state highlight ${await pw.random.id()}`; - const sourceMessage = `Read state source ${await pw.random.id()}`; + const recapTitle = `Read state recap ${pw.random.id()}`; + const recapHighlight = `Read state highlight ${pw.random.id()}`; + const sourceMessage = `Read state source ${pw.random.id()}`; // # Initialize the test server state, configure the recap bridge, and seed a completed recap for the user. const {adminClient, adminUser, team, user, userClient} = await pw.initSetup(); @@ -243,9 +243,9 @@ test('moves a recap from unread to read when marked read', {tag: '@ai_recaps'}, * @objective Verify deleting a recap removes it from the recaps list */ test('deletes a recap from the recaps page', {tag: '@ai_recaps'}, async ({pw}) => { - const recapTitle = `Delete recap ${await pw.random.id()}`; - const recapHighlight = `Delete recap highlight ${await pw.random.id()}`; - const sourceMessage = `Delete recap source ${await pw.random.id()}`; + const recapTitle = `Delete recap ${pw.random.id()}`; + const recapHighlight = `Delete recap highlight ${pw.random.id()}`; + const sourceMessage = `Delete recap source ${pw.random.id()}`; // # Initialize the test server state, configure the recap bridge, and seed a completed recap for the user. const {adminClient, adminUser, team, user, userClient} = await pw.initSetup(); @@ -292,10 +292,10 @@ test('deletes a recap from the recaps page', {tag: '@ai_recaps'}, async ({pw}) = * @objective Verify regenerating a recap returns it to processing and replaces the rendered summary with the latest mocked response */ test('regenerates a recap with a new mocked summary', {tag: '@ai_recaps'}, async ({pw}) => { - const recapTitle = `Regenerated recap ${await pw.random.id()}`; - const firstHighlight = `Original summary ${await pw.random.id()}`; - const secondHighlight = `Regenerated summary ${await pw.random.id()}`; - const sourceMessage = `Regenerate source ${await pw.random.id()}`; + const recapTitle = `Regenerated recap ${pw.random.id()}`; + const firstHighlight = `Original summary ${pw.random.id()}`; + const secondHighlight = `Regenerated summary ${pw.random.id()}`; + const sourceMessage = `Regenerate source ${pw.random.id()}`; // # Initialize the test server state, queue two recap completions, and seed the first completed recap. const {adminClient, adminUser, team, user, userClient} = await pw.initSetup(); @@ -353,9 +353,9 @@ test('regenerates a recap with a new mocked summary', {tag: '@ai_recaps'}, async * @objective Verify a failed recap renders the failed state and can recover after regeneration */ test('recovers a failed recap through regeneration', {tag: '@ai_recaps'}, async ({pw}) => { - const recapTitle = `Failed recap ${await pw.random.id()}`; - const recoveredHighlight = `Recovered highlight ${await pw.random.id()}`; - const sourceMessage = `Failed recap source ${await pw.random.id()}`; + const recapTitle = `Failed recap ${pw.random.id()}`; + const recoveredHighlight = `Recovered highlight ${pw.random.id()}`; + const sourceMessage = `Failed recap source ${pw.random.id()}`; // # Initialize the test server state, queue a failing completion followed by a successful completion, and seed the failed recap. const {adminClient, adminUser, team, user, userClient} = await pw.initSetup(); @@ -408,9 +408,9 @@ test('recovers a failed recap through regeneration', {tag: '@ai_recaps'}, async * @objective Verify recap channel card actions can mark a source channel as read and navigate back into that channel */ test('executes recap channel card actions', {tag: '@ai_recaps'}, async ({pw}) => { - const recapTitle = `Channel actions recap ${await pw.random.id()}`; - const recapHighlight = `Channel action highlight ${await pw.random.id()}`; - const sourceMessage = `Channel action source ${await pw.random.id()}`; + const recapTitle = `Channel actions recap ${pw.random.id()}`; + const recapHighlight = `Channel action highlight ${pw.random.id()}`; + const sourceMessage = `Channel action source ${pw.random.id()}`; // # Initialize the test server state, configure the recap bridge, and seed a completed recap with one unread channel. const {adminClient, adminUser, team, user, userClient} = await pw.initSetup(); @@ -482,13 +482,13 @@ async function setupRecapBridge( const {agent, service} = await pw.createMockAIAgent(adminClient, { agent: { - id: `recap-agent-${await pw.random.id()}`, + id: `recap-agent-${pw.random.id()}`, displayName: 'Recap Summary Agent', - username: `recap.summary.${await pw.random.id()}`, + username: `recap.summary.${pw.random.id()}`, is_default: true, }, service: { - id: `recap-service-${await pw.random.id()}`, + id: `recap-service-${pw.random.id()}`, name: 'Recap Summary Service', type: 'anthropic', }, @@ -519,7 +519,7 @@ async function createUnreadChannelFixture( const channel = await adminClient.createChannel( pw.random.channel({ teamId, - name: `recap${await pw.random.id()}`, + name: `recap${pw.random.id()}`, displayName, unique: false, }), diff --git a/e2e-tests/playwright/specs/functional/channels/anonymous_urls/anonymous_urls.spec.ts b/e2e-tests/playwright/specs/functional/channels/anonymous_urls/anonymous_urls.spec.ts index 0efe81ed908..879c00ad02c 100644 --- a/e2e-tests/playwright/specs/functional/channels/anonymous_urls/anonymous_urls.spec.ts +++ b/e2e-tests/playwright/specs/functional/channels/anonymous_urls/anonymous_urls.spec.ts @@ -383,7 +383,7 @@ test.describe('Anonymous URLs', () => { await channelsPage.goto(team.name); await channelsPage.toBeVisible(); - const channelDisplayName = `Archived Anonymous ${await pw.random.id()}`; + const channelDisplayName = `Archived Anonymous ${pw.random.id()}`; await createChannelFromUI(channelsPage, channelDisplayName); const createdChannel = await getChannelByDisplayName(adminClient, team.id, channelDisplayName); @@ -423,8 +423,8 @@ test.describe('Anonymous URLs', () => { await adminClient.addToTeam(team.id, adminUser.id); // # Create a legacy channel and team before enabling anonymous URLs - const legacyChannelSlug = `legacy-channel-${await pw.random.id()}`; - const legacyChannelDisplayName = `Legacy Channel ${await pw.random.id()}`; + const legacyChannelSlug = `legacy-channel-${pw.random.id()}`; + const legacyChannelDisplayName = `Legacy Channel ${pw.random.id()}`; const legacyChannel = await adminClient.createChannel({ team_id: team.id, name: legacyChannelSlug, @@ -432,8 +432,8 @@ test.describe('Anonymous URLs', () => { type: 'O', }); - const legacyTeamSlug = `legacy-team-${await pw.random.id()}`; - const legacyTeamDisplayName = `Legacy Team ${await pw.random.id()}`; + const legacyTeamSlug = `legacy-team-${pw.random.id()}`; + const legacyTeamDisplayName = `Legacy Team ${pw.random.id()}`; const legacyTeam = await adminClient.createTeam({ name: legacyTeamSlug, display_name: legacyTeamDisplayName, @@ -460,7 +460,7 @@ test.describe('Anonymous URLs', () => { await expect(channelsPage.page).toHaveURL(`/${team.name}/channels/${legacyChannelSlug}`); // # Create a new channel after the anonymous URL toggle - const anonymousChannelDisplayName = `Anonymous Channel ${await pw.random.id()}`; + const anonymousChannelDisplayName = `Anonymous Channel ${pw.random.id()}`; await channelsPage.goto(team.name); await channelsPage.toBeVisible(); await createChannelFromUI(channelsPage, anonymousChannelDisplayName); @@ -472,7 +472,7 @@ test.describe('Anonymous URLs', () => { await expect(channelsPage.page).toHaveURL(`/${team.name}/channels/${anonymousChannel.name}`); // # Create a new team after the anonymous URL toggle - const anonymousTeamDisplayName = `Anonymous Team ${await pw.random.id()}`; + const anonymousTeamDisplayName = `Anonymous Team ${pw.random.id()}`; await createTeamFromUI(channelsPage, anonymousTeamDisplayName); const anonymousTeam = await getTeamByDisplayName(adminClient, anonymousTeamDisplayName); @@ -504,8 +504,8 @@ test.describe('Anonymous URLs', () => { const dmChannel = await adminClient.createDirectChannel([adminUser.id, secondUser.id]); const gmChannel = await adminClient.createGroupChannel([adminUser.id, secondUser.id, thirdUser.id]); - const dmMessage = `Anonymous URL DM ${await pw.random.id()}`; - const gmMessage = `Anonymous URL GM ${await pw.random.id()}`; + const dmMessage = `Anonymous URL DM ${pw.random.id()}`; + const gmMessage = `Anonymous URL GM ${pw.random.id()}`; await adminClient.createPost({channel_id: dmChannel.id, message: dmMessage}); await adminClient.createPost({channel_id: gmChannel.id, message: gmMessage}); @@ -553,7 +553,7 @@ test.describe('Anonymous URLs', () => { await channelsPage.goto(team.name); await channelsPage.toBeVisible(); - const originalDisplayName = `Original Channel ${await pw.random.id()}`; + const originalDisplayName = `Original Channel ${pw.random.id()}`; await createChannelFromUI(channelsPage, originalDisplayName); const createdChannel = await getChannelByDisplayName(adminClient, team.id, originalDisplayName); @@ -561,7 +561,7 @@ test.describe('Anonymous URLs', () => { expectObfuscatedSlug(originalSlug); // # Rename the channel from channel settings - const renamedDisplayName = `Renamed Channel ${await pw.random.id()}`; + const renamedDisplayName = `Renamed Channel ${pw.random.id()}`; const channelSettingsModal = await channelsPage.openChannelSettings(); const infoTab = await channelSettingsModal.openInfoTab(); await infoTab.updateName(renamedDisplayName); @@ -606,7 +606,7 @@ test.describe('Anonymous URLs', () => { await channelsPage.goto(); await channelsPage.toBeVisible(); - const originalTeamDisplayName = `Original Team ${await pw.random.id()}`; + const originalTeamDisplayName = `Original Team ${pw.random.id()}`; await createTeamFromUI(channelsPage, originalTeamDisplayName); const createdTeam = await getTeamByDisplayName(adminClient, originalTeamDisplayName); @@ -614,7 +614,7 @@ test.describe('Anonymous URLs', () => { expectObfuscatedSlug(originalTeamSlug); // # Rename the team from team settings - const renamedTeamDisplayName = `Renamed Team ${await pw.random.id()}`; + const renamedTeamDisplayName = `Renamed Team ${pw.random.id()}`; const teamSettingsModal = await channelsPage.openTeamSettings(); const infoTab = await teamSettingsModal.openInfoTab(); await infoTab.updateName(renamedTeamDisplayName); @@ -662,11 +662,11 @@ test.describe('Anonymous URLs', () => { await channelsPage.goto(); await channelsPage.toBeVisible(); - const displayName = `Permalink Channel ${await pw.random.id()}`; + const displayName = `Permalink Channel ${pw.random.id()}`; const channel = await createAnonymousUrlChannel(channelsPage, adminClient, team.name, team.id, displayName); // # Publish a post that will be opened via permalink - const message = `Anonymous permalink message ${await pw.random.id()}`; + const message = `Anonymous permalink message ${pw.random.id()}`; await channelsPage.postMessage(message); const lastPost = await channelsPage.getLastPost(); @@ -708,7 +708,7 @@ test.describe('Anonymous URLs', () => { const createdChannels = []; for (let i = 1; i <= 3; i++) { - const displayName = `Search Test Channel ${i} ${await pw.random.id()}`; + const displayName = `Search Test Channel ${i} ${pw.random.id()}`; const channel = await createAnonymousUrlChannel(channelsPage, adminClient, team.name, team.id, displayName); createdChannels.push({channel, displayName}); } @@ -749,9 +749,9 @@ test.describe('Anonymous URLs', () => { await channelsPage.goto(); await channelsPage.toBeVisible(); - const displayName = `Search Channel ${await pw.random.id()}`; + const displayName = `Search Channel ${pw.random.id()}`; const channel = await createAnonymousUrlChannel(channelsPage, adminClient, team.name, team.id, displayName); - const message = `AnonymousSearchableMessage${await pw.random.id()}`; + const message = `AnonymousSearchableMessage${pw.random.id()}`; await channelsPage.postMessage(message); const lastPost = await channelsPage.getLastPost(); @@ -800,7 +800,7 @@ test.describe('Anonymous URLs', () => { const createdChannels = []; for (const template of channelTemplates) { - const displayName = `${template} ${(await pw.random.id()).slice(0, 6)}`; + const displayName = `${template} ${pw.random.id().slice(0, 6)}`; const channel = await createAnonymousUrlChannel( channelsPage, adminClient, @@ -871,7 +871,7 @@ test.describe('Anonymous URLs', () => { await channelsPage.goto(); await channelsPage.toBeVisible(); - const displayName = `Calls & Planning 🚀 ${(await pw.random.id()).slice(0, 6)}`; + const displayName = `Calls & Planning 🚀 ${pw.random.id().slice(0, 6)}`; const channel = await createAnonymousUrlChannel(channelsPage, adminClient, team.name, team.id, displayName); await adminClient.addToChannel(adminUser.id, channel.id); diff --git a/e2e-tests/playwright/specs/functional/channels/autotranslation/autotranslation.spec.ts b/e2e-tests/playwright/specs/functional/channels/autotranslation/autotranslation.spec.ts index cfc23b09d0d..033059276b1 100644 --- a/e2e-tests/playwright/specs/functional/channels/autotranslation/autotranslation.spec.ts +++ b/e2e-tests/playwright/specs/functional/channels/autotranslation/autotranslation.spec.ts @@ -12,7 +12,6 @@ import { test, setMockSourceLanguage, } from '@mattermost/playwright-lib'; -import {getRandomId} from 'utils/utils'; const POST_TYPE_AUTOTRANSLATION_CHANGE = 'system_autotranslation'; @@ -38,7 +37,7 @@ test( }); // # Create a channel and enable autotranslation on it - const channelName = `autotranslation-${await getRandomId()}`; + const channelName = `autotranslation-${pw.random.id()}`; const created = await adminClient.createChannel({ team_id: team.id, name: channelName, @@ -104,7 +103,7 @@ test( targetLanguages: ['en', 'es'], }); - const channelName = `autotranslation-admin-${await getRandomId()}`; + const channelName = `autotranslation-admin-${pw.random.id()}`; const created = await adminClient.createChannel({ team_id: team.id, name: channelName, @@ -147,7 +146,7 @@ test( targetLanguages: ['en', 'es'], }); - const channelName = `autotranslation-system-msg-${await getRandomId()}`; + const channelName = `autotranslation-system-msg-${pw.random.id()}`; const created = await adminClient.createChannel({ team_id: team.id, name: channelName, @@ -191,7 +190,7 @@ test( targetLanguages: ['en', 'es'], }); - const channelName = `autotranslation-new-only-${await getRandomId()}`; + const channelName = `autotranslation-new-only-${pw.random.id()}`; const created = await adminClient.createChannel({ team_id: team.id, name: channelName, @@ -261,7 +260,7 @@ test( targetLanguages: ['en', 'es'], }); - const channelName = `autotranslation-tooltip-${await getRandomId()}`; + const channelName = `autotranslation-tooltip-${pw.random.id()}`; const created = await adminClient.createChannel({ team_id: team.id, name: channelName, @@ -301,7 +300,7 @@ test( targetLanguages: ['en', 'es'], }); - const channelName = `autotranslation-disable-${await getRandomId()}`; + const channelName = `autotranslation-disable-${pw.random.id()}`; const created = await adminClient.createChannel({ team_id: team.id, name: channelName, @@ -371,7 +370,7 @@ test( targetLanguages: ['en', 'es'], }); - const channelName = `autotranslation-default-on-${await getRandomId()}`; + const channelName = `autotranslation-default-on-${pw.random.id()}`; const created = await adminClient.createChannel({ team_id: team.id, name: channelName, @@ -434,7 +433,7 @@ test( targetLanguages: ['en', 'es'], }); - const channelName = `autotranslation-ephemeral-${await getRandomId()}`; + const channelName = `autotranslation-ephemeral-${pw.random.id()}`; const created = await adminClient.createChannel({ team_id: team.id, name: channelName, @@ -478,7 +477,7 @@ test( targetLanguages: ['en', 'es'], }); - const channelName = `autotranslation-revert-${await getRandomId()}`; + const channelName = `autotranslation-revert-${pw.random.id()}`; const created = await adminClient.createChannel({ team_id: team.id, name: channelName, @@ -556,7 +555,7 @@ test( targetLanguages: ['en', 'es'], }); - const channelName = `autotranslation-lang-${await getRandomId()}`; + const channelName = `autotranslation-lang-${pw.random.id()}`; const created = await adminClient.createChannel({ team_id: team.id, name: channelName, @@ -659,7 +658,7 @@ test( targetLanguages: ['en', 'es'], }); - const channelName = `autotranslation-indicator-${await getRandomId()}`; + const channelName = `autotranslation-indicator-${pw.random.id()}`; const created = await adminClient.createChannel({ team_id: team.id, name: channelName, @@ -760,7 +759,7 @@ test.fixme( targetLanguages: ['en', 'es'], }); - const channelName = `autotranslation-modal-${await getRandomId()}`; + const channelName = `autotranslation-modal-${pw.random.id()}`; const created = await adminClient.createChannel({ team_id: team.id, name: channelName, @@ -854,7 +853,7 @@ test( targetLanguages: ['en', 'es'], }); - const channelName = `autotranslation-dotmenu-${await getRandomId()}`; + const channelName = `autotranslation-dotmenu-${pw.random.id()}`; const created = await adminClient.createChannel({ team_id: team.id, name: channelName, @@ -947,7 +946,7 @@ test( targetLanguages: ['en', 'es'], }); - const channelName = `autotranslation-toggle-${await getRandomId()}`; + const channelName = `autotranslation-toggle-${pw.random.id()}`; const created = await adminClient.createChannel({ team_id: team.id, name: channelName, @@ -996,7 +995,7 @@ test( targetLanguages: ['en', 'es'], }); - const translatedChannelName = `autotranslation-badge-${await getRandomId()}`; + const translatedChannelName = `autotranslation-badge-${pw.random.id()}`; const translatedChannel = await adminClient.createChannel({ team_id: team.id, name: translatedChannelName, @@ -1007,7 +1006,7 @@ test( await adminClient.addToChannel(user.id, translatedChannel.id); await setUserChannelAutotranslation(userClient, translatedChannel.id, true); - const noTranslationChannelName = `no-translation-${await getRandomId()}`; + const noTranslationChannelName = `no-translation-${pw.random.id()}`; const noTranslationChannel = await adminClient.createChannel({ team_id: team.id, name: noTranslationChannelName, @@ -1047,7 +1046,7 @@ test( targetLanguages: ['en', 'es'], }); - const channelName = `autotranslation-unsupported-${await getRandomId()}`; + const channelName = `autotranslation-unsupported-${pw.random.id()}`; const created = await adminClient.createChannel({ team_id: team.id, name: channelName, diff --git a/e2e-tests/playwright/specs/functional/channels/autotranslation/autotranslation_permissions.spec.ts b/e2e-tests/playwright/specs/functional/channels/autotranslation/autotranslation_permissions.spec.ts index bba51612651..93281f90468 100644 --- a/e2e-tests/playwright/specs/functional/channels/autotranslation/autotranslation_permissions.spec.ts +++ b/e2e-tests/playwright/specs/functional/channels/autotranslation/autotranslation_permissions.spec.ts @@ -8,7 +8,6 @@ import { test, SystemConsolePage, } from '@mattermost/playwright-lib'; -import {getRandomId} from 'utils/utils'; test( 'permission exists; Channel Administrators have Manage Channel Auto Translation ON', @@ -89,7 +88,7 @@ test.describe('autotranslation configuration tests', () => { targetLanguages: ['en', 'es'], }); - const channelName = `autotranslation-perm-${await getRandomId()}`; + const channelName = `autotranslation-perm-${pw.random.id()}`; const created = await adminClient.createChannel({ team_id: team.id, name: channelName, diff --git a/e2e-tests/playwright/specs/functional/channels/autotranslation/helpers/mock-autotranslation.ts b/e2e-tests/playwright/specs/functional/channels/autotranslation/helpers/mock-autotranslation.ts index 480b9f3037c..d9d95655100 100644 --- a/e2e-tests/playwright/specs/functional/channels/autotranslation/helpers/mock-autotranslation.ts +++ b/e2e-tests/playwright/specs/functional/channels/autotranslation/helpers/mock-autotranslation.ts @@ -1,7 +1,7 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -import type {Page} from '@playwright/test'; +import type {Disposable, Page} from '@playwright/test'; interface MockTranslateRequest { q?: string; @@ -117,8 +117,15 @@ export function resetMockSourceLanguage(): void { } /** - * Mock the autotranslation API route using Playwright's route interception - * This replaces the need for an external mock server + * Mock the autotranslation API route using Playwright's route interception. + * This replaces the need for an external mock server. + * + * Returns a `Disposable` to remove the mock routes. Use with `await using` + * for automatic cleanup or call `.dispose()` manually: + * + * ```ts + * await using mock = await mockAutotranslationRoute(page); + * ``` * * @param page - Playwright Page object * @param options - Optional configuration @@ -131,7 +138,7 @@ export async function mockAutotranslationRoute( sourceLanguage?: string; supportedLanguages?: string[]; }, -): Promise { +): Promise { // Reset mockSourceLanguage to avoid state leakage between tests mockSourceLanguage = options?.sourceLanguage || 'es'; @@ -139,7 +146,7 @@ export async function mockAutotranslationRoute( // Mock LibreTranslate API endpoint // Handles both /translate and /detect endpoints - await page.route('**/api/translate', async (route) => { + const translateRoute = await page.route('**/api/translate', async (route) => { const request = route.request(); const method = request.method(); @@ -254,7 +261,7 @@ export async function mockAutotranslationRoute( }); // Mock language detection endpoint (if used separately) - await page.route('**/api/detect', async (route) => { + const detectRoute = await page.route('**/api/detect', async (route) => { // Language detection is mocked to always return the configured source language // regardless of the input text @@ -272,13 +279,15 @@ export async function mockAutotranslationRoute( }), }); }); -} -/** - * Remove all mock routes for autotranslation - * Useful for cleaning up between tests or switching to real API - */ -export async function unmockAutotranslationRoute(page: Page): Promise { - await page.unroute('**/api/translate'); - await page.unroute('**/api/detect'); + return { + async dispose() { + await translateRoute.dispose(); + await detectRoute.dispose(); + }, + async [Symbol.asyncDispose]() { + await translateRoute.dispose(); + await detectRoute.dispose(); + }, + }; } diff --git a/e2e-tests/playwright/specs/functional/channels/burn_on_read/dm_gm_flow.spec.ts b/e2e-tests/playwright/specs/functional/channels/burn_on_read/dm_gm_flow.spec.ts index 7365213eba2..c20d407718e 100644 --- a/e2e-tests/playwright/specs/functional/channels/burn_on_read/dm_gm_flow.spec.ts +++ b/e2e-tests/playwright/specs/functional/channels/burn_on_read/dm_gm_flow.spec.ts @@ -50,7 +50,7 @@ test.describe('Burn-on-Read in DMs and GMs', () => { // # Enable BoR and send message await senderPage.centerView.postCreate.toggleBurnOnRead(); - const secretMessage = `DM secret ${await pw.random.id()}`; + const secretMessage = `DM secret ${pw.random.id()}`; await senderPage.postMessage(secretMessage); // # Get sender's view of the post @@ -128,7 +128,7 @@ test.describe('Burn-on-Read in DMs and GMs', () => { // # Enable BoR and send message await senderPage.centerView.postCreate.toggleBurnOnRead(); - const secretMessage = `GM secret ${await pw.random.id()}`; + const secretMessage = `GM secret ${pw.random.id()}`; await senderPage.postMessage(secretMessage); // # Get sender's view @@ -195,7 +195,7 @@ test.describe('Burn-on-Read in DMs and GMs', () => { // # Enable BoR and send message await senderPage.centerView.postCreate.toggleBurnOnRead(); - const secretMessage = `To be deleted ${await pw.random.id()}`; + const secretMessage = `To be deleted ${pw.random.id()}`; await senderPage.postMessage(secretMessage); // # Get the post ID @@ -247,7 +247,7 @@ test.describe('Burn-on-Read in DMs and GMs', () => { // # Enable BoR and send message await senderPage.centerView.postCreate.toggleBurnOnRead(); - const secretMessage = `Receiver will burn ${await pw.random.id()}`; + const secretMessage = `Receiver will burn ${pw.random.id()}`; await senderPage.postMessage(secretMessage); // # Login as receiver @@ -302,7 +302,7 @@ test.describe('Burn-on-Read in DMs and GMs', () => { // # Enable BoR and send message await senderPage.centerView.postCreate.toggleBurnOnRead(); - const secretMessage = `Count test ${await pw.random.id()}`; + const secretMessage = `Count test ${pw.random.id()}`; await senderPage.postMessage(secretMessage); // # Get sender's view @@ -332,12 +332,12 @@ test.describe('Burn-on-Read in DMs and GMs', () => { // # Send first BoR message await senderPage.centerView.postCreate.toggleBurnOnRead(); - const message1 = `First BoR ${await pw.random.id()}`; + const message1 = `First BoR ${pw.random.id()}`; await senderPage.postMessage(message1); // # Send second BoR message (toggle again to ensure BoR is on) await senderPage.centerView.postCreate.toggleBurnOnRead(); - const message2 = `Second BoR ${await pw.random.id()}`; + const message2 = `Second BoR ${pw.random.id()}`; await senderPage.postMessage(message2); // # Login as receiver and verify they can see concealed messages @@ -395,7 +395,7 @@ test.describe('Burn-on-Read in DMs and GMs', () => { expect(isEnabledBefore).toBe(true); // # Send a message - const message1 = `BoR message ${await pw.random.id()}`; + const message1 = `BoR message ${pw.random.id()}`; await senderPage.postMessage(message1); // * Verify BoR is disabled after sending (toggle resets) diff --git a/e2e-tests/playwright/specs/functional/channels/burn_on_read/receiver_flow.spec.ts b/e2e-tests/playwright/specs/functional/channels/burn_on_read/receiver_flow.spec.ts index 4540792655c..bedc24262ce 100644 --- a/e2e-tests/playwright/specs/functional/channels/burn_on_read/receiver_flow.spec.ts +++ b/e2e-tests/playwright/specs/functional/channels/burn_on_read/receiver_flow.spec.ts @@ -23,7 +23,7 @@ test.describe('Burn-on-Read Receiver Flow', () => { // # Post BoR message await senderPage.centerView.postCreate.toggleBurnOnRead(); - const secretMessage = `Secret message ${await pw.random.id()}`; + const secretMessage = `Secret message ${pw.random.id()}`; await senderPage.postMessage(secretMessage); // # Login as receiver in new context @@ -72,7 +72,7 @@ test.describe('Burn-on-Read Receiver Flow', () => { await senderPage.goto(team.name, `@${receiver.username}`); await senderPage.toBeVisible(); await senderPage.centerView.postCreate.toggleBurnOnRead(); - const message = `To be burned ${await pw.random.id()}`; + const message = `To be burned ${pw.random.id()}`; await senderPage.postMessage(message); // # Login as receiver @@ -126,7 +126,7 @@ test.describe('Burn-on-Read Receiver Flow', () => { await senderPage.toBeVisible(); await senderPage.centerView.postCreate.toggleBurnOnRead(); - const message = `Test message ${await pw.random.id()}`; + const message = `Test message ${pw.random.id()}`; await senderPage.postMessage(message); // # Login as receiver @@ -180,7 +180,7 @@ test.describe('Burn-on-Read Receiver Flow', () => { await senderPage.goto(team.name, `@${receiver.username}`); await senderPage.toBeVisible(); await senderPage.centerView.postCreate.toggleBurnOnRead(); - const message = `Timer test ${await pw.random.id()}`; + const message = `Timer test ${pw.random.id()}`; await senderPage.postMessage(message); // # Login as receiver @@ -241,7 +241,7 @@ test.describe('Burn-on-Read Receiver Flow', () => { await senderPage.goto(team.name, `@${receiver.username}`); await senderPage.toBeVisible(); await senderPage.centerView.postCreate.toggleBurnOnRead(); - const message = `Auto-delete test ${await pw.random.id()}`; + const message = `Auto-delete test ${pw.random.id()}`; await senderPage.postMessage(message); // # Login as receiver @@ -295,7 +295,7 @@ test.describe('Burn-on-Read Receiver Flow', () => { await senderPage.toBeVisible(); await senderPage.goto(team.name, `@${receiver.username}`); await senderPage.centerView.postCreate.toggleBurnOnRead(); - const message = `Badge test ${await pw.random.id()}`; + const message = `Badge test ${pw.random.id()}`; await senderPage.postMessage(message); // # Login as receiver diff --git a/e2e-tests/playwright/specs/functional/channels/burn_on_read/restrictions.spec.ts b/e2e-tests/playwright/specs/functional/channels/burn_on_read/restrictions.spec.ts index c928dd7ca3a..91e3aacb887 100644 --- a/e2e-tests/playwright/specs/functional/channels/burn_on_read/restrictions.spec.ts +++ b/e2e-tests/playwright/specs/functional/channels/burn_on_read/restrictions.spec.ts @@ -15,7 +15,7 @@ test.describe('Burn-on-Read Restrictions', () => { await senderPage.goto(team.name, `@${receiver.username}`); await senderPage.toBeVisible(); await senderPage.centerView.postCreate.toggleBurnOnRead(); - await senderPage.postMessage(`No reply test ${await pw.random.id()}`); + await senderPage.postMessage(`No reply test ${pw.random.id()}`); const {channelsPage: receiverPage} = await pw.testBrowser.login(receiver); await receiverPage.goto(team.name, `@${sender.username}`); @@ -44,7 +44,7 @@ test.describe('Burn-on-Read Restrictions', () => { await senderPage.goto(team.name, `@${receiver.username}`); await senderPage.toBeVisible(); await senderPage.centerView.postCreate.toggleBurnOnRead(); - await senderPage.postMessage(`No pin test ${await pw.random.id()}`); + await senderPage.postMessage(`No pin test ${pw.random.id()}`); const {channelsPage: receiverPage} = await pw.testBrowser.login(receiver); await receiverPage.goto(team.name, `@${sender.username}`); @@ -72,7 +72,7 @@ test.describe('Burn-on-Read Restrictions', () => { await senderPage.goto(team.name, `@${receiver.username}`); await senderPage.toBeVisible(); await senderPage.centerView.postCreate.toggleBurnOnRead(); - await senderPage.postMessage(`No edit test ${await pw.random.id()}`); + await senderPage.postMessage(`No edit test ${pw.random.id()}`); const borPost = await senderPage.getLastPost(); @@ -94,7 +94,7 @@ test.describe('Burn-on-Read Restrictions', () => { await senderPage.goto(team.name, `@${receiver.username}`); await senderPage.toBeVisible(); await senderPage.centerView.postCreate.toggleBurnOnRead(); - await senderPage.postMessage(`No forward test ${await pw.random.id()}`); + await senderPage.postMessage(`No forward test ${pw.random.id()}`); const {channelsPage: receiverPage} = await pw.testBrowser.login(receiver); await receiverPage.goto(team.name, `@${sender.username}`); @@ -122,7 +122,7 @@ test.describe('Burn-on-Read Restrictions', () => { await senderPage.goto(team.name, `@${receiver.username}`); await senderPage.toBeVisible(); await senderPage.centerView.postCreate.toggleBurnOnRead(); - await senderPage.postMessage(`No copy test ${await pw.random.id()}`); + await senderPage.postMessage(`No copy test ${pw.random.id()}`); const {channelsPage: receiverPage} = await pw.testBrowser.login(receiver); await receiverPage.goto(team.name, `@${sender.username}`); @@ -150,7 +150,7 @@ test.describe('Burn-on-Read Restrictions', () => { await senderPage.goto(team.name, `@${receiver.username}`); await senderPage.toBeVisible(); await senderPage.centerView.postCreate.toggleBurnOnRead(); - await senderPage.postMessage(`No copy link test ${await pw.random.id()}`); + await senderPage.postMessage(`No copy link test ${pw.random.id()}`); const {channelsPage: receiverPage} = await pw.testBrowser.login(receiver); await receiverPage.goto(team.name, `@${sender.username}`); @@ -178,7 +178,7 @@ test.describe('Burn-on-Read Restrictions', () => { await senderPage.goto(team.name, `@${receiver.username}`); await senderPage.toBeVisible(); await senderPage.centerView.postCreate.toggleBurnOnRead(); - await senderPage.postMessage(`Sender copy link test ${await pw.random.id()}`); + await senderPage.postMessage(`Sender copy link test ${pw.random.id()}`); const borPost = await senderPage.getLastPost(); @@ -200,7 +200,7 @@ test.describe('Burn-on-Read Restrictions', () => { await senderPage.goto(team.name, `@${receiver.username}`); await senderPage.toBeVisible(); await senderPage.centerView.postCreate.toggleBurnOnRead(); - await senderPage.postMessage(`No follow test ${await pw.random.id()}`); + await senderPage.postMessage(`No follow test ${pw.random.id()}`); const {channelsPage: receiverPage} = await pw.testBrowser.login(receiver); await receiverPage.goto(team.name, `@${sender.username}`); @@ -228,7 +228,7 @@ test.describe('Burn-on-Read Restrictions', () => { await senderPage.goto(team.name, `@${receiver.username}`); await senderPage.toBeVisible(); await senderPage.centerView.postCreate.toggleBurnOnRead(); - const message = `Keyboard test ${await pw.random.id()}`; + const message = `Keyboard test ${pw.random.id()}`; await senderPage.postMessage(message); const {channelsPage: receiverPage} = await pw.testBrowser.login(receiver); @@ -260,7 +260,7 @@ test.describe('Burn-on-Read Restrictions', () => { await senderPage.goto(team.name, `@${receiver.username}`); await senderPage.toBeVisible(); await senderPage.centerView.postCreate.toggleBurnOnRead(); - await senderPage.postMessage(`Delete test ${await pw.random.id()}`); + await senderPage.postMessage(`Delete test ${pw.random.id()}`); const {channelsPage: receiverPage} = await pw.testBrowser.login(receiver); await receiverPage.goto(team.name, `@${sender.username}`); diff --git a/e2e-tests/playwright/specs/functional/channels/channel_banner/channel_banner.spec.ts b/e2e-tests/playwright/specs/functional/channels/channel_banner/channel_banner.spec.ts index d8d47ab3f59..f96719842a1 100644 --- a/e2e-tests/playwright/specs/functional/channels/channel_banner/channel_banner.spec.ts +++ b/e2e-tests/playwright/specs/functional/channels/channel_banner/channel_banner.spec.ts @@ -2,7 +2,6 @@ // See LICENSE.txt for license information. import {test} from '@mattermost/playwright-lib'; -import {getRandomId} from 'utils/utils'; test('Should show channel banner when configured', async ({pw}) => { const {adminUser, adminClient} = await pw.initSetup(); @@ -13,7 +12,7 @@ test('Should show channel banner when configured', async ({pw}) => { await channelsPage.goto(); await channelsPage.toBeVisible(); - await channelsPage.newChannel(await getRandomId(), 'O'); + await channelsPage.newChannel(pw.random.id(), 'O'); let channelSettingsModal = await channelsPage.openChannelSettings(); let configurationTab = await channelSettingsModal.openConfigurationTab(); @@ -58,7 +57,7 @@ test('Should render markdown', async ({pw}) => { await channelsPage.goto(); await channelsPage.toBeVisible(); - await channelsPage.newChannel(await getRandomId(), 'O'); + await channelsPage.newChannel(pw.random.id(), 'O'); const channelSettingsModal = await channelsPage.openChannelSettings(); const configurationTab = await channelSettingsModal.openConfigurationTab(); diff --git a/e2e-tests/playwright/specs/functional/channels/search/search_popout.spec.ts b/e2e-tests/playwright/specs/functional/channels/search/search_popout.spec.ts index 2c1bbc0f8bb..9a03b5ea8ab 100644 --- a/e2e-tests/playwright/specs/functional/channels/search/search_popout.spec.ts +++ b/e2e-tests/playwright/specs/functional/channels/search/search_popout.spec.ts @@ -15,7 +15,7 @@ test('MM-65630-1 Search results should show popout button that opens results in ); await adminClient.addToChannel(user.id, channel.id); - const uniqueText = `popout-search-test-${await pw.random.id()}`; + const uniqueText = `popout-search-test-${pw.random.id()}`; await adminClient.createPost({ channel_id: channel.id, message: uniqueText, @@ -64,7 +64,7 @@ test('MM-65630-2 Recent mentions popout should open with the right results', asy ); await adminClient.addToChannel(user.id, channel.id); - const mentionText = `hey @${user.username} check this mention-${await pw.random.id()}`; + const mentionText = `hey @${user.username} check this mention-${pw.random.id()}`; await adminClient.createPost({ channel_id: channel.id, message: mentionText, @@ -111,7 +111,7 @@ test('MM-65630-3 Saved messages popout should open with the right results', asyn ); await adminClient.addToChannel(user.id, channel.id); - const savedText = `saved-message-test-${await pw.random.id()}`; + const savedText = `saved-message-test-${pw.random.id()}`; const post = await adminClient.createPost({ channel_id: channel.id, message: savedText, @@ -167,7 +167,7 @@ test('MM-65630-4 Search popout should not show popout button in the popout windo ); await adminClient.addToChannel(user.id, channel.id); - const uniqueText = `no-button-test-${await pw.random.id()}`; + const uniqueText = `no-button-test-${pw.random.id()}`; await adminClient.createPost({ channel_id: channel.id, message: uniqueText, diff --git a/e2e-tests/playwright/specs/functional/channels/settings/notifications/highlight_without_notification.spec.ts b/e2e-tests/playwright/specs/functional/channels/settings/notifications/highlight_without_notification.spec.ts index 5368af1a4fd..c4814327924 100644 --- a/e2e-tests/playwright/specs/functional/channels/settings/notifications/highlight_without_notification.spec.ts +++ b/e2e-tests/playwright/specs/functional/channels/settings/notifications/highlight_without_notification.spec.ts @@ -7,12 +7,7 @@ let keywords: string[]; const highlightWithoutNotificationClass = 'non-notification-highlight'; test.beforeEach(async ({pw}) => { - keywords = [ - `AB${await pw.random.id()}`, - `CD${await pw.random.id()}`, - `EF${await pw.random.id()}`, - `Highlight me ${await pw.random.id()}`, - ]; + keywords = [`AB${pw.random.id()}`, `CD${pw.random.id()}`, `EF${pw.random.id()}`, `Highlight me ${pw.random.id()}`]; }); test('MM-T5465-1 Should add the keyword when enter, comma or tab is pressed on the textbox', async ({pw}) => { diff --git a/e2e-tests/playwright/specs/functional/channels/team_settings/invite_people_autocomplete.spec.ts b/e2e-tests/playwright/specs/functional/channels/team_settings/invite_people_autocomplete.spec.ts index 0a529f70db5..12129a4fccb 100644 --- a/e2e-tests/playwright/specs/functional/channels/team_settings/invite_people_autocomplete.spec.ts +++ b/e2e-tests/playwright/specs/functional/channels/team_settings/invite_people_autocomplete.spec.ts @@ -7,7 +7,7 @@ test('MM-66937 Invite modal results match the current input state', async ({pw}) const {adminUser, adminClient, team} = await pw.initSetup(); // # Create two users not on the team whose usernames share a prefix but differ at the end - const randomPrefix = await pw.random.id(8); + const randomPrefix = pw.random.id(8); const user1 = await adminClient.createUser(await pw.random.user(randomPrefix + 'a'), '', ''); const user2 = await adminClient.createUser(await pw.random.user(randomPrefix + 'b'), '', ''); @@ -63,7 +63,7 @@ test('MM-66937 Invite modal results match the current input state when typing in const {adminUser, adminClient, team} = await pw.initSetup(); // # Create a users with a Korean name (plus a prefix to avoid interfering test runs) - const randomPrefix = await pw.random.id(8); + const randomPrefix = pw.random.id(8); const user = await adminClient.createUser( { ...(await pw.random.user(randomPrefix + 'a')), diff --git a/e2e-tests/playwright/specs/functional/channels/team_settings/invite_user_to_closed_team.spec.ts b/e2e-tests/playwright/specs/functional/channels/team_settings/invite_user_to_closed_team.spec.ts index c599b8c1f76..f5c35b527e1 100644 --- a/e2e-tests/playwright/specs/functional/channels/team_settings/invite_user_to_closed_team.spec.ts +++ b/e2e-tests/playwright/specs/functional/channels/team_settings/invite_user_to_closed_team.spec.ts @@ -64,7 +64,7 @@ test('MM-T388 Invite new user to closed team with email domain restriction', {ta await membersInvitedModal.clickInviteMore(); // # Invite a user with an invalid email domain (not sample.mattermost.com) - const invalidEmail = `user.${await pw.random.id()}@invalid.com`; + const invalidEmail = `user.${pw.random.id()}@invalid.com`; await inviteModal.inviteByEmail(invalidEmail); // * Verify that the invite failed with the correct domain restriction error diff --git a/e2e-tests/playwright/specs/functional/channels/team_settings/team_settings_modal.spec.ts b/e2e-tests/playwright/specs/functional/channels/team_settings/team_settings_modal.spec.ts index 75360f21144..270812f6807 100644 --- a/e2e-tests/playwright/specs/functional/channels/team_settings/team_settings_modal.spec.ts +++ b/e2e-tests/playwright/specs/functional/channels/team_settings/team_settings_modal.spec.ts @@ -62,7 +62,7 @@ test.describe('Team Settings Modal - Complete Test Suite', () => { await expect(teamSettings.infoSettings.nameInput).toHaveValue(team.display_name); // # Edit team name - const newTeamName = `Updated Team ${await pw.random.id()}`; + const newTeamName = `Updated Team ${pw.random.id()}`; await teamSettings.infoSettings.updateName(newTeamName); // # Save changes @@ -100,7 +100,7 @@ test.describe('Team Settings Modal - Complete Test Suite', () => { const teamSettings = await channelsPage.openTeamSettings(); // # Edit team description - const newDescription = `Test description ${await pw.random.id()}`; + const newDescription = `Test description ${pw.random.id()}`; await teamSettings.infoSettings.updateDescription(newDescription); // # Save changes @@ -138,7 +138,7 @@ test.describe('Team Settings Modal - Complete Test Suite', () => { const teamSettings = await channelsPage.openTeamSettings(); // # Edit team name to create unsaved changes - const newTeamName = `Modified Team ${await pw.random.id()}`; + const newTeamName = `Modified Team ${pw.random.id()}`; await teamSettings.infoSettings.updateName(newTeamName); // # Try to close modal (first attempt) @@ -181,7 +181,7 @@ test.describe('Team Settings Modal - Complete Test Suite', () => { await expect(teamSettings.accessTab).toBeVisible(); // # Edit team name in Info tab (create unsaved changes) - const newTeamName = `Modified Team ${await pw.random.id()}`; + const newTeamName = `Modified Team ${pw.random.id()}`; await teamSettings.infoSettings.updateName(newTeamName); // # Try to switch to Access tab @@ -219,7 +219,7 @@ test.describe('Team Settings Modal - Complete Test Suite', () => { const teamSettings = await channelsPage.openTeamSettings(); // # Edit team name - const newTeamName = `Updated Team ${await pw.random.id()}`; + const newTeamName = `Updated Team ${pw.random.id()}`; await teamSettings.infoSettings.updateName(newTeamName); // # Save changes @@ -257,7 +257,7 @@ test.describe('Team Settings Modal - Complete Test Suite', () => { const teamSettings = await channelsPage.openTeamSettings(); // # Edit team name - const newTeamName = `Modified Team ${await pw.random.id()}`; + const newTeamName = `Modified Team ${pw.random.id()}`; await teamSettings.infoSettings.updateName(newTeamName); // * Verify input shows new value diff --git a/e2e-tests/playwright/specs/functional/system_console/abac/ldap/ldap_sync.spec.ts b/e2e-tests/playwright/specs/functional/system_console/abac/ldap/ldap_sync.spec.ts index adb433faa97..2daa00d7bd1 100644 --- a/e2e-tests/playwright/specs/functional/system_console/abac/ldap/ldap_sync.spec.ts +++ b/e2e-tests/playwright/specs/functional/system_console/abac/ldap/ldap_sync.spec.ts @@ -61,7 +61,7 @@ test.describe('ABAC LDAP Integration - Sync', () => { await navigateToABACPage(systemConsolePage.page); await enableABAC(systemConsolePage.page); - const policy1Name = `LDAP AutoAdd Single ${await pw.random.id()}`; + const policy1Name = `LDAP AutoAdd Single ${pw.random.id()}`; await createBasicPolicy(systemConsolePage.page, { name: policy1Name, attribute: 'Department', @@ -134,7 +134,7 @@ test.describe('ABAC LDAP Integration - Sync', () => { await navigateToABACPage(systemConsolePage.page); // Create policy with contains operator: Department contains "Eng" - const policy2Name = `LDAP AutoAdd Contains ${await pw.random.id()}`; + const policy2Name = `LDAP AutoAdd Contains ${pw.random.id()}`; await createAdvancedPolicy(systemConsolePage.page, { name: policy2Name, celExpression: 'user.attributes.Department.contains("Eng")', @@ -240,7 +240,7 @@ test.describe('ABAC LDAP Integration - Sync', () => { await navigateToABACPage(systemConsolePage.page); await enableABAC(systemConsolePage.page); - const policy1Name = `LDAP Sync Equals ${await pw.random.id()}`; + const policy1Name = `LDAP Sync Equals ${pw.random.id()}`; await createBasicPolicy(systemConsolePage.page, { name: policy1Name, attribute: 'Department', @@ -311,7 +311,7 @@ test.describe('ABAC LDAP Integration - Sync', () => { await navigateToABACPage(systemConsolePage.page); // Create policy with 'in' operator (user.attributes.Department in ["Engineering", "Product"]) - const policy2Name = `LDAP Sync In ${await pw.random.id()}`; + const policy2Name = `LDAP Sync In ${pw.random.id()}`; await createAdvancedPolicy(systemConsolePage.page, { name: policy2Name, celExpression: 'user.attributes.Department in ["Engineering", "Product"]', @@ -416,7 +416,7 @@ test.describe('ABAC LDAP Integration - Sync', () => { await navigateToABACPage(systemConsolePage.page); await enableABAC(systemConsolePage.page); - const policy1Name = `LDAP Remove StartsWith ${await pw.random.id()}`; + const policy1Name = `LDAP Remove StartsWith ${pw.random.id()}`; await createAdvancedPolicy(systemConsolePage.page, { name: policy1Name, celExpression: 'user.attributes.Department.startsWith("Eng")', @@ -484,7 +484,7 @@ test.describe('ABAC LDAP Integration - Sync', () => { // Create policy with TWO attributes: Department == "Engineering" // Note: Using single attribute with == since we can't reliably set multiple different attribute types - const policy2Name = `LDAP Remove TwoAttr ${await pw.random.id()}`; + const policy2Name = `LDAP Remove TwoAttr ${pw.random.id()}`; await createBasicPolicy(systemConsolePage.page, { name: policy2Name, attribute: 'Department', @@ -571,7 +571,7 @@ test.describe('ABAC LDAP Integration - Sync', () => { await navigateToABACPage(systemConsolePage.page); await enableABAC(systemConsolePage.page); - const policyName = `Dynamic Policy ${await pw.random.id()}`; + const policyName = `Dynamic Policy ${pw.random.id()}`; await createBasicPolicy(systemConsolePage.page, { name: policyName, attribute: 'Department', diff --git a/e2e-tests/playwright/specs/functional/system_console/abac/policies/advanced_policies.spec.ts b/e2e-tests/playwright/specs/functional/system_console/abac/policies/advanced_policies.spec.ts index 645c7ad5659..4640d15028e 100644 --- a/e2e-tests/playwright/specs/functional/system_console/abac/policies/advanced_policies.spec.ts +++ b/e2e-tests/playwright/specs/functional/system_console/abac/policies/advanced_policies.spec.ts @@ -117,7 +117,7 @@ test.describe('ABAC Policies - Advanced Policies', () => { await enableABAC(systemConsolePage.page); // Create policy with just Department (Text) first to verify users have attributes - const policyName = `Multi-Attr Policy ${await pw.random.id()}`; + const policyName = `Multi-Attr Policy ${pw.random.id()}`; // Start with just Text attribute to debug // User 1 and 2 have Department=Engineering, User 3 has Department=Sales @@ -292,7 +292,7 @@ test.describe('ABAC Policies - Advanced Policies', () => { const channel1 = await createPrivateChannelForABAC(adminClient, team.id); await adminClient.addToChannel(salesUser.id, channel1.id); // Sales user in channel initially - const policy1Name = `IsNot Policy ${await pw.random.id()}`; + const policy1Name = `IsNot Policy ${pw.random.id()}`; await createAdvancedPolicy(systemConsolePage.page, { name: policy1Name, celExpression: 'user.attributes.Department != "Sales"', @@ -345,7 +345,7 @@ test.describe('ABAC Policies - Advanced Policies', () => { const channel2 = await createPrivateChannelForABAC(adminClient, team.id); await adminClient.addToChannel(salesUser.id, channel2.id); // Sales user in channel initially - const policy2Name = `In Policy ${await pw.random.id()}`; + const policy2Name = `In Policy ${pw.random.id()}`; await createAdvancedPolicy(systemConsolePage.page, { name: policy2Name, celExpression: 'user.attributes.Department in ["Engineering", "DevOps"]', @@ -396,7 +396,7 @@ test.describe('ABAC Policies - Advanced Policies', () => { const channel3 = await createPrivateChannelForABAC(adminClient, team.id); await adminClient.addToChannel(salesUser.id, channel3.id); - const policy3Name = `StartsWith Policy ${await pw.random.id()}`; + const policy3Name = `StartsWith Policy ${pw.random.id()}`; await createAdvancedPolicy(systemConsolePage.page, { name: policy3Name, celExpression: 'user.attributes.Department.startsWith("Eng")', @@ -447,7 +447,7 @@ test.describe('ABAC Policies - Advanced Policies', () => { const channel4 = await createPrivateChannelForABAC(adminClient, team.id); await adminClient.addToChannel(salesUser.id, channel4.id); - const policy4Name = `EndsWith Policy ${await pw.random.id()}`; + const policy4Name = `EndsWith Policy ${pw.random.id()}`; await createAdvancedPolicy(systemConsolePage.page, { name: policy4Name, celExpression: 'user.attributes.Department.endsWith("ing")', @@ -498,7 +498,7 @@ test.describe('ABAC Policies - Advanced Policies', () => { const channel5 = await createPrivateChannelForABAC(adminClient, team.id); await adminClient.addToChannel(salesUser.id, channel5.id); - const policy5Name = `Contains Policy ${await pw.random.id()}`; + const policy5Name = `Contains Policy ${pw.random.id()}`; await createAdvancedPolicy(systemConsolePage.page, { name: policy5Name, celExpression: 'user.attributes.Department.contains("gineer")', @@ -632,7 +632,7 @@ test.describe('ABAC Policies - Advanced Policies', () => { // # Create policy with complex CEL expression using || and () // Expression: Department == "Engineering" OR (Department == "Sales" AND Location == "Remote") - const policyName = `Complex Policy ${await pw.random.id()}`; + const policyName = `Complex Policy ${pw.random.id()}`; const complexExpression = 'user.attributes.Department == "Engineering" || (user.attributes.Department == "Sales" && user.attributes.Location == "Remote")'; diff --git a/e2e-tests/playwright/specs/functional/system_console/abac/policies/channel_integration.spec.ts b/e2e-tests/playwright/specs/functional/system_console/abac/policies/channel_integration.spec.ts index f17e1302526..a6030159fe7 100644 --- a/e2e-tests/playwright/specs/functional/system_console/abac/policies/channel_integration.spec.ts +++ b/e2e-tests/playwright/specs/functional/system_console/abac/policies/channel_integration.spec.ts @@ -68,7 +68,7 @@ test.describe('ABAC Policies - Channel Integration', () => { await enableABAC(systemConsolePage.page); // Create policy without channels (we'll link via Channel Config) - const policyName = `Channel Config Policy ${await pw.random.id()}`; + const policyName = `Channel Config Policy ${pw.random.id()}`; await createBasicPolicy(systemConsolePage.page, { name: policyName, attribute: 'Department', @@ -224,7 +224,7 @@ test.describe('ABAC Policies - Channel Integration', () => { await navigateToABACPage(page); await enableABAC(page); - const policyName = `ABAC-GroupSync-Test-${await pw.random.id()}`; + const policyName = `ABAC-GroupSync-Test-${pw.random.id()}`; await createBasicPolicy(page, { name: policyName, attribute: 'Department', @@ -239,7 +239,7 @@ test.describe('ABAC Policies - Channel Integration', () => { // This works without LDAP configuration // =========================================== - const groupSyncChannelName = `ABAC-GroupSync-${await pw.random.id()}`; + const groupSyncChannelName = `ABAC-GroupSync-${pw.random.id()}`; const groupSyncChannel = await adminClient.createChannel({ team_id: team.id, name: groupSyncChannelName.toLowerCase().replace(/[^a-z0-9]/g, ''), diff --git a/e2e-tests/playwright/specs/functional/system_console/abac/policies/create_policies.spec.ts b/e2e-tests/playwright/specs/functional/system_console/abac/policies/create_policies.spec.ts index 174fa62c9a9..0d54a6154a9 100644 --- a/e2e-tests/playwright/specs/functional/system_console/abac/policies/create_policies.spec.ts +++ b/e2e-tests/playwright/specs/functional/system_console/abac/policies/create_policies.spec.ts @@ -101,7 +101,7 @@ test.describe('ABAC Policies - Create Policies', () => { await enableABAC(systemConsolePage.page); // Use the working createBasicPolicy helper (same as MM-T5784) - const policyName = `Engineering Policy ${await pw.random.id()}`; + const policyName = `Engineering Policy ${pw.random.id()}`; await createBasicPolicy(systemConsolePage.page, { name: policyName, attribute: 'Department', @@ -279,7 +279,7 @@ test.describe('ABAC Policies - Create Policies', () => { await enableABAC(systemConsolePage.page); // Use createBasicPolicy with autoSync: true - const policyName = `Auto-Add Policy ${await pw.random.id()}`; + const policyName = `Auto-Add Policy ${pw.random.id()}`; await createBasicPolicy(systemConsolePage.page, { name: policyName, attribute: 'Department', @@ -388,7 +388,7 @@ test.describe('ABAC Policies - Create Policies', () => { await enableABAC(page); // Create the first policy - const policyName = `Duplicate Test ${await pw.random.id()}`; + const policyName = `Duplicate Test ${pw.random.id()}`; await createBasicPolicy(page, { name: policyName, attribute: 'Department', diff --git a/e2e-tests/playwright/specs/functional/system_console/abac/policy_management/delete_policies.spec.ts b/e2e-tests/playwright/specs/functional/system_console/abac/policy_management/delete_policies.spec.ts index d173b70452c..a06b099aa9b 100644 --- a/e2e-tests/playwright/specs/functional/system_console/abac/policy_management/delete_policies.spec.ts +++ b/e2e-tests/playwright/specs/functional/system_console/abac/policy_management/delete_policies.spec.ts @@ -52,7 +52,7 @@ test.describe('ABAC Policy Management - Delete Policies', () => { // 1. policyWithChannel - has a channel assigned // 2. policyWithoutChannel - has NO channels assigned // =========================================== - const uniqueId = await pw.random.id(); + const uniqueId = pw.random.id(); const policyWithChannelName = `ABAC-WithChannel-${uniqueId}`; const policyWithoutChannelName = `ABAC-NoChannel-${uniqueId}`; diff --git a/e2e-tests/playwright/specs/functional/system_console/abac/policy_management/edit_policies.spec.ts b/e2e-tests/playwright/specs/functional/system_console/abac/policy_management/edit_policies.spec.ts index 0f5cefa7be3..9205112f481 100644 --- a/e2e-tests/playwright/specs/functional/system_console/abac/policy_management/edit_policies.spec.ts +++ b/e2e-tests/playwright/specs/functional/system_console/abac/policy_management/edit_policies.spec.ts @@ -67,7 +67,7 @@ test.describe('ABAC Policy Management - Edit Policies', () => { await adminClient.addToTeam(team.id, salesUser.id); // Create channel - use direct API call for more control - const channelName = `abac-edit-test-${await pw.random.id()}`; + const channelName = `abac-edit-test-${pw.random.id()}`; const privateChannel = await adminClient.createChannel({ team_id: team.id, @@ -106,7 +106,7 @@ test.describe('ABAC Policy Management - Edit Policies', () => { // =========================================== // SETUP: Create policy with ORIGINAL value (Engineering), Auto-add OFF // =========================================== - const policyName = `ABAC-Edit-Test-${await pw.random.id()}`; + const policyName = `ABAC-Edit-Test-${pw.random.id()}`; await createBasicPolicy(page, { name: policyName, @@ -392,7 +392,7 @@ test.describe('ABAC Policy Management - Edit Policies', () => { // PRECONDITION: Create ORIGINAL policy with ONE attribute (Department=Engineering) // Auto-add ON so users are auto-added // =========================================== - const policyName = `ABAC-AddAttr-Test-${await pw.random.id()}`; + const policyName = `ABAC-AddAttr-Test-${pw.random.id()}`; await createBasicPolicy(page, { name: policyName, @@ -652,7 +652,7 @@ test.describe('ABAC Policy Management - Edit Policies', () => { // Department=Engineering AND Office=Remote // Auto-add ON // =========================================== - const policyName = `ABAC-RemoveRule-${await pw.random.id()}`; + const policyName = `ABAC-RemoveRule-${pw.random.id()}`; // Use advanced mode for multi-attribute policy await createAdvancedPolicy(page, { @@ -837,7 +837,7 @@ test.describe('ABAC Policy Management - Edit Policies', () => { await enableABAC(page); // Create two policies with different names - const policyName1 = `Edit Dup Test A ${await pw.random.id()}`; + const policyName1 = `Edit Dup Test A ${pw.random.id()}`; await createBasicPolicy(page, { name: policyName1, attribute: 'Department', @@ -850,7 +850,7 @@ test.describe('ABAC Policy Management - Edit Policies', () => { await navigateToABACPage(page); const privateChannel2 = await createPrivateChannelForABAC(adminClient, team.id); - const policyName2 = `Edit Dup Test B ${await pw.random.id()}`; + const policyName2 = `Edit Dup Test B ${pw.random.id()}`; await createBasicPolicy(page, { name: policyName2, attribute: 'Department', diff --git a/e2e-tests/playwright/specs/functional/system_console/abac/user_attributes/attribute_changes.spec.ts b/e2e-tests/playwright/specs/functional/system_console/abac/user_attributes/attribute_changes.spec.ts index 711dc35e8d5..6f0130073c9 100644 --- a/e2e-tests/playwright/specs/functional/system_console/abac/user_attributes/attribute_changes.spec.ts +++ b/e2e-tests/playwright/specs/functional/system_console/abac/user_attributes/attribute_changes.spec.ts @@ -71,7 +71,7 @@ test.describe('ABAC User Attributes - Attribute Changes', () => { await navigateToABACPage(systemConsolePage.page); await enableABAC(systemConsolePage.page); - const policyName = `Engineering Access ${await pw.random.id()}`; + const policyName = `Engineering Access ${pw.random.id()}`; await createBasicPolicy(systemConsolePage.page, { name: policyName, attribute: 'Department', @@ -219,7 +219,7 @@ test.describe('ABAC User Attributes - Attribute Changes', () => { await navigateToABACPage(systemConsolePage.page); await enableABAC(systemConsolePage.page); - const policyName = `Engineering Manual Add ${await pw.random.id()}`; + const policyName = `Engineering Manual Add ${pw.random.id()}`; await createBasicPolicy(systemConsolePage.page, { name: policyName, attribute: 'Department', @@ -309,7 +309,7 @@ test.describe('ABAC User Attributes - Attribute Changes', () => { await navigateToABACPage(systemConsolePage.page); await enableABAC(systemConsolePage.page); - const policy1Name = `Engineering Access NoAutoAdd ${await pw.random.id()}`; + const policy1Name = `Engineering Access NoAutoAdd ${pw.random.id()}`; await createBasicPolicy(systemConsolePage.page, { name: policy1Name, attribute: 'Department', @@ -387,7 +387,7 @@ test.describe('ABAC User Attributes - Attribute Changes', () => { await navigateToABACPage(systemConsolePage.page); - const policy2Name = `Engineering Access WithAutoAdd ${await pw.random.id()}`; + const policy2Name = `Engineering Access WithAutoAdd ${pw.random.id()}`; await createBasicPolicy(systemConsolePage.page, { name: policy2Name, attribute: 'Department', diff --git a/e2e-tests/playwright/specs/functional/system_console/system_users/actions.spec.ts b/e2e-tests/playwright/specs/functional/system_console/system_users/actions.spec.ts index 1f9aaebe9d3..85b45acb548 100644 --- a/e2e-tests/playwright/specs/functional/system_console/system_users/actions.spec.ts +++ b/e2e-tests/playwright/specs/functional/system_console/system_users/actions.spec.ts @@ -1,7 +1,7 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -import {type PlaywrightExtended, expect, newTestPassword, test} from '@mattermost/playwright-lib'; +import {type PlaywrightExtended, expect, test} from '@mattermost/playwright-lib'; test('MM-T5520-1 should activate and deactivate users', async ({pw}) => { const {getUser, systemConsolePage} = await setupAndGetRandomUser(pw); @@ -108,13 +108,13 @@ test('MM-T5520-4 should reset the users password', async ({pw}) => { await actionMenu.clickResetPassword(); // # Enter a random password and click Reset - await systemConsolePage.users.resetPasswordModal.fillPassword(newTestPassword()); + await systemConsolePage.users.resetPasswordModal.fillPassword(pw.newTestPassword()); await systemConsolePage.users.resetPasswordModal.reset(); }); test('MM-T5520-5 should change the users email', async ({pw}) => { const {getUser, systemConsolePage} = await setupAndGetRandomUser(pw); - const newEmail = `${await pw.random.id()}@example.com`; + const newEmail = `${pw.random.id()}@example.com`; const userRow = systemConsolePage.users.usersTable.getRowByIndex(0); diff --git a/e2e-tests/playwright/specs/functional/system_console/system_users/column_toggler.spec.ts b/e2e-tests/playwright/specs/functional/system_console/system_users/column_toggler.spec.ts index 04d0a7a512a..fcf30b7adb2 100644 --- a/e2e-tests/playwright/specs/functional/system_console/system_users/column_toggler.spec.ts +++ b/e2e-tests/playwright/specs/functional/system_console/system_users/column_toggler.spec.ts @@ -143,7 +143,7 @@ test( } // # Create two channels - const ch1Name = `count-ch1-${await pw.random.id()}`; + const ch1Name = `count-ch1-${pw.random.id()}`; const channel1 = await adminClient.createChannel({ team_id: team.id, name: ch1Name.toLowerCase().replace(/[^a-z0-9-]/g, ''), @@ -151,7 +151,7 @@ test( type: 'O', }); - const ch2Name = `count-ch2-${await pw.random.id()}`; + const ch2Name = `count-ch2-${pw.random.id()}`; const channel2 = await adminClient.createChannel({ team_id: team.id, name: ch2Name.toLowerCase().replace(/[^a-z0-9-]/g, ''), diff --git a/e2e-tests/playwright/specs/functional/system_console/system_users/filter_popover.spec.ts b/e2e-tests/playwright/specs/functional/system_console/system_users/filter_popover.spec.ts index ce3f4c9a387..29b840fbd48 100644 --- a/e2e-tests/playwright/specs/functional/system_console/system_users/filter_popover.spec.ts +++ b/e2e-tests/playwright/specs/functional/system_console/system_users/filter_popover.spec.ts @@ -204,7 +204,7 @@ test( } // # Create a channel - const channelName = `guest-ch-${await pw.random.id()}`; + const channelName = `guest-ch-${pw.random.id()}`; const channel = await adminClient.createChannel({ team_id: team.id, name: channelName.toLowerCase().replace(/[^a-z0-9-]/g, ''), @@ -260,7 +260,7 @@ test( } // # Create two channels - const ch1Name = `guest-multi-1-${await pw.random.id()}`; + const ch1Name = `guest-multi-1-${pw.random.id()}`; const channel1 = await adminClient.createChannel({ team_id: team.id, name: ch1Name.toLowerCase().replace(/[^a-z0-9-]/g, ''), @@ -268,7 +268,7 @@ test( type: 'O', }); - const ch2Name = `guest-multi-2-${await pw.random.id()}`; + const ch2Name = `guest-multi-2-${pw.random.id()}`; const channel2 = await adminClient.createChannel({ team_id: team.id, name: ch2Name.toLowerCase().replace(/[^a-z0-9-]/g, ''), diff --git a/e2e-tests/playwright/specs/functional/system_console/system_users/user_detail_edit.spec.ts b/e2e-tests/playwright/specs/functional/system_console/system_users/user_detail_edit.spec.ts index c37b1195df3..eb8092e250e 100644 --- a/e2e-tests/playwright/specs/functional/system_console/system_users/user_detail_edit.spec.ts +++ b/e2e-tests/playwright/specs/functional/system_console/system_users/user_detail_edit.spec.ts @@ -13,8 +13,8 @@ test('displays and allows editing of authentication data field', {tag: '@user_ma const {systemConsolePage} = await pw.testBrowser.login(adminUser); // # Generate unique auth data to avoid unique constraint errors - const originalAuthData = `auth-data-${await pw.random.id()}`; - const newAuthData = `auth-data-${await pw.random.id()}`; + const originalAuthData = `auth-data-${pw.random.id()}`; + const newAuthData = `auth-data-${pw.random.id()}`; // # Update user to have an auth service (simulate SAML/LDAP user) await adminClient.updateUserAuth(user.id, { @@ -60,7 +60,7 @@ test('disables email and username fields for users with auth service', {tag: '@u // # Update user to have an auth service await adminClient.updateUserAuth(user.id, { auth_service: 'ldap', - auth_data: `ldap-user-data-${await pw.random.id()}`, + auth_data: `ldap-user-data-${pw.random.id()}`, }); // # Navigate to user detail page @@ -102,8 +102,8 @@ test('allows editing email and username fields for regular users', {tag: '@user_ await expect(userCard.usernameInput).toBeEnabled(); // # Update both email and username - const newEmail = `updated-${await pw.random.id()}@example.com`; - const newUsername = `updated-${await pw.random.id()}`; + const newEmail = `updated-${pw.random.id()}@example.com`; + const newUsername = `updated-${pw.random.id()}`; await userCard.emailInput.clear(); await userCard.emailInput.fill(newEmail); @@ -173,7 +173,7 @@ test('allows cancelling save confirmation dialog', {tag: '@user_management'}, as const {userDetail} = systemConsolePage.users; // # Update email field - const newEmail = `cancelled-${await pw.random.id()}@example.com`; + const newEmail = `cancelled-${pw.random.id()}@example.com`; await userDetail.userCard.emailInput.clear(); await userDetail.userCard.emailInput.fill(newEmail); diff --git a/e2e-tests/playwright/tsconfig.json b/e2e-tests/playwright/tsconfig.json index 30a2fa6a723..f0b12b8c23e 100644 --- a/e2e-tests/playwright/tsconfig.json +++ b/e2e-tests/playwright/tsconfig.json @@ -1,8 +1,10 @@ { "compilerOptions": { - "module": "commonjs", - "moduleResolution": "node", + "module": "ESNext", + "moduleResolution": "bundler", "target": "es2022", + "lib": ["esnext", "dom"], + "types": ["node"], "declaration": true, "declarationDir": "dist", "strict": true, @@ -14,7 +16,6 @@ "strictNullChecks": true, "skipLibCheck": true, "noEmit": true, - "baseUrl": ".", "paths": { "@/asset": ["./asset"] } diff --git a/e2e-tests/playwright/utils/utils.ts b/e2e-tests/playwright/utils/utils.ts deleted file mode 100644 index 45fa85261e3..00000000000 --- a/e2e-tests/playwright/utils/utils.ts +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. -// See LICENSE.txt for license information. - -let uuidv4: (() => string) | null = null; - -export async function getRandomId(length = 7): Promise { - if (!uuidv4) { - const {v4} = await import('uuid'); - uuidv4 = v4; - } - - const MAX_SUBSTRING_INDEX = 27; - return uuidv4() - .replace(/-/g, '') - .substring(MAX_SUBSTRING_INDEX - length, MAX_SUBSTRING_INDEX); -} diff --git a/webapp/platform/types/src/config.ts b/webapp/platform/types/src/config.ts index 3b604f75617..d4b83bec40b 100644 --- a/webapp/platform/types/src/config.ts +++ b/webapp/platform/types/src/config.ts @@ -691,6 +691,7 @@ export type SSOSettings = { DiscoveryEndpoint: string; ButtonText: string; ButtonColor: string; + UsePreferredUsername: boolean; }; export type Office365Settings = { @@ -703,6 +704,7 @@ export type Office365Settings = { UserAPIEndpoint: string; DiscoveryEndpoint: string; DirectoryId: string; + UsePreferredUsername: boolean; }; export type LdapSettings = {