diff --git a/.github/workflows/cypress.yml b/.github/workflows/cypress.yml index 5bb4f44d7b1..22e35b92630 100644 --- a/.github/workflows/cypress.yml +++ b/.github/workflows/cypress.yml @@ -205,20 +205,19 @@ jobs: cypress/snapshots cypress/videos - - name: Extract NC logs + - name: Show logs if: failure() && matrix.containers != 'component' - run: docker logs nextcloud-cypress-tests_${{ env.APP_NAME }} > nextcloud.log - - - name: Upload NC logs - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 - if: failure() && matrix.containers != 'component' - with: - name: nc_logs_${{ matrix.containers }} - path: nextcloud.log + run: | + for id in $(docker ps -aq); do + docker container inspect "$id" --format '=== Logs for container {{.Name}} ===' + docker logs "$id" >> nextcloud.log + done + echo '=== Nextcloud server logs ===' + docker exec nextcloud-e2e-test-server_${{ env.APP_NAME }} cat data/nextcloud.log - name: Create data dir archive if: failure() && matrix.containers != 'component' - run: docker exec nextcloud-cypress-tests_${{ env.APP_NAME }} tar -cvjf - data > data.tar + run: docker exec nextcloud-e2e-test-server_${{ env.APP_NAME }} tar -cvjf - data > data.tar - name: Upload data dir archive uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 diff --git a/build/files-checker.php b/build/files-checker.php index c6bd007040a..8613e654fb3 100644 --- a/build/files-checker.php +++ b/build/files-checker.php @@ -57,7 +57,6 @@ $expectedFiles = [ 'cron.php', 'custom.d.ts', 'cypress.config.ts', - 'cypress.d.ts', 'cypress', 'dist', 'eslint.config.mjs', diff --git a/cypress.config.ts b/cypress.config.ts index cc86e6ff46f..f41d11aa03e 100644 --- a/cypress.config.ts +++ b/cypress.config.ts @@ -4,21 +4,19 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { Configuration } from 'webpack' - -import webpackPreprocessor from '@cypress/webpack-preprocessor' +import { configureNextcloud, docker, getContainer, getContainerName, runExec, runOcc, startNextcloud, stopNextcloud, waitOnNextcloud } from '@nextcloud/e2e-test-server' import { defineConfig } from 'cypress' -import { removeDirectory } from 'cypress-delete-downloads-folder' import cypressSplit from 'cypress-split' -import { join } from 'path' -import { - applyChangesToNextcloud, - configureNextcloud, - startNextcloud, - stopNextcloud, - waitOnNextcloud, -} from './cypress/dockerNode.ts' -import webpackConfig from './webpack.config.js' +import vitePreprocessor from 'cypress-vite' +import { existsSync, rmdirSync } from 'node:fs' +import { dirname, join, resolve } from 'node:path' +import { fileURLToPath } from 'node:url' +import { nodePolyfills } from 'vite-plugin-node-polyfills' + +if (!globalThis.__dirname) { + // Cypress has their own weird parser + globalThis.__dirname = dirname(fileURLToPath(new URL(import.meta.url))) +} export default defineConfig({ projectId: '37xpdh', @@ -65,13 +63,13 @@ export default defineConfig({ // We've imported your old cypress plugins here. // You may want to clean this up later by importing these. async setupNodeEvents(on, config) { - on('file:preprocessor', webpackPreprocessor({ webpackOptions: webpackConfig as Configuration })) - - on('task', { removeDirectory }) + on('file:preprocessor', vitePreprocessor({ + plugins: [nodePolyfills()], + })) // This allows to store global data (e.g. the name of a snapshot) // because Cypress.env() and other options are local to the current spec file. - const data = {} + const data: Record = {} on('task', { setVariable({ key, value }) { data[key] = value @@ -80,6 +78,17 @@ export default defineConfig({ getVariable({ key }) { return data[key] ?? null }, + // allow to clear the downloads folder + deleteFolder(path: string) { + try { + if (existsSync(path)) { + rmdirSync(path, { maxRetries: 10, recursive: true }) + } + return null + } catch (error) { + throw Error(`Error while deleting ${path}. Original error: ${error}`) + } + }, }) // Disable spell checking to prevent rendering differences @@ -117,21 +126,82 @@ export default defineConfig({ cypressSplit(on, config) } + const mounts = { + '3rdparty': resolve(__dirname, './3rdparty'), + apps: resolve(__dirname, './apps'), + core: resolve(__dirname, './core'), + cypress: resolve(__dirname, './cypress'), + dist: resolve(__dirname, './dist'), + lib: resolve(__dirname, './lib'), + ocs: resolve(__dirname, './ocs'), + 'ocs-provider': resolve(__dirname, './ocs-provider'), + resources: resolve(__dirname, './resources'), + tests: resolve(__dirname, './tests'), + 'console.php': resolve(__dirname, './console.php'), + 'cron.php': resolve(__dirname, './cron.php'), + 'index.php': resolve(__dirname, './index.php'), + occ: resolve(__dirname, './occ'), + 'public.php': resolve(__dirname, './public.php'), + 'remote.php': resolve(__dirname, './remote.php'), + 'status.php': resolve(__dirname, './status.php'), + 'version.php': resolve(__dirname, './version.php'), + } as Record + + for (const [key, path] of Object.entries(mounts)) { + if (!existsSync(path)) { + delete mounts[key] + } + } + // Before the browser launches // starting Nextcloud testing container - const ip = await startNextcloud(process.env.BRANCH) - + const port = 8042 + const ip = await startNextcloud(process.env.BRANCH, false, { + mounts, + exposePort: port, + }) // Setting container's IP as base Url - config.baseUrl = `http://${ip}/index.php` + config.baseUrl = `http://localhost:${port}/index.php` + // if needed for the setup tests, connect to the actions network + await connectToActionsNetwork() + // make sure not to write into apps but use a local apps folder + runExec(['mkdir', 'apps-cypress']) + runExec(['cp', 'cypress/fixtures/app.config.php', 'config']) + // now wait until Nextcloud is ready and configure it await waitOnNextcloud(ip) await configureNextcloud() + // additionally we do not want to DoS the app store + runOcc(['config:system:set', 'appstoreenabled', '--value', 'false', '--type', 'boolean']) - if (!process.env.CI) { - await applyChangesToNextcloud() - } + // for later use in tests save the container name + // @ts-expect-error we are adding a custom property + config.dockerContainerName = getContainerName() // IMPORTANT: return the config otherwise cypress-split will not work return config }, }, }) + +/** + * Connect the running test container to the GitHub Actions network + */ +async function connectToActionsNetwork() { + if (process.env.SETUP_TESTING !== 'true') { + console.log('ā”œā”€ Not running setup tests, skipping actions network connection 🌐') + return + } + + console.log('ā”œā”€ Looking for github actions network... šŸ”') + const networks = await docker.listNetworks() + const network = networks.find((network) => network.Name.startsWith('github_network')) + if (!network) { + console.log('│ └─ No actions network found āš ļø') + return + } + + console.log('│ |─ Found actions network: ' + network.Name) + await docker.getNetwork(network.Id) + .connect({ Container: getContainer().id }) + console.log('│ └─ Connected to actions network 🌐') +} diff --git a/cypress.d.ts b/cypress.d.ts deleted file mode 100644 index 91621323d33..00000000000 --- a/cypress.d.ts +++ /dev/null @@ -1,32 +0,0 @@ -/** - * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -/* eslint-disable */ -import { mount } from '@cypress/vue2' - -type MountParams = Parameters; -type OptionsParam = MountParams[1]; - -declare global { - namespace Cypress { - interface Chainable { - mount: typeof mount; - /** - * Mock an initial state for component testing - * - * @param app App name of the initial state - * @param key Key of the initial state - * @param value The mocked value of the initial state - */ - mockInitialState: (app: string, key: string, value: any) => void - /** - * Unmock all initial states or one defined by app and key - * - * @param app app name of the initial state - * @param key the key of the initial state - */ - unmockInitialState: (app?: string, key?: string) => void - } - } -} diff --git a/cypress/dockerNode.ts b/cypress/dockerNode.ts deleted file mode 100644 index d7695c94a87..00000000000 --- a/cypress/dockerNode.ts +++ /dev/null @@ -1,375 +0,0 @@ -/** - * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors - * SPDX-License-Identifier: AGPL-3.0-or-later - */ - -import { execSync } from 'child_process' -import Docker from 'dockerode' -import { existsSync } from 'fs' -import path, { basename } from 'path' -import { c as createTar } from 'tar' -import waitOn from 'wait-on' - -export const docker = new Docker() - -const CONTAINER_NAME = `nextcloud-cypress-tests_${basename(process.cwd()).replace(' ', '')}` -const SERVER_IMAGE = 'ghcr.io/nextcloud/continuous-integration-shallow-server' - -/** - * Start the testing container - * - * @param branch the branch of your current work - */ -export async function startNextcloud(branch: string = getCurrentGitBranch()): Promise { - try { - try { - // Pulling images - console.log('\nPulling images... ā³') - await new Promise((resolve, reject): any => docker.pull(SERVER_IMAGE, (err, stream) => { - if (err) { - reject(err) - } - if (stream === null) { - reject(new Error('Could not connect to docker, ensure docker is running.')) - return - } - - // https://github.com/apocas/dockerode/issues/357 - docker.modem.followProgress(stream, onFinished) - - /** - * - * @param err - */ - function onFinished(err) { - if (!err) { - resolve(true) - return - } - reject(err) - } - })) - - const digest = await (await docker.getImage(SERVER_IMAGE).inspect()).RepoDigests.at(0) - const sha = digest?.split('@').at(1) - console.log('ā”œā”€ Using image ' + sha) - console.log('└─ Done') - } catch (e) { - console.log('└─ Failed to pull images') - throw e - } - - // Remove old container if exists - console.log('\nChecking running containers... šŸ”') - try { - const oldContainer = docker.getContainer(CONTAINER_NAME) - const oldContainerData = await oldContainer.inspect() - if (oldContainerData) { - console.log('ā”œā”€ Existing running container found') - console.log('ā”œā”€ Removing... ā³') - // Forcing any remnants to be removed just in case - await oldContainer.remove({ force: true }) - console.log('└─ Done') - } - } catch { - console.log('└─ None found!') - } - - // Starting container - console.log('\nStarting Nextcloud container... šŸš€') - console.log(`ā”œā”€ Using branch '${branch}'`) - const container = await docker.createContainer({ - Image: SERVER_IMAGE, - name: CONTAINER_NAME, - HostConfig: { - Mounts: [{ - Target: '/var/www/html/data', - Source: '', - Type: 'tmpfs', - ReadOnly: false, - }], - PortBindings: { - '80/tcp': [{ - HostIP: '0.0.0.0', - HostPort: '8083', - }], - }, - // If running the setup tests, let's bind to host - // to communicate with the github actions DB services - NetworkMode: process.env.SETUP_TESTING === 'true' ? await getGithubNetwork() : undefined, - }, - Env: [ - `BRANCH=${branch}`, - 'APCU=1', - ], - }) - await container.start() - - // Set proper permissions for the data folder - await runExec(container, ['chown', '-R', 'www-data:www-data', '/var/www/html/data'], false, 'root') - await runExec(container, ['chmod', '0770', '/var/www/html/data'], false, 'root') - - // Get container's IP - const ip = await getContainerIP(container) - - console.log(`ā”œā”€ Nextcloud container's IP is ${ip} šŸŒ`) - return ip - } catch (err) { - console.log('└─ Unable to start the container šŸ›‘') - console.log('\n', err, '\n') - stopNextcloud() - throw new Error('Unable to start the container') - } -} - -/** - * Configure Nextcloud - */ -export async function configureNextcloud() { - console.log('\nConfiguring nextcloud...') - const container = docker.getContainer(CONTAINER_NAME) - await runExec(container, ['php', 'occ', '--version'], true) - - // Be consistent for screenshots - await runExec(container, ['php', 'occ', 'config:system:set', 'default_language', '--value', 'en'], true) - await runExec(container, ['php', 'occ', 'config:system:set', 'force_language', '--value', 'en'], true) - await runExec(container, ['php', 'occ', 'config:system:set', 'default_locale', '--value', 'en_US'], true) - await runExec(container, ['php', 'occ', 'config:system:set', 'force_locale', '--value', 'en_US'], true) - await runExec(container, ['php', 'occ', 'config:system:set', 'enforce_theme', '--value', 'light'], true) - - // Speed up test and make them less flaky. If a cron execution is needed, it can be triggered manually. - await runExec(container, ['php', 'occ', 'background:cron'], true) - - // Checking apcu - const distributed = await runExec(container, ['php', 'occ', 'config:system:get', 'memcache.distributed']) - const local = await runExec(container, ['php', 'occ', 'config:system:get', 'memcache.local']) - const hashing = await runExec(container, ['php', 'occ', 'config:system:get', 'hashing_default_password']) - - console.log('ā”œā”€ Checking APCu configuration... šŸ‘€') - if (!distributed.trim().includes('Memcache\\APCu') - || !local.trim().includes('Memcache\\APCu') - || !hashing.trim().includes('true')) { - console.log('└─ APCu is not properly configured šŸ›‘') - throw new Error('APCu is not properly configured') - } - console.log('│ └─ OK !') - - // Saving DB state - console.log('ā”œā”€ Creating init DB snapshot...') - await runExec(container, ['cp', '/var/www/html/data/owncloud.db', '/var/www/html/data/owncloud.db-init'], true) - console.log('ā”œā”€ Creating init data backup...') - await runExec(container, ['tar', 'cf', 'data-init.tar', 'admin'], true, undefined, '/var/www/html/data') - - console.log('└─ Nextcloud is now ready to use šŸŽ‰') -} - -/** - * Applying local changes to the container - * Only triggered if we're not in CI. Otherwise the - * continuous-integration-shallow-server image will - * already fetch the proper branch. - */ -export async function applyChangesToNextcloud() { - console.log('\nApply local changes to nextcloud...') - - const htmlPath = '/var/www/html' - const folderPaths = [ - './3rdparty', - './apps', - './core', - './dist', - './lib', - './ocs', - './ocs-provider', - './resources', - './tests', - './console.php', - './cron.php', - './index.php', - './occ', - './public.php', - './remote.php', - './status.php', - './version.php', - ].filter((folderPath) => { - const fullPath = path.resolve(__dirname, '..', folderPath) - - if (existsSync(fullPath)) { - console.log(`ā”œā”€ Copying ${folderPath}`) - return true - } - return false - }) - - // Don't try to apply changes, when there are none. Otherwise we - // still execute the 'chown' command, which is not needed. - if (folderPaths.length === 0) { - console.log('└─ No local changes found to apply') - return - } - - const container = docker.getContainer(CONTAINER_NAME) - - // Tar-streaming the above folders into the container - const serverTar = createTar({ gzip: false }, folderPaths) - await container.putArchive(serverTar, { - path: htmlPath, - }) - - // Making sure we have the proper permissions - await runExec(container, ['chown', '-R', 'www-data:www-data', htmlPath], false, 'root') - - console.log('└─ Changes applied successfully šŸŽ‰') -} - -/** - * Force stop the testing container - */ -export async function stopNextcloud() { - try { - const container = docker.getContainer(CONTAINER_NAME) - console.log('Stopping Nextcloud container...') - container.remove({ force: true }) - console.log('└─ Nextcloud container removed šŸ„€') - } catch (err) { - console.log(err) - } -} - -/** - * Get the testing container's IP - * - * @param container the container to get the IP from - */ -export async function getContainerIP(container = docker.getContainer(CONTAINER_NAME)): Promise { - let ip = '' - let tries = 0 - while (ip === '' && tries < 10) { - tries++ - - container.inspect(function(err, data) { - if (err) { - throw err - } - - if (data?.HostConfig.PortBindings?.['80/tcp']?.[0]?.HostPort) { - ip = `localhost:${data.HostConfig.PortBindings['80/tcp'][0].HostPort}` - } else { - ip = data?.NetworkSettings?.IPAddress || '' - } - }) - - if (ip !== '') { - break - } - - await sleep(1000 * tries) - } - - return ip -} - -// Would be simpler to start the container from cypress.config.ts, -// but when checking out different branches, it can take a few seconds -// Until we can properly configure the baseUrl retry intervals, -// We need to make sure the server is already running before cypress -// https://github.com/cypress-io/cypress/issues/22676 -/** - * - * @param ip - */ -export async function waitOnNextcloud(ip: string) { - console.log('ā”œā”€ Waiting for Nextcloud to be ready... ā³') - await waitOn({ - resources: [`http://${ip}/index.php`], - // wait for nextcloud to be up and return any non error status - validateStatus: (status) => status >= 200 && status < 400, - // timout in ms - timeout: 5 * 60 * 1000, - // timeout for a single HTTP request - httpTimeout: 60 * 1000, - }) - console.log('└─ Done') -} - -/** - * - * @param container - * @param command - * @param verbose - * @param user - * @param workdir - */ -async function runExec( - container: Docker.Container, - command: string[], - verbose = false, - user = 'www-data', - workdir?: string, -): Promise { - const exec = await container.exec({ - Cmd: command, - WorkingDir: workdir, - AttachStdout: true, - AttachStderr: true, - User: user, - }) - - return new Promise((resolve, reject) => { - let output = '' - exec.start({}, (err, stream) => { - if (err) { - reject(err) - } - if (stream) { - stream.setEncoding('utf-8') - stream.on('data', (str) => { - str = str.trim() - // Remove non printable characters - // eslint-disable-next-line no-control-regex - .replace(/[^\x0A\x0D\x20-\x7E]+/g, '') - // Remove non alphanumeric leading characters - .replace(/^[^a-z]/gi, '') - output += str - if (verbose && str !== '') { - console.log(`ā”œā”€ ${str.replace(/\n/gi, '\nā”œā”€ ')}`) - } - }) - stream.on('end', () => resolve(output)) - } - }) - }) -} - -/** - * - * @param milliseconds - */ -function sleep(milliseconds: number) { - return new Promise((resolve) => setTimeout(resolve, milliseconds)) -} - -/** - * - */ -function getCurrentGitBranch() { - return execSync('git rev-parse --abbrev-ref HEAD').toString().trim() || 'master' -} - -/** - * Get the network name of the github actions network - * This is used to connect to the database services - * started by github actions - */ -async function getGithubNetwork(): Promise { - console.log('ā”œā”€ Looking for github actions network... šŸ”') - const networks = await docker.listNetworks() - const network = networks.find((network) => network.Name.startsWith('github_network')) - if (network) { - console.log('│ └─ Found github actions network: ' + network.Name) - return network.Name - } - - console.log('│ └─ No github actions network found') - return undefined -} diff --git a/cypress/e2e/core/header_access-levels.cy.ts b/cypress/e2e/core/header_access-levels.cy.ts index 26b6794dd1c..e04109bfb3b 100644 --- a/cypress/e2e/core/header_access-levels.cy.ts +++ b/cypress/e2e/core/header_access-levels.cy.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import { User } from '@nextcloud/cypress' +import { User } from '@nextcloud/e2e-test-server/cypress' import { clearState, getNextcloudUserMenu, getNextcloudUserMenuToggle } from '../../support/commonUtils.ts' const admin = new User('admin', 'admin') diff --git a/cypress/e2e/core/header_contacts-menu.cy.ts b/cypress/e2e/core/header_contacts-menu.cy.ts index 31b0fd295bf..657a50bc85c 100644 --- a/cypress/e2e/core/header_contacts-menu.cy.ts +++ b/cypress/e2e/core/header_contacts-menu.cy.ts @@ -3,9 +3,9 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import { User } from '@nextcloud/cypress' -import randomString from 'crypto-random-string' +import { User } from '@nextcloud/e2e-test-server/cypress' import { clearState, getNextcloudHeader } from '../../support/commonUtils.ts' +import { randomString } from '../../support/utils/randomString.ts' const admin = new User('admin', 'admin') diff --git a/cypress/e2e/core/setup.ts b/cypress/e2e/core/setup.ts index 3897a8fa9be..dfc2bcabbb7 100644 --- a/cypress/e2e/core/setup.ts +++ b/cypress/e2e/core/setup.ts @@ -3,6 +3,8 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ +import { randomString } from '../../support/utils/randomString.ts' + /** * DO NOT RENAME THIS FILE to .cy.ts āš ļø * This is not following the pattern of the other files in this folder @@ -110,7 +112,7 @@ describe('Can install Nextcloud', { testIsolation: true, retries: 0 }, () => { * Shared admin setup function for the Nextcloud setup */ function sharedSetup() { - const randAdmin = 'admin-' + Math.random().toString(36).substring(2, 15) + const randAdmin = 'admin-' + randomString(10) // mock appstore cy.intercept('**/settings/apps/list', { fixture: 'appstore/apps.json' }) diff --git a/cypress/e2e/files/FilesUtils.ts b/cypress/e2e/files/FilesUtils.ts index 5f6d1708aac..9ff8025e2a0 100644 --- a/cypress/e2e/files/FilesUtils.ts +++ b/cypress/e2e/files/FilesUtils.ts @@ -3,9 +3,9 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' -import { ACTION_COPY_MOVE } from '../../../apps/files/src/actions/moveOrCopyAction.ts' +const ACTION_COPY_MOVE = 'move-copy' export const getRowForFileId = (fileid: number) => cy.get(`[data-cy-files-list-row-fileid="${fileid}"]`) export const getRowForFile = (filename: string) => cy.get(`[data-cy-files-list-row-name="${CSS.escape(filename)}"]`) diff --git a/cypress/e2e/files/LivePhotosUtils.ts b/cypress/e2e/files/LivePhotosUtils.ts index a6a2cef5878..b551cbbdd9d 100644 --- a/cypress/e2e/files/LivePhotosUtils.ts +++ b/cypress/e2e/files/LivePhotosUtils.ts @@ -3,7 +3,9 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' + +import { randomString } from '../../support/utils/randomString.ts' type SetupInfo = { snapshot: string @@ -72,7 +74,7 @@ export function setupLivePhotos(): Cypress.Chainable { } else { let requesttoken: string - setupInfo.fileName = Math.random().toString(36).replace(/[^a-z]+/g, '').substring(0, 10) + setupInfo.fileName = randomString(10) cy.createRandomUser().then((_user) => { setupInfo.user = _user diff --git a/cypress/e2e/files/favorites.cy.ts b/cypress/e2e/files/favorites.cy.ts index 38e34a76d2b..be68157b9fe 100644 --- a/cypress/e2e/files/favorites.cy.ts +++ b/cypress/e2e/files/favorites.cy.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' import { getActionButtonForFile, getRowForFile, triggerActionForFile } from './FilesUtils.ts' diff --git a/cypress/e2e/files/files-actions.cy.ts b/cypress/e2e/files/files-actions.cy.ts index 4e4568fc51f..f9b481c5be1 100644 --- a/cypress/e2e/files/files-actions.cy.ts +++ b/cypress/e2e/files/files-actions.cy.ts @@ -3,14 +3,15 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' import { FileAction } from '@nextcloud/files' -import { ACTION_DELETE } from '../../../apps/files/src/actions/deleteAction.ts' -import { ACTION_COPY_MOVE } from '../../../apps/files/src/actions/moveOrCopyAction.ts' -import { ACTION_DETAILS } from '../../../apps/files/src/actions/sidebarAction.ts' import { getActionButtonForFileId, getActionEntryForFileId, getRowForFile, getSelectionActionButton, getSelectionActionEntry, selectRowForFile } from './FilesUtils.ts' +const ACTION_DELETE = 'delete' +const ACTION_COPY_MOVE = 'move-copy' +const ACTION_DETAILS = 'details' + declare global { interface Window { _nc_fileactions: FileAction[] diff --git a/cypress/e2e/files/files-delete.cy.ts b/cypress/e2e/files/files-delete.cy.ts index 03bc1ade1bf..8d51e82de34 100644 --- a/cypress/e2e/files/files-delete.cy.ts +++ b/cypress/e2e/files/files-delete.cy.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' import { getRowForFile, navigateToFolder, selectAllFiles, triggerActionForFile } from './FilesUtils.ts' diff --git a/cypress/e2e/files/files-download.cy.ts b/cypress/e2e/files/files-download.cy.ts index 474340994de..7e74f7a8b8c 100644 --- a/cypress/e2e/files/files-download.cy.ts +++ b/cypress/e2e/files/files-download.cy.ts @@ -3,11 +3,11 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' -import randomString from 'crypto-random-string' -import { deleteDownloadsFolderBeforeEach } from 'cypress-delete-downloads-folder' import { zipFileContains } from '../../support/utils/assertions.ts' +import { deleteDownloadsFolderBeforeEach } from '../../support/utils/deleteDownloadsFolder.ts' +import { randomString } from '../../support/utils/randomString.ts' import { getRowForFile, navigateToFolder, triggerActionForFile } from './FilesUtils.ts' describe('files: Download files using file actions', { testIsolation: true }, () => { diff --git a/cypress/e2e/files/files-filtering.cy.ts b/cypress/e2e/files/files-filtering.cy.ts index 47516cc15ae..5c6ff159347 100644 --- a/cypress/e2e/files/files-filtering.cy.ts +++ b/cypress/e2e/files/files-filtering.cy.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' import { FilesFilterPage } from '../../pages/FilesFilters.ts' import { FilesNavigationPage } from '../../pages/FilesNavigation.ts' diff --git a/cypress/e2e/files/files-navigation.cy.ts b/cypress/e2e/files/files-navigation.cy.ts index 189d9b08d70..9fd74097deb 100644 --- a/cypress/e2e/files/files-navigation.cy.ts +++ b/cypress/e2e/files/files-navigation.cy.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' import { getRowForFile, navigateToFolder } from './FilesUtils.ts' diff --git a/cypress/e2e/files/files-renaming.cy.ts b/cypress/e2e/files/files-renaming.cy.ts index 63ea57d6f29..200bf6779dc 100644 --- a/cypress/e2e/files/files-renaming.cy.ts +++ b/cypress/e2e/files/files-renaming.cy.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' import { calculateViewportHeight, createFolder, getRowForFile, haveValidity, renameFile, triggerActionForFile } from './FilesUtils.ts' diff --git a/cypress/e2e/files/files-selection.cy.ts b/cypress/e2e/files/files-selection.cy.ts index 8867d48c2fe..7600d2c78f8 100644 --- a/cypress/e2e/files/files-selection.cy.ts +++ b/cypress/e2e/files/files-selection.cy.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' import { deselectAllFiles, selectAllFiles, selectRowForFile } from './FilesUtils.ts' diff --git a/cypress/e2e/files/files-settings.cy.ts b/cypress/e2e/files/files-settings.cy.ts index b363e630b44..6bf41615e52 100644 --- a/cypress/e2e/files/files-settings.cy.ts +++ b/cypress/e2e/files/files-settings.cy.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' import { getRowForFile } from './FilesUtils.ts' diff --git a/cypress/e2e/files/files-sidebar.cy.ts b/cypress/e2e/files/files-sidebar.cy.ts index d1c1aec9fc4..2d1ca180cd9 100644 --- a/cypress/e2e/files/files-sidebar.cy.ts +++ b/cypress/e2e/files/files-sidebar.cy.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' import { assertNotExistOrNotVisible } from '../settings/usersUtils.ts' import { getRowForFile, navigateToFolder, triggerActionForFile } from './FilesUtils.ts' diff --git a/cypress/e2e/files/files.cy.ts b/cypress/e2e/files/files.cy.ts index 17809a4e8fc..745c330c543 100644 --- a/cypress/e2e/files/files.cy.ts +++ b/cypress/e2e/files/files.cy.ts @@ -1,4 +1,4 @@ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' /** * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors diff --git a/cypress/e2e/files/live_photos.cy.ts b/cypress/e2e/files/live_photos.cy.ts index 0eb35f31259..2e2d19f9985 100644 --- a/cypress/e2e/files/live_photos.cy.ts +++ b/cypress/e2e/files/live_photos.cy.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' import { clickOnBreadcrumbs, diff --git a/cypress/e2e/files/recent-view.cy.ts b/cypress/e2e/files/recent-view.cy.ts index 27baccbad90..3dd6fb2a8a6 100644 --- a/cypress/e2e/files/recent-view.cy.ts +++ b/cypress/e2e/files/recent-view.cy.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' import { getRowForFile, triggerActionForFile } from './FilesUtils.ts' diff --git a/cypress/e2e/files/router-query.cy.ts b/cypress/e2e/files/router-query.cy.ts index 7f496a89bf5..b3c3dd55de0 100644 --- a/cypress/e2e/files/router-query.cy.ts +++ b/cypress/e2e/files/router-query.cy.ts @@ -3,9 +3,9 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' -import { join } from 'path' +import { joinPaths as join } from '@nextcloud/paths' import { getRowForFileId } from './FilesUtils.ts' /** diff --git a/cypress/e2e/files/search.cy.ts b/cypress/e2e/files/search.cy.ts index 0ddd0852c51..96036d16640 100644 --- a/cypress/e2e/files/search.cy.ts +++ b/cypress/e2e/files/search.cy.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' import { FilesNavigationPage } from '../../pages/FilesNavigation.ts' import { getRowForFile, navigateToFolder } from './FilesUtils.ts' diff --git a/cypress/e2e/files_external/StorageUtils.ts b/cypress/e2e/files_external/StorageUtils.ts index d9d4e89c667..49b3f582d51 100644 --- a/cypress/e2e/files_external/StorageUtils.ts +++ b/cypress/e2e/files_external/StorageUtils.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' export type StorageConfig = { [key: string]: string diff --git a/cypress/e2e/files_external/files-external-failed.cy.ts b/cypress/e2e/files_external/files-external-failed.cy.ts index 6cf08e11cf4..59ece1db6f0 100644 --- a/cypress/e2e/files_external/files-external-failed.cy.ts +++ b/cypress/e2e/files_external/files-external-failed.cy.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' import { getRowForFile } from '../files/FilesUtils.ts' import { AuthBackend, createStorageWithConfig, StorageBackend } from './StorageUtils.ts' diff --git a/cypress/e2e/files_external/files-user-credentials.cy.ts b/cypress/e2e/files_external/files-user-credentials.cy.ts index 93370b60721..a6d52015b36 100644 --- a/cypress/e2e/files_external/files-user-credentials.cy.ts +++ b/cypress/e2e/files_external/files-user-credentials.cy.ts @@ -3,13 +3,14 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' -import { ACTION_CREDENTIALS_EXTERNAL_STORAGE } from '../../../apps/files_external/src/actions/enterCredentialsAction.ts' import { getInlineActionEntryForFile, getRowForFile, navigateToFolder, triggerInlineActionForFile } from '../files/FilesUtils.ts' import { handlePasswordConfirmation } from '../settings/usersUtils.ts' import { AuthBackend, createStorageWithConfig, StorageBackend } from './StorageUtils.ts' +const ACTION_CREDENTIALS_EXTERNAL_STORAGE = 'credentials-external-storage' + describe('Files user credentials', { testIsolation: true }, () => { let user1: User let user2: User diff --git a/cypress/e2e/files_external/home-folder-root-mount-permissions.cy.ts b/cypress/e2e/files_external/home-folder-root-mount-permissions.cy.ts index 54084860bc0..731f37ac41e 100644 --- a/cypress/e2e/files_external/home-folder-root-mount-permissions.cy.ts +++ b/cypress/e2e/files_external/home-folder-root-mount-permissions.cy.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' import { AuthBackend, createStorageWithConfig, deleteAllExternalStorages, setStorageMountOptions, StorageBackend } from './StorageUtils.ts' diff --git a/cypress/e2e/files_sharing/expiry-date.cy.ts b/cypress/e2e/files_sharing/expiry-date.cy.ts index 23a49cb67a7..32b5239e3a1 100644 --- a/cypress/e2e/files_sharing/expiry-date.cy.ts +++ b/cypress/e2e/files_sharing/expiry-date.cy.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' import { closeSidebar } from '../files/FilesUtils.ts' import { createShare, openSharingDetails, openSharingPanel, updateShare } from './FilesSharingUtils.ts' diff --git a/cypress/e2e/files_sharing/file-request.cy.ts b/cypress/e2e/files_sharing/file-request.cy.ts index 4395289cfaa..76965f320bb 100644 --- a/cypress/e2e/files_sharing/file-request.cy.ts +++ b/cypress/e2e/files_sharing/file-request.cy.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' import { createFolder, getRowForFile, navigateToFolder } from '../files/FilesUtils.ts' import { createFileRequest } from './FilesSharingUtils.ts' diff --git a/cypress/e2e/files_sharing/files-copy-move.cy.ts b/cypress/e2e/files_sharing/files-copy-move.cy.ts index 6e251d75e92..16d07c3d40c 100644 --- a/cypress/e2e/files_sharing/files-copy-move.cy.ts +++ b/cypress/e2e/files_sharing/files-copy-move.cy.ts @@ -2,9 +2,9 @@ * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' -import { ACTION_COPY_MOVE } from '../../../apps/files/src/actions/moveOrCopyAction.ts' +import type { User } from '@nextcloud/e2e-test-server/cypress' + import { copyFile, getRowForFile, @@ -13,6 +13,8 @@ import { } from '../files/FilesUtils.ts' import { createShare } from './FilesSharingUtils.ts' +const ACTION_COPY_MOVE = 'move-copy' + export function copyFileForbidden(fileName: string, dirPath: string) { getRowForFile(fileName).should('be.visible') triggerActionForFile(fileName, ACTION_COPY_MOVE) diff --git a/cypress/e2e/files_sharing/files-download.cy.ts b/cypress/e2e/files_sharing/files-download.cy.ts index b0b6812de5a..9ee3bda0699 100644 --- a/cypress/e2e/files_sharing/files-download.cy.ts +++ b/cypress/e2e/files_sharing/files-download.cy.ts @@ -2,7 +2,7 @@ * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' import { getActionButtonForFile, diff --git a/cypress/e2e/files_sharing/files-shares-view.cy.ts b/cypress/e2e/files_sharing/files-shares-view.cy.ts index bcc1cfa14cc..c20fad87a67 100644 --- a/cypress/e2e/files_sharing/files-shares-view.cy.ts +++ b/cypress/e2e/files_sharing/files-shares-view.cy.ts @@ -2,7 +2,7 @@ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' import { getRowForFile } from '../files/FilesUtils.ts' import { createShare } from './FilesSharingUtils.ts' diff --git a/cypress/e2e/files_sharing/limit_to_same_group.cy.ts b/cypress/e2e/files_sharing/limit_to_same_group.cy.ts index 43d6db0e04d..b29e9f13126 100644 --- a/cypress/e2e/files_sharing/limit_to_same_group.cy.ts +++ b/cypress/e2e/files_sharing/limit_to_same_group.cy.ts @@ -3,8 +3,9 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' +import { randomString } from '../../support/utils/randomString.ts' import { createShare } from './FilesSharingUtils.ts' describe('Limit to sharing to people in the same group', () => { @@ -17,11 +18,11 @@ describe('Limit to sharing to people in the same group', () => { let randomGroupName3 = '' before(() => { - randomFileName1 = Math.random().toString(36).replace(/[^a-z]+/g, '').substring(0, 10) + '.txt' - randomFileName2 = Math.random().toString(36).replace(/[^a-z]+/g, '').substring(0, 10) + '.txt' - randomGroupName = Math.random().toString(36).replace(/[^a-z]+/g, '').substring(0, 10) - randomGroupName2 = Math.random().toString(36).replace(/[^a-z]+/g, '').substring(0, 10) - randomGroupName3 = Math.random().toString(36).replace(/[^a-z]+/g, '').substring(0, 10) + randomFileName1 = randomString(10) + '.txt' + randomFileName2 = randomString(10) + '.txt' + randomGroupName = randomString(10) + randomGroupName2 = randomString(10) + randomGroupName3 = randomString(10) cy.runOccCommand('config:app:set core shareapi_only_share_with_group_members --value yes') diff --git a/cypress/e2e/files_sharing/note-to-recipient.cy.ts b/cypress/e2e/files_sharing/note-to-recipient.cy.ts index c26bf56da09..989155a6608 100644 --- a/cypress/e2e/files_sharing/note-to-recipient.cy.ts +++ b/cypress/e2e/files_sharing/note-to-recipient.cy.ts @@ -2,7 +2,7 @@ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' import { navigateToFolder } from '../files/FilesUtils.ts' import { createShare, openSharingPanel } from './FilesSharingUtils.ts' diff --git a/cypress/e2e/files_sharing/public-share/PublicShareUtils.ts b/cypress/e2e/files_sharing/public-share/PublicShareUtils.ts index 248cd3bff0b..995a4ff5252 100644 --- a/cypress/e2e/files_sharing/public-share/PublicShareUtils.ts +++ b/cypress/e2e/files_sharing/public-share/PublicShareUtils.ts @@ -2,7 +2,7 @@ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' import type { ShareOptions } from '../ShareOptionsType.ts' import { openSharingPanel } from '../FilesSharingUtils.ts' diff --git a/cypress/e2e/files_sharing/public-share/default-view.cy.ts b/cypress/e2e/files_sharing/public-share/default-view.cy.ts index d3f42d0a20d..e0880b237c3 100644 --- a/cypress/e2e/files_sharing/public-share/default-view.cy.ts +++ b/cypress/e2e/files_sharing/public-share/default-view.cy.ts @@ -2,7 +2,7 @@ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' import { getRowForFile } from '../../files/FilesUtils.ts' import { createLinkShare, setupData } from './PublicShareUtils.ts' diff --git a/cypress/e2e/files_sharing/public-share/download.cy.ts b/cypress/e2e/files_sharing/public-share/download.cy.ts index f137f60609a..bc08f0bdb1f 100644 --- a/cypress/e2e/files_sharing/public-share/download.cy.ts +++ b/cypress/e2e/files_sharing/public-share/download.cy.ts @@ -1,18 +1,15 @@ -import type { User } from '@nextcloud/cypress' - /*! * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ -// @ts-expect-error The package is currently broken - but works... -import { deleteDownloadsFolderBeforeEach } from 'cypress-delete-downloads-folder' + +import type { User } from '@nextcloud/e2e-test-server/cypress' +import type { ShareContext } from './PublicShareUtils.ts' + import { zipFileContains } from '../../../support/utils/assertions.ts' +import { deleteDownloadsFolderBeforeEach } from '../../../support/utils/deleteDownloadsFolder.ts' import { getRowForFile, getRowForFileId, triggerActionForFile, triggerActionForFileId } from '../../files/FilesUtils.ts' -import { - type ShareContext, - - createLinkShare, getShareUrl, openLinkShareDetails, setupPublicShare, -} from './PublicShareUtils.ts' +import { createLinkShare, getShareUrl, openLinkShareDetails, setupPublicShare } from './PublicShareUtils.ts' describe('files_sharing: Public share - downloading files', { testIsolation: true }, () => { // in general there is no difference except downloading diff --git a/cypress/e2e/files_sharing/public-share/sidebar-tab.cy.ts b/cypress/e2e/files_sharing/public-share/sidebar-tab.cy.ts index 4ec5f2852c8..5d2da68bb58 100644 --- a/cypress/e2e/files_sharing/public-share/sidebar-tab.cy.ts +++ b/cypress/e2e/files_sharing/public-share/sidebar-tab.cy.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' import { createLinkShare, openLinkShareDetails } from './PublicShareUtils.ts' diff --git a/cypress/e2e/files_sharing/share-status-action.cy.ts b/cypress/e2e/files_sharing/share-status-action.cy.ts index dee6fe187ed..cfbbc29664b 100644 --- a/cypress/e2e/files_sharing/share-status-action.cy.ts +++ b/cypress/e2e/files_sharing/share-status-action.cy.ts @@ -2,7 +2,7 @@ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' import { closeSidebar, enableGridMode, getActionButtonForFile, getInlineActionEntryForFile, getRowForFile } from '../files/FilesUtils.ts' import { createShare } from './FilesSharingUtils.ts' diff --git a/cypress/e2e/files_trashbin/files-trash-action.cy.ts b/cypress/e2e/files_trashbin/files-trash-action.cy.ts index 823c783c8b0..fff87776c91 100644 --- a/cypress/e2e/files_trashbin/files-trash-action.cy.ts +++ b/cypress/e2e/files_trashbin/files-trash-action.cy.ts @@ -2,7 +2,7 @@ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' import { deleteFileWithRequest, triggerFileListAction } from '../files/FilesUtils.ts' diff --git a/cypress/e2e/files_trashbin/files.cy.ts b/cypress/e2e/files_trashbin/files.cy.ts index 4c2bce7df7a..c51ad27879f 100644 --- a/cypress/e2e/files_trashbin/files.cy.ts +++ b/cypress/e2e/files_trashbin/files.cy.ts @@ -3,15 +3,14 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' -// @ts-expect-error package has wrong typings -import { deleteDownloadsFolderBeforeEach } from 'cypress-delete-downloads-folder' +import { deleteDownloadsFolderBeforeEach } from '../../support/utils/deleteDownloadsFolder.ts' import { deleteFileWithRequest, getRowForFileId, selectAllFiles, triggerActionForFileId } from '../files/FilesUtils.ts' describe('files_trashbin: download files', { testIsolation: true }, () => { let user: User - const fileids: number[] = [] + const fileids: [number, number] = [0, 0] deleteDownloadsFolderBeforeEach() @@ -20,10 +19,10 @@ describe('files_trashbin: download files', { testIsolation: true }, () => { user = $user cy.uploadContent(user, new Blob(['']), 'text/plain', '/file.txt') - .then(({ headers }) => fileids.push(Number.parseInt(headers['oc-fileid']))) + .then(({ headers }) => fileids[0] = Number.parseInt(headers['oc-fileid'])) .then(() => deleteFileWithRequest(user, '/file.txt')) cy.uploadContent(user, new Blob(['']), 'text/plain', '/other-file.txt') - .then(({ headers }) => fileids.push(Number.parseInt(headers['oc-fileid']))) + .then(({ headers }) => fileids[1] = Number.parseInt(headers['oc-fileid'])) .then(() => deleteFileWithRequest(user, '/other-file.txt')) }) }) diff --git a/cypress/e2e/files_versions/filesVersionsUtils.ts b/cypress/e2e/files_versions/filesVersionsUtils.ts index cd27266921d..482d29ed8f0 100644 --- a/cypress/e2e/files_versions/filesVersionsUtils.ts +++ b/cypress/e2e/files_versions/filesVersionsUtils.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' import type { ShareSetting } from '../files_sharing/FilesSharingUtils.ts' import { createShare } from '../files_sharing/FilesSharingUtils.ts' diff --git a/cypress/e2e/files_versions/version_creation.cy.ts b/cypress/e2e/files_versions/version_creation.cy.ts index 7124044cb89..ac011fc5f7d 100644 --- a/cypress/e2e/files_versions/version_creation.cy.ts +++ b/cypress/e2e/files_versions/version_creation.cy.ts @@ -3,13 +3,14 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ +import { randomString } from '../../support/utils/randomString.ts' import { openVersionsPanel, uploadThreeVersions } from './filesVersionsUtils.ts' describe('Versions creation', () => { let randomFileName = '' before(() => { - randomFileName = Math.random().toString(36).replace(/[^a-z]+/g, '').substring(0, 10) + '.txt' + randomFileName = randomString(10) + '.txt' cy.createRandomUser() .then((user) => { diff --git a/cypress/e2e/files_versions/version_cross_share_move_and_copy.cy.ts b/cypress/e2e/files_versions/version_cross_share_move_and_copy.cy.ts index 2e6d0a2f315..d09b9c6aac9 100644 --- a/cypress/e2e/files_versions/version_cross_share_move_and_copy.cy.ts +++ b/cypress/e2e/files_versions/version_cross_share_move_and_copy.cy.ts @@ -3,32 +3,12 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' +import { randomString } from '../../support/utils/randomString.ts' import { clickOnBreadcrumbs, closeSidebar, copyFile, moveFile, navigateToFolder } from '../files/FilesUtils.ts' import { assertVersionContent, nameVersion, openVersionsPanel, setupTestSharedFileFromUser, uploadThreeVersions } from './filesVersionsUtils.ts' -/** - * - * @param filePath - */ -function assertVersionsContent(filePath: string) { - const path = filePath.split('/').slice(0, -1).join('/') - - clickOnBreadcrumbs('All files') - - if (path !== '') { - navigateToFolder(path) - } - - openVersionsPanel(filePath) - - cy.get('[data-files-versions-version]').should('have.length', 3) - assertVersionContent(0, 'v3') - assertVersionContent(1, 'v2') - assertVersionContent(2, 'v1') -} - describe('Versions cross share move and copy', () => { let randomSharedFolderName = '' let randomFileName = '' @@ -37,7 +17,7 @@ describe('Versions cross share move and copy', () => { let bob: User before(() => { - randomSharedFolderName = Math.random().toString(36).replace(/[^a-z]+/g, '').substring(0, 10) + randomSharedFolderName = randomString(10) cy.createRandomUser() .then((user) => { @@ -49,7 +29,7 @@ describe('Versions cross share move and copy', () => { }) beforeEach(() => { - randomFileName = Math.random().toString(36).replace(/[^a-z]+/g, '').substring(0, 10) + '.txt' + randomFileName = randomString(10) + '.txt' randomFilePath = `${randomSharedFolderName}/${randomFileName}` uploadThreeVersions(alice, randomFilePath) @@ -78,8 +58,8 @@ describe('Versions cross share move and copy', () => { let randomSubSubFolderName beforeEach(() => { - randomSubFolderName = Math.random().toString(36).replace(/[^a-z]+/g, '').substring(0, 10) - randomSubSubFolderName = Math.random().toString(36).replace(/[^a-z]+/g, '').substring(0, 10) + randomSubFolderName = randomString(10) + randomSubSubFolderName = randomString(10) clickOnBreadcrumbs('All files') cy.mkdir(bob, `/${randomSharedFolderName}/${randomSubFolderName}`) cy.mkdir(bob, `/${randomSharedFolderName}/${randomSubFolderName}/${randomSubSubFolderName}`) @@ -101,3 +81,23 @@ describe('Versions cross share move and copy', () => { }) }) }) + +/** + * @param filePath + */ +function assertVersionsContent(filePath: string) { + const path = filePath.split('/').slice(0, -1).join('/') + + clickOnBreadcrumbs('All files') + + if (path !== '') { + navigateToFolder(path) + } + + openVersionsPanel(filePath) + + cy.get('[data-files-versions-version]').should('have.length', 3) + assertVersionContent(0, 'v3') + assertVersionContent(1, 'v2') + assertVersionContent(2, 'v1') +} diff --git a/cypress/e2e/files_versions/version_deletion.cy.ts b/cypress/e2e/files_versions/version_deletion.cy.ts index 9deba7ceff2..4a90dbac4dc 100644 --- a/cypress/e2e/files_versions/version_deletion.cy.ts +++ b/cypress/e2e/files_versions/version_deletion.cy.ts @@ -3,14 +3,15 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' +import { randomString } from '../../support/utils/randomString.ts' import { getRowForFile, navigateToFolder } from '../files/FilesUtils.ts' import { deleteVersion, doesNotHaveAction, openVersionsPanel, setupTestSharedFileFromUser, uploadThreeVersions } from './filesVersionsUtils.ts' describe('Versions restoration', () => { const folderName = 'shared_folder' - const randomFileName = Math.random().toString(36).replace(/[^a-z]+/g, '').substring(0, 10) + '.txt' + const randomFileName = randomString(10) + '.txt' const randomFilePath = `/${folderName}/${randomFileName}` let user: User let versionCount = 0 diff --git a/cypress/e2e/files_versions/version_download.cy.ts b/cypress/e2e/files_versions/version_download.cy.ts index 5781d1c1b70..e0dc459e277 100644 --- a/cypress/e2e/files_versions/version_download.cy.ts +++ b/cypress/e2e/files_versions/version_download.cy.ts @@ -3,8 +3,9 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' +import { randomString } from '../../support/utils/randomString.ts' import { getRowForFile } from '../files/FilesUtils.ts' import { assertVersionContent, doesNotHaveAction, openVersionsPanel, setupTestSharedFileFromUser, uploadThreeVersions } from './filesVersionsUtils.ts' @@ -13,7 +14,7 @@ describe('Versions download', () => { let user: User before(() => { - randomFileName = Math.random().toString(36).replace(/[^a-z]+/g, '').substring(0, 10) + '.txt' + randomFileName = randomString(10) + '.txt' cy.runOccCommand('config:app:set --value no core shareapi_allow_view_without_download') cy.createRandomUser() diff --git a/cypress/e2e/files_versions/version_expiration.cy.ts b/cypress/e2e/files_versions/version_expiration.cy.ts index 7f9fdfae878..331c58dd04b 100644 --- a/cypress/e2e/files_versions/version_expiration.cy.ts +++ b/cypress/e2e/files_versions/version_expiration.cy.ts @@ -3,13 +3,14 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ +import { randomString } from '../../support/utils/randomString.ts' import { assertVersionContent, nameVersion, openVersionsPanel, uploadThreeVersions } from './filesVersionsUtils.ts' describe('Versions expiration', () => { let randomFileName = '' beforeEach(() => { - randomFileName = Math.random().toString(36).replace(/[^a-z]+/g, '').substring(0, 10) + '.txt' + randomFileName = randomString(10) + '.txt' cy.createRandomUser() .then((user) => { diff --git a/cypress/e2e/files_versions/version_naming.cy.ts b/cypress/e2e/files_versions/version_naming.cy.ts index 94460f48207..f4b48ba0470 100644 --- a/cypress/e2e/files_versions/version_naming.cy.ts +++ b/cypress/e2e/files_versions/version_naming.cy.ts @@ -3,8 +3,9 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' +import { randomString } from '../../support/utils/randomString.ts' import { getRowForFile } from '../files/FilesUtils.ts' import { doesNotHaveAction, nameVersion, openVersionsPanel, setupTestSharedFileFromUser, uploadThreeVersions } from './filesVersionsUtils.ts' @@ -13,7 +14,7 @@ describe('Versions naming', () => { let user: User before(() => { - randomFileName = Math.random().toString(36).replace(/[^a-z]+/g, '').substring(0, 10) + '.txt' + randomFileName = randomString(10) + '.txt' cy.createRandomUser() .then((_user) => { diff --git a/cypress/e2e/files_versions/version_restoration.cy.ts b/cypress/e2e/files_versions/version_restoration.cy.ts index 208e54d03ea..de10d42e544 100644 --- a/cypress/e2e/files_versions/version_restoration.cy.ts +++ b/cypress/e2e/files_versions/version_restoration.cy.ts @@ -3,8 +3,9 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' +import { randomString } from '../../support/utils/randomString.ts' import { getRowForFile } from '../files/FilesUtils.ts' import { assertVersionContent, doesNotHaveAction, openVersionsPanel, restoreVersion, setupTestSharedFileFromUser, uploadThreeVersions } from './filesVersionsUtils.ts' @@ -13,7 +14,7 @@ describe('Versions restoration', () => { let user: User before(() => { - randomFileName = Math.random().toString(36).replace(/[^a-z]+/g, '').substring(0, 10) + '.txt' + randomFileName = randomString(10) + '.txt' cy.createRandomUser() .then((_user) => { diff --git a/cypress/e2e/files_versions/version_sharing.cy.ts b/cypress/e2e/files_versions/version_sharing.cy.ts index 6cb7610a9d2..4aa762cd28c 100644 --- a/cypress/e2e/files_versions/version_sharing.cy.ts +++ b/cypress/e2e/files_versions/version_sharing.cy.ts @@ -2,14 +2,15 @@ * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' +import { randomString } from '../../support/utils/randomString.ts' import { navigateToFolder, triggerActionForFile } from '../files/FilesUtils.ts' import { setupTestSharedFileFromUser, uploadThreeVersions } from './filesVersionsUtils.ts' describe('Versions on shares', () => { - const randomSharedFolderName = Math.random().toString(36).replace(/[^a-z]+/g, '').substring(0, 10) - const randomFileName = Math.random().toString(36).replace(/[^a-z]+/g, '').substring(0, 10) + '.txt' + const randomSharedFolderName = randomString(10) + const randomFileName = randomString(10) + '.txt' const randomFilePath = `${randomSharedFolderName}/${randomFileName}` let alice: User let bob: User diff --git a/cypress/e2e/login/login.cy.ts b/cypress/e2e/login/login.cy.ts index d850dce1707..09b871792e4 100644 --- a/cypress/e2e/login/login.cy.ts +++ b/cypress/e2e/login/login.cy.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' import { getNextcloudUserMenu, getNextcloudUserMenuToggle } from '../../support/commonUtils.ts' diff --git a/cypress/e2e/login/webauth.cy.ts b/cypress/e2e/login/webauth.cy.ts index fb67ed7f21c..4d8d3acc20a 100644 --- a/cypress/e2e/login/webauth.cy.ts +++ b/cypress/e2e/login/webauth.cy.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' interface IChromeVirtualAuthenticator { authenticatorId: string diff --git a/cypress/e2e/settings/access-levels.cy.ts b/cypress/e2e/settings/access-levels.cy.ts index 19df11bdea8..a940e3e145a 100644 --- a/cypress/e2e/settings/access-levels.cy.ts +++ b/cypress/e2e/settings/access-levels.cy.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import { User } from '@nextcloud/cypress' +import { User } from '@nextcloud/e2e-test-server/cypress' import { clearState, getNextcloudUserMenu, getNextcloudUserMenuToggle } from '../../support/commonUtils.ts' const admin = new User('admin', 'admin') diff --git a/cypress/e2e/settings/apps.cy.ts b/cypress/e2e/settings/apps.cy.ts index 6edce85211b..604017015b6 100644 --- a/cypress/e2e/settings/apps.cy.ts +++ b/cypress/e2e/settings/apps.cy.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import { User } from '@nextcloud/cypress' +import { User } from '@nextcloud/e2e-test-server/cypress' import { handlePasswordConfirmation } from './usersUtils.ts' const admin = new User('admin', 'admin') diff --git a/cypress/e2e/settings/personal-info.cy.ts b/cypress/e2e/settings/personal-info.cy.ts index faa04e507ae..5be6290f717 100644 --- a/cypress/e2e/settings/personal-info.cy.ts +++ b/cypress/e2e/settings/personal-info.cy.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' import { handlePasswordConfirmation } from './usersUtils.ts' diff --git a/cypress/e2e/settings/users-group-admin.cy.ts b/cypress/e2e/settings/users-group-admin.cy.ts index ee153eace53..3e9a561edc4 100644 --- a/cypress/e2e/settings/users-group-admin.cy.ts +++ b/cypress/e2e/settings/users-group-admin.cy.ts @@ -2,10 +2,9 @@ * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ -/// -import { User } from '@nextcloud/cypress' -import randomString from 'crypto-random-string' +import { User } from '@nextcloud/e2e-test-server/cypress' +import { randomString } from '../../support/utils/randomString.ts' import { getUserListRow, handlePasswordConfirmation } from './usersUtils.ts' const admin = new User('admin', 'admin') diff --git a/cypress/e2e/settings/users.cy.ts b/cypress/e2e/settings/users.cy.ts index 43bfb982924..ec4123bf77b 100644 --- a/cypress/e2e/settings/users.cy.ts +++ b/cypress/e2e/settings/users.cy.ts @@ -4,7 +4,7 @@ */ /// -import { User } from '@nextcloud/cypress' +import { User } from '@nextcloud/e2e-test-server/cypress' import { getUserListRow, handlePasswordConfirmation } from './usersUtils.ts' const admin = new User('admin', 'admin') diff --git a/cypress/e2e/settings/usersUtils.ts b/cypress/e2e/settings/usersUtils.ts index 407e1a73a33..c718fff1a19 100644 --- a/cypress/e2e/settings/usersUtils.ts +++ b/cypress/e2e/settings/usersUtils.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' /** * Assert that `element` does not exist or is not visible diff --git a/cypress/e2e/settings/users_columns.cy.ts b/cypress/e2e/settings/users_columns.cy.ts index f2f25fba410..6cac5e48bbb 100644 --- a/cypress/e2e/settings/users_columns.cy.ts +++ b/cypress/e2e/settings/users_columns.cy.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import { User } from '@nextcloud/cypress' +import { User } from '@nextcloud/e2e-test-server/cypress' import { assertNotExistOrNotVisible, getUserList } from './usersUtils.js' const admin = new User('admin', 'admin') diff --git a/cypress/e2e/settings/users_disable.cy.ts b/cypress/e2e/settings/users_disable.cy.ts index e0a6f47bdc1..23b0397aa99 100644 --- a/cypress/e2e/settings/users_disable.cy.ts +++ b/cypress/e2e/settings/users_disable.cy.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import { User } from '@nextcloud/cypress' +import { User } from '@nextcloud/e2e-test-server/cypress' import { clearState } from '../../support/commonUtils.ts' import { getUserListRow } from './usersUtils.ts' diff --git a/cypress/e2e/settings/users_groups.cy.ts b/cypress/e2e/settings/users_groups.cy.ts index 94fcc11e9ce..f4de1eb3afc 100644 --- a/cypress/e2e/settings/users_groups.cy.ts +++ b/cypress/e2e/settings/users_groups.cy.ts @@ -3,8 +3,8 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import { User } from '@nextcloud/cypress' -import randomString from 'crypto-random-string' +import { User } from '@nextcloud/e2e-test-server/cypress' +import { randomString } from '../../support/utils/randomString.ts' import { assertNotExistOrNotVisible, getUserListRow, handlePasswordConfirmation, toggleEditButton } from './usersUtils.ts' const admin = new User('admin', 'admin') @@ -16,6 +16,8 @@ describe('Settings: Create groups', () => { }) it('Can create a group', () => { + cy.intercept('POST', '**/ocs/v2.php/cloud/groups').as('createGroups') + const groupName = randomString(7) // open the Create group menu cy.get('button[aria-label="Create group"]').click() @@ -33,6 +35,7 @@ describe('Settings: Create groups', () => { // Make sure no confirmation modal is shown handlePasswordConfirmation(admin.password) + cy.wait('@createGroups').its('response.statusCode').should('eq', 200) // see that the created group is in the list cy.get('ul[data-cy-users-settings-navigation-groups="custom"]').within(() => { @@ -108,7 +111,7 @@ describe('Settings: Assign user to a group', { testIsolation: false }, () => { it('validate the user was added on backend', () => { cy.runOccCommand(`user:info --output=json '${testUser.userId}'`).then((output) => { - cy.wrap(output.code).should('eq', 0) + cy.wrap(output.exitCode).should('eq', 0) cy.wrap(JSON.parse(output.stdout)?.groups).should('include', groupName) }) }) diff --git a/cypress/e2e/settings/users_manager.cy.ts b/cypress/e2e/settings/users_manager.cy.ts index 67b18110b0e..6b4ab48b570 100644 --- a/cypress/e2e/settings/users_manager.cy.ts +++ b/cypress/e2e/settings/users_manager.cy.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import { User } from '@nextcloud/cypress' +import { User } from '@nextcloud/e2e-test-server/cypress' import { clearState } from '../../support/commonUtils.ts' import { getUserListRow, handlePasswordConfirmation, toggleEditButton, waitLoading } from './usersUtils.ts' diff --git a/cypress/e2e/settings/users_modify.cy.ts b/cypress/e2e/settings/users_modify.cy.ts index c9e1bddcebc..35ca65558dd 100644 --- a/cypress/e2e/settings/users_modify.cy.ts +++ b/cypress/e2e/settings/users_modify.cy.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import { User } from '@nextcloud/cypress' +import { User } from '@nextcloud/e2e-test-server/cypress' import { clearState } from '../../support/commonUtils.ts' import { getUserListRow, handlePasswordConfirmation, toggleEditButton, waitLoading } from './usersUtils.ts' @@ -140,7 +140,7 @@ describe('Settings: Change user properties', function() { // I see that the quota was set on the backend cy.runOccCommand(`user:info --output=json '${user.userId}'`).then(($result) => { - expect($result.code).to.equal(0) + expect($result.exitCode).to.equal(0) const info = JSON.parse($result.stdout) expect(info?.quota).to.equal('5 GB') }) @@ -176,7 +176,7 @@ describe('Settings: Change user properties', function() { // I see that the quota was set on the backend cy.runOccCommand(`user:info --output=json '${user.userId}'`).then(($result) => { - expect($result.code).to.equal(0) + expect($result.exitCode).to.equal(0) // TODO: Enable this after the file size handling is fixed!!!!!! // const info = JSON.parse($result.stdout) // expect(info?.quota).to.equal('4 MB') diff --git a/cypress/e2e/systemtags/admin-settings.cy.ts b/cypress/e2e/systemtags/admin-settings.cy.ts index d90615d2a29..75816e6cf75 100644 --- a/cypress/e2e/systemtags/admin-settings.cy.ts +++ b/cypress/e2e/systemtags/admin-settings.cy.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import { User } from '@nextcloud/cypress' +import { User } from '@nextcloud/e2e-test-server/cypress' const admin = new User('admin', 'admin') diff --git a/cypress/e2e/systemtags/files-bulk-action.cy.ts b/cypress/e2e/systemtags/files-bulk-action.cy.ts index 842d7706a57..84119badbc4 100644 --- a/cypress/e2e/systemtags/files-bulk-action.cy.ts +++ b/cypress/e2e/systemtags/files-bulk-action.cy.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' import { randomBytes } from 'crypto' import { getRowForFile, selectAllFiles, selectRowForFile, triggerSelectionAction } from '../files/FilesUtils.ts' diff --git a/cypress/e2e/systemtags/files-inline-action.cy.ts b/cypress/e2e/systemtags/files-inline-action.cy.ts index bbd9d0d8801..3d24694d514 100644 --- a/cypress/e2e/systemtags/files-inline-action.cy.ts +++ b/cypress/e2e/systemtags/files-inline-action.cy.ts @@ -2,7 +2,7 @@ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' import { randomBytes } from 'crypto' import { closeSidebar, getRowForFile, triggerActionForFile } from '../files/FilesUtils.ts' diff --git a/cypress/e2e/systemtags/files-sidebar.cy.ts b/cypress/e2e/systemtags/files-sidebar.cy.ts index 1b09bd89d58..9cb5f2df8dd 100644 --- a/cypress/e2e/systemtags/files-sidebar.cy.ts +++ b/cypress/e2e/systemtags/files-sidebar.cy.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' import { randomBytes } from 'crypto' import { getRowForFile, triggerActionForFile } from '../files/FilesUtils.ts' diff --git a/cypress/e2e/systemtags/files-view.cy.ts b/cypress/e2e/systemtags/files-view.cy.ts index 3e5630d4544..0bfc59be60f 100644 --- a/cypress/e2e/systemtags/files-view.cy.ts +++ b/cypress/e2e/systemtags/files-view.cy.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' import { randomBytes } from 'crypto' import { closeSidebar, getRowForFile, getRowForFileId, triggerActionForFile } from '../files/FilesUtils.ts' diff --git a/cypress/e2e/theming/admin-settings.cy.ts b/cypress/e2e/theming/admin-settings.cy.ts index b5f79f4471e..af14bbdb0e6 100644 --- a/cypress/e2e/theming/admin-settings.cy.ts +++ b/cypress/e2e/theming/admin-settings.cy.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import { User } from '@nextcloud/cypress' +import { User } from '@nextcloud/e2e-test-server/cypress' import { NavigationHeader } from '../../pages/NavigationHeader.ts' import { defaultBackground, diff --git a/cypress/e2e/theming/admin-settings_default-app.cy.ts b/cypress/e2e/theming/admin-settings_default-app.cy.ts index 2515274b267..cf55f449e50 100644 --- a/cypress/e2e/theming/admin-settings_default-app.cy.ts +++ b/cypress/e2e/theming/admin-settings_default-app.cy.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import { User } from '@nextcloud/cypress' +import { User } from '@nextcloud/e2e-test-server/cypress' import { NavigationHeader } from '../../pages/NavigationHeader.ts' const admin = new User('admin', 'admin') diff --git a/cypress/e2e/theming/admin-settings_urls.cy.ts b/cypress/e2e/theming/admin-settings_urls.cy.ts index 25accc56af2..2f093b36d2c 100644 --- a/cypress/e2e/theming/admin-settings_urls.cy.ts +++ b/cypress/e2e/theming/admin-settings_urls.cy.ts @@ -2,7 +2,7 @@ * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ -import { User } from '@nextcloud/cypress' +import { User } from '@nextcloud/e2e-test-server/cypress' const admin = new User('admin', 'admin') diff --git a/cypress/e2e/theming/user-settings_app-order.cy.ts b/cypress/e2e/theming/user-settings_app-order.cy.ts index 7c8a63f029b..f30f9c67ce9 100644 --- a/cypress/e2e/theming/user-settings_app-order.cy.ts +++ b/cypress/e2e/theming/user-settings_app-order.cy.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import type { User } from '@nextcloud/cypress' +import type { User } from '@nextcloud/e2e-test-server/cypress' import { NavigationHeader } from '../../pages/NavigationHeader.ts' import { installTestApp, uninstallTestApp } from '../../support/commonUtils.ts' diff --git a/cypress/e2e/theming/user-settings_background.cy.ts b/cypress/e2e/theming/user-settings_background.cy.ts index 4999cf6e955..07965ef58b0 100644 --- a/cypress/e2e/theming/user-settings_background.cy.ts +++ b/cypress/e2e/theming/user-settings_background.cy.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import { User } from '@nextcloud/cypress' +import { User } from '@nextcloud/e2e-test-server/cypress' import { NavigationHeader } from '../../pages/NavigationHeader.ts' import { defaultBackground, defaultPrimary, validateBodyThemingCss } from './themingUtils.ts' diff --git a/cypress/fixtures/app.config.php b/cypress/fixtures/app.config.php new file mode 100644 index 00000000000..162b8616f2d --- /dev/null +++ b/cypress/fixtures/app.config.php @@ -0,0 +1,20 @@ + [ + [ + 'path' => '/var/www/html/apps', + 'url' => '/apps', + 'writable' => false, + ], + [ + 'path' => '/var/www/html/apps-cypress', + 'url' => '/apps-cypress', + 'writable' => true, + ], + ], +]; diff --git a/cypress/support/commands.ts b/cypress/support/commands.ts index eb121d9cc17..0e49f08d38f 100644 --- a/cypress/support/commands.ts +++ b/cypress/support/commands.ts @@ -3,9 +3,9 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import { addCommands, User } from '@nextcloud/cypress' +import { addCommands, User } from '@nextcloud/e2e-test-server/cypress' +import { basename } from '@nextcloud/paths' import axios from 'axios' -import { basename } from 'path' // Add custom commands import '@testing-library/cypress/add-commands' @@ -18,7 +18,7 @@ Cypress.env('baseUrl', url) /** * Enable or disable a user - * TODO: standardize in @nextcloud/cypress + * TODO: standardize in @nextcloud/e2e-test-server * * @param {User} user the user to dis- / enable * @param {boolean} enable True if the user should be enable, false to disable @@ -45,7 +45,7 @@ Cypress.Commands.add('enableUser', (user: User, enable = true) => { /** * cy.uploadedFile - uploads a file from the fixtures folder - * TODO: standardize in @nextcloud/cypress + * TODO: standardize in @nextcloud/e2e-test-server * * @param {User} user the owner of the file, e.g. admin * @param {string} fixture the fixture file name, e.g. image1.jpg @@ -142,7 +142,7 @@ Cypress.Commands.add('rm', (user: User, target: string) => { /** * cy.uploadedContent - uploads a raw content - * TODO: standardize in @nextcloud/cypress + * TODO: standardize in @nextcloud/e2e-test-server * * @param {User} user the owner of the file, e.g. admin * @param {Blob} blob the content to upload diff --git a/cypress/support/commonUtils.ts b/cypress/support/commonUtils.ts index 89e9fb22043..6364f9eab62 100644 --- a/cypress/support/commonUtils.ts +++ b/cypress/support/commonUtils.ts @@ -3,8 +3,6 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import { basename } from 'path' - /** * Get the header navigation bar */ @@ -49,14 +47,14 @@ export function clearState() { export function installTestApp() { const testAppPath = 'cypress/fixtures/testapp' cy.runOccCommand('-V').then((output) => { + // @ts-expect-error we added this property in cypress.config.ts + const containerName = Cypress.config('dockerContainerName') const version = output.stdout.match(/(\d\d+)\.\d+\.\d+/)?.[1] cy.wrap(version).should('not.be.undefined') - getContainerName() - .then((containerName) => { - cy.exec(`docker cp '${testAppPath}' ${containerName}:/var/www/html/apps`, { log: true }) - cy.exec(`docker exec --workdir /var/www/html ${containerName} chown -R www-data:www-data /var/www/html/apps/testapp`) - }) - cy.runCommand(`sed -i -e 's|-version=\\"[0-9]\\+|-version=\\"${version}|g' apps/testapp/appinfo/info.xml`) + + cy.exec(`docker cp '${testAppPath}' ${containerName}:/var/www/html/apps-cypress`, { log: true }) + cy.exec(`docker exec --workdir /var/www/html ${containerName} chown -R www-data:www-data /var/www/html/apps-cypress/testapp`) + cy.runCommand(`sed -i -e 's|-version=\\"[0-9]\\+|-version=\\"${version}|g' apps-cypress/testapp/appinfo/info.xml`) cy.runOccCommand('app:enable --force testapp') }) } @@ -66,15 +64,5 @@ export function installTestApp() { */ export function uninstallTestApp() { cy.runOccCommand('app:remove testapp', { failOnNonZeroExit: false }) - cy.runCommand('rm -fr apps/testapp/appinfo/info.xml') -} - -/** - * - */ -export function getContainerName(): Cypress.Chainable { - return cy.exec('pwd') - .then(({ stdout }) => { - return cy.wrap(`nextcloud-cypress-tests_${basename(stdout).replace(' ', '')}`) - }) + cy.runCommand('rm -fr apps-cypress/testapp') } diff --git a/cypress/support/utils/deleteDownloadsFolder.ts b/cypress/support/utils/deleteDownloadsFolder.ts new file mode 100644 index 00000000000..452b89464ea --- /dev/null +++ b/cypress/support/utils/deleteDownloadsFolder.ts @@ -0,0 +1,11 @@ +/*! + * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +/** + * Ensure the downloads folder is deleted before each test + */ +export function deleteDownloadsFolderBeforeEach() { + beforeEach(() => cy.task('deleteFolder', Cypress.config('downloadsFolder'))) +} diff --git a/cypress/support/utils/randomString.ts b/cypress/support/utils/randomString.ts new file mode 100644 index 00000000000..120ebc04833 --- /dev/null +++ b/cypress/support/utils/randomString.ts @@ -0,0 +1,19 @@ +/*! + * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +export function randomString(length: number) { + const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' + const alphaNumeric = characters + '0123456789' + let result = '' + for (let i = 0; i < length; i++) { + // Ensure the first character is alphabetic + if (i === 0) { + result += characters.charAt(Math.floor(Math.random() * characters.length)) + continue + } + result += alphaNumeric.charAt(Math.floor(Math.random() * alphaNumeric.length)) + } + return result +} diff --git a/package-lock.json b/package-lock.json index 217605079fe..bf2a95c8e98 100644 --- a/package-lock.json +++ b/package-lock.json @@ -92,9 +92,8 @@ "@babel/plugin-transform-private-methods": "^7.27.1", "@babel/preset-typescript": "^7.27.1", "@codecov/webpack-plugin": "^1.9.1", - "@cypress/webpack-preprocessor": "^7.0.0", "@nextcloud/babel-config": "^1.2.0", - "@nextcloud/cypress": "^1.0.0-beta.15", + "@nextcloud/e2e-test-server": "^0.4.0", "@nextcloud/eslint-config": "^9.0.0-rc.5", "@nextcloud/stylelint-config": "^3.1.0", "@nextcloud/typings": "^1.9.1", @@ -115,15 +114,15 @@ "babel-plugin-module-resolver": "^5.0.2", "browserslist": "^4.26.3", "colord": "^2.9.3", - "cypress": "^13.17.0", + "cypress": "^15.5.0", "cypress-axe": "^1.7.0", - "cypress-delete-downloads-folder": "^0.0.6", "cypress-if": "^1.13.2", - "cypress-split": "^1.24.24", + "cypress-split": "^1.24.25", + "cypress-vite": "^1.8.0", "cypress-wait-until": "^3.0.2", "dockerode": "^4.0.9", "eslint": "^9.36.0", - "eslint-plugin-cypress": "^5.1.1", + "eslint-plugin-cypress": "^5.2.0", "eslint-plugin-no-only-tests": "^3.3.0", "exports-loader": "^5.0.0", "file-loader": "^6.2.0", @@ -137,7 +136,6 @@ "sass": "^1.93.2", "stylelint": "^16.24.0", "stylelint-use-logical": "^2.1.2", - "tar": "^7.5.1", "ts-node": "^10.9.2", "tslib": "^2.8.1", "typescript": "^5.9.2", @@ -2036,17 +2034,6 @@ "webpack": "5.x" } }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -2278,38 +2265,6 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/@cypress/webpack-preprocessor": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@cypress/webpack-preprocessor/-/webpack-preprocessor-7.0.1.tgz", - "integrity": "sha512-3PnuoT+9N/7Hnx5THgbXitKDXsjO7/G83JIBSJhzjLTyoE90LnDkWqhrhhjNFmWdqlelDTpnMtFk7TPHCPWzoQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "bluebird": "3.7.1", - "debug": "^4.3.4", - "lodash": "^4.17.20", - "semver": "^7.3.2" - }, - "peerDependencies": { - "@babel/core": "^7.28.0", - "@babel/preset-env": "^7.26.0", - "babel-loader": "^9 || ^10", - "webpack": "^5" - } - }, - "node_modules/@cypress/webpack-preprocessor/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@cypress/xvfb": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", @@ -2336,6 +2291,7 @@ "resolved": "https://registry.npmjs.org/@dependents/detective-less/-/detective-less-5.0.1.tgz", "integrity": "sha512-Y6+WUMsTFWE5jb20IFP4YGa5IrGY/+a/FbOSjDF/wz9gepU2hwCYSXRHP/vPwBvwcY3SVMASt4yXxbXNXigmZQ==", "dev": true, + "license": "MIT", "dependencies": { "gonzales-pe": "^4.3.0", "node-source-walk": "^7.0.1" @@ -2383,9 +2339,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", - "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.11.tgz", + "integrity": "sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==", "cpu": [ "ppc64" ], @@ -2399,9 +2355,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", - "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.11.tgz", + "integrity": "sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==", "cpu": [ "arm" ], @@ -2415,9 +2371,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", - "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.11.tgz", + "integrity": "sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==", "cpu": [ "arm64" ], @@ -2431,9 +2387,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", - "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.11.tgz", + "integrity": "sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==", "cpu": [ "x64" ], @@ -2447,9 +2403,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", - "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.11.tgz", + "integrity": "sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==", "cpu": [ "arm64" ], @@ -2463,9 +2419,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", - "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.11.tgz", + "integrity": "sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==", "cpu": [ "x64" ], @@ -2479,9 +2435,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", - "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.11.tgz", + "integrity": "sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==", "cpu": [ "arm64" ], @@ -2495,9 +2451,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", - "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.11.tgz", + "integrity": "sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==", "cpu": [ "x64" ], @@ -2511,9 +2467,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", - "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.11.tgz", + "integrity": "sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==", "cpu": [ "arm" ], @@ -2527,9 +2483,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", - "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.11.tgz", + "integrity": "sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==", "cpu": [ "arm64" ], @@ -2543,9 +2499,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", - "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.11.tgz", + "integrity": "sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==", "cpu": [ "ia32" ], @@ -2559,9 +2515,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", - "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.11.tgz", + "integrity": "sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==", "cpu": [ "loong64" ], @@ -2575,9 +2531,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", - "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.11.tgz", + "integrity": "sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==", "cpu": [ "mips64el" ], @@ -2591,9 +2547,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", - "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.11.tgz", + "integrity": "sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==", "cpu": [ "ppc64" ], @@ -2607,9 +2563,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", - "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.11.tgz", + "integrity": "sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==", "cpu": [ "riscv64" ], @@ -2623,9 +2579,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", - "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.11.tgz", + "integrity": "sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==", "cpu": [ "s390x" ], @@ -2639,9 +2595,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", - "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.11.tgz", + "integrity": "sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==", "cpu": [ "x64" ], @@ -2655,9 +2611,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", - "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.11.tgz", + "integrity": "sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==", "cpu": [ "arm64" ], @@ -2671,9 +2627,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", - "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.11.tgz", + "integrity": "sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==", "cpu": [ "x64" ], @@ -2687,9 +2643,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", - "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.11.tgz", + "integrity": "sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==", "cpu": [ "arm64" ], @@ -2703,9 +2659,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", - "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.11.tgz", + "integrity": "sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==", "cpu": [ "x64" ], @@ -2719,9 +2675,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", - "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.11.tgz", + "integrity": "sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==", "cpu": [ "arm64" ], @@ -2735,9 +2691,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", - "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.11.tgz", + "integrity": "sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==", "cpu": [ "x64" ], @@ -2751,9 +2707,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", - "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.11.tgz", + "integrity": "sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==", "cpu": [ "arm64" ], @@ -2767,9 +2723,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", - "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.11.tgz", + "integrity": "sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==", "cpu": [ "ia32" ], @@ -2783,9 +2739,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", - "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.11.tgz", + "integrity": "sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==", "cpu": [ "x64" ], @@ -3128,6 +3084,33 @@ "node": ">=6" } }, + "node_modules/@hapi/address": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-5.1.1.tgz", + "integrity": "sha512-A+po2d/dVoY7cYajycYI43ZbYMXukuopIsqCjh5QzsBCipDtdofHntljDlpccMjIfTy6UOkg+5KPriwYch2bXA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^11.0.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@hapi/address/node_modules/@hapi/hoek": { + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.7.tgz", + "integrity": "sha512-HV5undWkKzcB4RZUusqOpcgxOaq6VOAH7zhhIr2g3G8NF/MlFO75SjOr2NfuSx0Mh40+1FqCkagKLJRykUWoFQ==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/formula": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@hapi/formula/-/formula-3.0.2.tgz", + "integrity": "sha512-hY5YPNXzw1He7s0iqkRQi+uMGh383CGdyyIGYtB+W5N3KHPXoqychklvHhKCC9M3Xtv0OCs/IHw+r4dcHtBYWw==", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", @@ -3135,6 +3118,23 @@ "dev": true, "license": "BSD-3-Clause" }, + "node_modules/@hapi/pinpoint": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@hapi/pinpoint/-/pinpoint-2.0.1.tgz", + "integrity": "sha512-EKQmr16tM8s16vTT3cA5L0kZZcTMU5DUOZTuvpnY738m+jyP3JIUj+Mm1xc1rsLkGBQ/gVnfKYPwOmPg1tUR4Q==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/tlds": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@hapi/tlds/-/tlds-1.1.3.tgz", + "integrity": "sha512-QIvUMB5VZ8HMLZF9A2oWr3AFM430QC8oGd0L35y2jHpuW6bIIca6x/xL7zUf4J7L9WJ3qjz+iJII8ncaeMbpSg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@hapi/topo": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", @@ -3416,29 +3416,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@isaacs/fs-minipass": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", - "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.4" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@isaacs/fs-minipass/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", @@ -3832,25 +3809,6 @@ "npm": "^10.0.0" } }, - "node_modules/@nextcloud/cypress": { - "version": "1.0.0-beta.15", - "resolved": "https://registry.npmjs.org/@nextcloud/cypress/-/cypress-1.0.0-beta.15.tgz", - "integrity": "sha512-0pTweoFmw9x0J2R1Ou+ycIw8aGuJGTrbudaorl4vFXUEDEIo4GAx136RzH1TzYkRn1zPxDloFi2qmHh54NMdng==", - "dev": true, - "license": "AGPL-3.0-or-later", - "dependencies": { - "dockerode": "^4.0.2", - "fast-xml-parser": "^5.2.2", - "wait-on": "^8.0.0" - }, - "engines": { - "node": "^20.0.0", - "npm": "^10.0.0" - }, - "peerDependencies": { - "cypress": "^13.9.0" - } - }, "node_modules/@nextcloud/dialogs": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/@nextcloud/dialogs/-/dialogs-7.1.0.tgz", @@ -4171,6 +4129,78 @@ "vue": "3.x" } }, + "node_modules/@nextcloud/e2e-test-server": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@nextcloud/e2e-test-server/-/e2e-test-server-0.4.0.tgz", + "integrity": "sha512-nKdLXOn4TY9+Z/dE4AKDsk6Fhp6xm5gUIFx4gW5z4Ivrp/nl7iGun5zDmbyjW7mHF55orqVxNl8GBHzVDTd0Sg==", + "dev": true, + "license": "AGPL-3.0-or-later", + "dependencies": { + "@nextcloud/paths": "^2.2.1", + "dockerode": "^4.0.2", + "fast-xml-parser": "^5.2.2", + "wait-on": "^9.0.1" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || ^24.0.0" + } + }, + "node_modules/@nextcloud/e2e-test-server/node_modules/@hapi/hoek": { + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.7.tgz", + "integrity": "sha512-HV5undWkKzcB4RZUusqOpcgxOaq6VOAH7zhhIr2g3G8NF/MlFO75SjOr2NfuSx0Mh40+1FqCkagKLJRykUWoFQ==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@nextcloud/e2e-test-server/node_modules/@hapi/topo": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-6.0.2.tgz", + "integrity": "sha512-KR3rD5inZbGMrHmgPxsJ9dbi6zEK+C3ZwUwTa+eMwWLz7oijWUTWD2pMSNNYJAU6Qq+65NkxXjqHr/7LM2Xkqg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^11.0.2" + } + }, + "node_modules/@nextcloud/e2e-test-server/node_modules/joi": { + "version": "18.0.1", + "resolved": "https://registry.npmjs.org/joi/-/joi-18.0.1.tgz", + "integrity": "sha512-IiQpRyypSnLisQf3PwuN2eIHAsAIGZIrLZkd4zdvIar2bDyhM91ubRjy8a3eYablXsh9BeI/c7dmPYHca5qtoA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/address": "^5.1.1", + "@hapi/formula": "^3.0.2", + "@hapi/hoek": "^11.0.7", + "@hapi/pinpoint": "^2.0.1", + "@hapi/tlds": "^1.1.1", + "@hapi/topo": "^6.0.2", + "@standard-schema/spec": "^1.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@nextcloud/e2e-test-server/node_modules/wait-on": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-9.0.1.tgz", + "integrity": "sha512-noeCAI+XbqWMXY23sKril0BSURhuLYarkVXwJv1uUWwoojZJE7pmX3vJ7kh7SZaNgPGzfsCSQIZM/AGvu0Q9pA==", + "dev": true, + "license": "MIT", + "dependencies": { + "axios": "^1.12.2", + "joi": "^18.0.1", + "lodash": "^4.17.21", + "minimist": "^1.2.8", + "rxjs": "^7.8.2" + }, + "bin": { + "wait-on": "bin/wait-on" + }, + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/@nextcloud/eslint-config": { "version": "9.0.0-rc.5", "resolved": "https://registry.npmjs.org/@nextcloud/eslint-config/-/eslint-config-9.0.0-rc.5.tgz", @@ -6087,6 +6117,13 @@ "resolved": "https://registry.npmjs.org/@simplewebauthn/browser/-/browser-13.2.0.tgz", "integrity": "sha512-N3fuA1AAnTo5gCStYoIoiasPccC+xPLx2YU88Dv0GeAmPQTWHETlZQq5xZ0DgUq1H9loXMWQH5qqUjcI7BHJ1A==" }, + "node_modules/@standard-schema/spec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", + "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "dev": true, + "license": "MIT" + }, "node_modules/@stylistic/eslint-plugin": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.4.0.tgz", @@ -6722,6 +6759,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/tmp": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.2.6.tgz", + "integrity": "sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/toastify-js": { "version": "1.12.4", "resolved": "https://registry.npmjs.org/@types/toastify-js/-/toastify-js-1.12.4.tgz", @@ -8116,7 +8160,6 @@ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -8129,7 +8172,8 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/app-module-path/-/app-module-path-2.2.0.tgz", "integrity": "sha512-gkco+qxENJV+8vFcDiiFhuoSvRXb2a/QPqpSoWhVz829VNJfOTnELbBmPmNKFxf3xdNnw4DWCkzkDaavcX/1YQ==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/arch": { "version": "2.2.0", @@ -8166,7 +8210,8 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/argparse": { "version": "2.0.1", @@ -8339,6 +8384,7 @@ "resolved": "https://registry.npmjs.org/ast-module-types/-/ast-module-types-6.0.1.tgz", "integrity": "sha512-WHw67kLXYbZuHTmcdbIrVArCq5wxo6NEuj3hiYAWr8mwJeC+C2mMCIBIWCiDoCye/OF/xelc+teJ1ERoWmnEIA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" } @@ -8671,7 +8717,6 @@ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" }, @@ -9343,23 +9388,12 @@ "node": ">= 16" } }, - "node_modules/check-more-types": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", - "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -9385,7 +9419,6 @@ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -9393,16 +9426,6 @@ "node": ">= 6" } }, - "node_modules/chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, "node_modules/chrome-trace-event": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", @@ -9472,9 +9495,9 @@ } }, "node_modules/cli-table3": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", - "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.1.tgz", + "integrity": "sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==", "dev": true, "license": "MIT", "dependencies": { @@ -9484,7 +9507,7 @@ "node": "10.* || >= 12.*" }, "optionalDependencies": { - "@colors/colors": "1.5.0" + "colors": "1.4.0" } }, "node_modules/cli-truncate": { @@ -9650,6 +9673,17 @@ "dev": true, "license": "MIT" }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -9847,6 +9881,7 @@ "resolved": "https://registry.npmjs.org/console.table/-/console.table-0.10.0.tgz", "integrity": "sha512-dPyZofqggxuvSf7WXvNjuRfnsOk1YazkVP8FdxH4tcH2c37wc79/Yl6Bhr7Lsu00KMgy2ql/qCMuNu8xctZM8g==", "dev": true, + "license": "MIT", "dependencies": { "easy-table": "1.1.0" }, @@ -9859,6 +9894,7 @@ "resolved": "https://registry.npmjs.org/easy-table/-/easy-table-1.1.0.tgz", "integrity": "sha512-oq33hWOSSnl2Hoh00tZWaIPi1ievrD9aFG82/IgjlycAnW9hHx5PkJiXpxPsgEE+H7BsbVQXFVFST8TEXS6/pA==", "dev": true, + "license": "MIT", "optionalDependencies": { "wcwidth": ">=1.0.1" } @@ -10244,27 +10280,27 @@ "license": "MIT" }, "node_modules/cypress": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.17.0.tgz", - "integrity": "sha512-5xWkaPurwkIljojFidhw8lFScyxhtiFHl/i/3zov+1Z5CmY4t9tjIdvSXfu82Y3w7wt0uR9KkucbhkVvJZLQSA==", + "version": "15.5.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-15.5.0.tgz", + "integrity": "sha512-7jXBsh5hTfjxr9QQONC2IbdTj0nxSyU8x4eiarMZBzXzCj3pedKviUx8JnLcE4vL8e0TsOzp70WSLRORjEssRA==", "dev": true, "hasInstallScript": true, "license": "MIT", "dependencies": { - "@cypress/request": "^3.0.6", + "@cypress/request": "^3.0.9", "@cypress/xvfb": "^1.2.4", "@types/sinonjs__fake-timers": "8.1.1", "@types/sizzle": "^2.3.2", + "@types/tmp": "^0.2.3", "arch": "^2.2.0", "blob-util": "^2.0.2", "bluebird": "^3.7.2", "buffer": "^5.7.1", "cachedir": "^2.3.0", "chalk": "^4.1.0", - "check-more-types": "^2.24.0", - "ci-info": "^4.0.0", + "ci-info": "^4.1.0", "cli-cursor": "^3.1.0", - "cli-table3": "~0.6.1", + "cli-table3": "0.6.1", "commander": "^6.2.1", "common-tags": "^1.8.0", "dayjs": "^1.10.4", @@ -10276,9 +10312,8 @@ "extract-zip": "2.0.1", "figures": "^3.2.0", "fs-extra": "^9.1.0", - "getos": "^3.2.1", + "hasha": "5.2.2", "is-installed-globally": "~0.4.0", - "lazy-ass": "^1.6.0", "listr2": "^3.8.3", "lodash": "^4.17.21", "log-symbols": "^4.0.0", @@ -10288,9 +10323,10 @@ "process": "^0.11.10", "proxy-from-env": "1.0.0", "request-progress": "^3.0.0", - "semver": "^7.5.3", + "semver": "^7.7.1", "supports-color": "^8.1.1", - "tmp": "~0.2.3", + "systeminformation": "5.27.7", + "tmp": "~0.2.4", "tree-kill": "1.2.2", "untildify": "^4.0.0", "yauzl": "^2.10.0" @@ -10299,7 +10335,7 @@ "cypress": "bin/cypress" }, "engines": { - "node": "^16.0.0 || ^18.0.0 || >=20.0.0" + "node": "^20.1.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/cypress-axe": { @@ -10315,13 +10351,6 @@ "cypress": "^10 || ^11 || ^12 || ^13 || ^14 || ^15" } }, - "node_modules/cypress-delete-downloads-folder": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/cypress-delete-downloads-folder/-/cypress-delete-downloads-folder-0.0.6.tgz", - "integrity": "sha512-oKMhBM/O74a3XWCrMdFrv3iWMK/UAOdYX8PU/ZUGLaRjmC0p/XWFrMRJZFAYo7owpip3jvmf+bkm82cV0RJhAw==", - "dev": true, - "license": "MIT" - }, "node_modules/cypress-if": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/cypress-if/-/cypress-if-1.13.2.tgz", @@ -10333,17 +10362,18 @@ } }, "node_modules/cypress-split": { - "version": "1.24.24", - "resolved": "https://registry.npmjs.org/cypress-split/-/cypress-split-1.24.24.tgz", - "integrity": "sha512-T/wUJrWt1ssVr0VzVbqrLQZSsowIQHkD76MCL5/34v7TL5kIKT7bbiFsRdRMZ3aSGjImx/ZBPZUOztIUe6vJyw==", + "version": "1.24.25", + "resolved": "https://registry.npmjs.org/cypress-split/-/cypress-split-1.24.25.tgz", + "integrity": "sha512-LsL1QbtKkFKZEkE9mDU2JHYELVdbYW/uCf9AAxSYuc3tfpGovv/ShadOCZo53pcS9GdNdQlSyncXp/E2ukgehg==", "dev": true, + "license": "MIT", "dependencies": { "@actions/core": "^1.10.0", "arg": "^5.0.2", "console.table": "^0.10.0", "debug": "^4.3.4", "fast-shuffle": "^6.1.0", - "find-cypress-specs": "1.54.7", + "find-cypress-specs": "1.54.8", "globby": "^11.1.0", "humanize-duration": "^3.28.0" }, @@ -10352,6 +10382,20 @@ "cypress-split-preview": "bin/preview.js" } }, + "node_modules/cypress-vite": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/cypress-vite/-/cypress-vite-1.8.0.tgz", + "integrity": "sha512-rPkIpDzCIo+upsDkFa/NlrnzVumuQ45UcwL7a2k/n8WFIwsW8QYuQaWU2JiIKExP/LNQew3H3Hbs/bp26xC0Fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.5.3", + "debug": "^4.3.4" + }, + "peerDependencies": { + "vite": "^2.9.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, "node_modules/cypress-wait-until": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/cypress-wait-until/-/cypress-wait-until-3.0.2.tgz", @@ -10785,6 +10829,7 @@ "resolved": "https://registry.npmjs.org/dependency-tree/-/dependency-tree-11.2.0.tgz", "integrity": "sha512-+C1H3mXhcvMCeu5i2Jpg9dc0N29TWTuT6vJD7mHLAfVmAbo9zW8NlkvQ1tYd3PDMab0IRQM0ccoyX68EZtx9xw==", "dev": true, + "license": "MIT", "dependencies": { "commander": "^12.1.0", "filing-cabinet": "^5.0.3", @@ -10803,6 +10848,7 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" } @@ -10897,6 +10943,7 @@ "resolved": "https://registry.npmjs.org/detective-amd/-/detective-amd-6.0.1.tgz", "integrity": "sha512-TtyZ3OhwUoEEIhTFoc1C9IyJIud3y+xYkSRjmvCt65+ycQuc3VcBrPRTMWoO/AnuCyOB8T5gky+xf7Igxtjd3g==", "dev": true, + "license": "MIT", "dependencies": { "ast-module-types": "^6.0.1", "escodegen": "^2.1.0", @@ -10915,6 +10962,7 @@ "resolved": "https://registry.npmjs.org/detective-cjs/-/detective-cjs-6.0.1.tgz", "integrity": "sha512-tLTQsWvd2WMcmn/60T2inEJNhJoi7a//PQ7DwRKEj1yEeiQs4mrONgsUtEJKnZmrGWBBmE0kJ1vqOG/NAxwaJw==", "dev": true, + "license": "MIT", "dependencies": { "ast-module-types": "^6.0.1", "node-source-walk": "^7.0.1" @@ -10928,6 +10976,7 @@ "resolved": "https://registry.npmjs.org/detective-es6/-/detective-es6-5.0.1.tgz", "integrity": "sha512-XusTPuewnSUdoxRSx8OOI6xIA/uld/wMQwYsouvFN2LAg7HgP06NF1lHRV3x6BZxyL2Kkoih4ewcq8hcbGtwew==", "dev": true, + "license": "MIT", "dependencies": { "node-source-walk": "^7.0.1" }, @@ -10940,6 +10989,7 @@ "resolved": "https://registry.npmjs.org/detective-postcss/-/detective-postcss-7.0.1.tgz", "integrity": "sha512-bEOVpHU9picRZux5XnwGsmCN4+8oZo7vSW0O0/Enq/TO5R2pIAP2279NsszpJR7ocnQt4WXU0+nnh/0JuK4KHQ==", "dev": true, + "license": "MIT", "dependencies": { "is-url": "^1.2.4", "postcss-values-parser": "^6.0.2" @@ -10956,6 +11006,7 @@ "resolved": "https://registry.npmjs.org/detective-sass/-/detective-sass-6.0.1.tgz", "integrity": "sha512-jSGPO8QDy7K7pztUmGC6aiHkexBQT4GIH+mBAL9ZyBmnUIOFbkfZnO8wPRRJFP/QP83irObgsZHCoDHZ173tRw==", "dev": true, + "license": "MIT", "dependencies": { "gonzales-pe": "^4.3.0", "node-source-walk": "^7.0.1" @@ -10969,6 +11020,7 @@ "resolved": "https://registry.npmjs.org/detective-scss/-/detective-scss-5.0.1.tgz", "integrity": "sha512-MAyPYRgS6DCiS6n6AoSBJXLGVOydsr9huwXORUlJ37K3YLyiN0vYHpzs3AdJOgHobBfispokoqrEon9rbmKacg==", "dev": true, + "license": "MIT", "dependencies": { "gonzales-pe": "^4.3.0", "node-source-walk": "^7.0.1" @@ -10982,6 +11034,7 @@ "resolved": "https://registry.npmjs.org/detective-stylus/-/detective-stylus-5.0.1.tgz", "integrity": "sha512-Dgn0bUqdGbE3oZJ+WCKf8Dmu7VWLcmRJGc6RCzBgG31DLIyai9WAoEhYRgIHpt/BCRMrnXLbGWGPQuBUrnF0TA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" } @@ -10991,6 +11044,7 @@ "resolved": "https://registry.npmjs.org/detective-typescript/-/detective-typescript-14.0.0.tgz", "integrity": "sha512-pgN43/80MmWVSEi5LUuiVvO/0a9ss5V7fwVfrJ4QzAQRd3cwqU1SfWGXJFcNKUqoD5cS+uIovhw5t/0rSeC5Mw==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/typescript-estree": "^8.23.0", "ast-module-types": "^6.0.1", @@ -11008,6 +11062,7 @@ "resolved": "https://registry.npmjs.org/detective-vue2/-/detective-vue2-2.2.0.tgz", "integrity": "sha512-sVg/t6O2z1zna8a/UIV6xL5KUa2cMTQbdTIIvqNM0NIPswp52fe43Nwmbahzj3ww4D844u/vC2PYfiGLvD3zFA==", "dev": true, + "license": "MIT", "dependencies": { "@dependents/detective-less": "^5.0.1", "@vue/compiler-sfc": "^3.5.13", @@ -11713,9 +11768,9 @@ } }, "node_modules/esbuild": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", - "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.11.tgz", + "integrity": "sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==", "hasInstallScript": true, "license": "MIT", "bin": { @@ -11725,32 +11780,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.9", - "@esbuild/android-arm": "0.25.9", - "@esbuild/android-arm64": "0.25.9", - "@esbuild/android-x64": "0.25.9", - "@esbuild/darwin-arm64": "0.25.9", - "@esbuild/darwin-x64": "0.25.9", - "@esbuild/freebsd-arm64": "0.25.9", - "@esbuild/freebsd-x64": "0.25.9", - "@esbuild/linux-arm": "0.25.9", - "@esbuild/linux-arm64": "0.25.9", - "@esbuild/linux-ia32": "0.25.9", - "@esbuild/linux-loong64": "0.25.9", - "@esbuild/linux-mips64el": "0.25.9", - "@esbuild/linux-ppc64": "0.25.9", - "@esbuild/linux-riscv64": "0.25.9", - "@esbuild/linux-s390x": "0.25.9", - "@esbuild/linux-x64": "0.25.9", - "@esbuild/netbsd-arm64": "0.25.9", - "@esbuild/netbsd-x64": "0.25.9", - "@esbuild/openbsd-arm64": "0.25.9", - "@esbuild/openbsd-x64": "0.25.9", - "@esbuild/openharmony-arm64": "0.25.9", - "@esbuild/sunos-x64": "0.25.9", - "@esbuild/win32-arm64": "0.25.9", - "@esbuild/win32-ia32": "0.25.9", - "@esbuild/win32-x64": "0.25.9" + "@esbuild/aix-ppc64": "0.25.11", + "@esbuild/android-arm": "0.25.11", + "@esbuild/android-arm64": "0.25.11", + "@esbuild/android-x64": "0.25.11", + "@esbuild/darwin-arm64": "0.25.11", + "@esbuild/darwin-x64": "0.25.11", + "@esbuild/freebsd-arm64": "0.25.11", + "@esbuild/freebsd-x64": "0.25.11", + "@esbuild/linux-arm": "0.25.11", + "@esbuild/linux-arm64": "0.25.11", + "@esbuild/linux-ia32": "0.25.11", + "@esbuild/linux-loong64": "0.25.11", + "@esbuild/linux-mips64el": "0.25.11", + "@esbuild/linux-ppc64": "0.25.11", + "@esbuild/linux-riscv64": "0.25.11", + "@esbuild/linux-s390x": "0.25.11", + "@esbuild/linux-x64": "0.25.11", + "@esbuild/netbsd-arm64": "0.25.11", + "@esbuild/netbsd-x64": "0.25.11", + "@esbuild/openbsd-arm64": "0.25.11", + "@esbuild/openbsd-x64": "0.25.11", + "@esbuild/openharmony-arm64": "0.25.11", + "@esbuild/sunos-x64": "0.25.11", + "@esbuild/win32-arm64": "0.25.11", + "@esbuild/win32-ia32": "0.25.11", + "@esbuild/win32-x64": "0.25.11" } }, "node_modules/escalade": { @@ -11783,6 +11838,7 @@ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", @@ -11804,6 +11860,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -11899,9 +11956,9 @@ } }, "node_modules/eslint-plugin-cypress": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-5.1.1.tgz", - "integrity": "sha512-LxTmZf1LLh9EklZBVvKNEZj71X9tCJnlYDviAJGsOgEVc6jz+tBODSpm02CS/9eJOfRqGsmVyvIw7LHXQ13RaA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-5.2.0.tgz", + "integrity": "sha512-vuCUBQloUSILxtJrUWV39vNIQPlbg0L7cTunEAzvaUzv9LFZZym+KFLH18n9j2cZuFPdlxOqTubCvg5se0DyGw==", "dev": true, "license": "MIT", "dependencies": { @@ -12149,6 +12206,7 @@ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, + "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -12820,6 +12878,7 @@ "resolved": "https://registry.npmjs.org/filing-cabinet/-/filing-cabinet-5.0.3.tgz", "integrity": "sha512-PlPcMwVWg60NQkhvfoxZs4wEHjhlOO/y7OAm4sKM60o1Z9nttRY4mcdQxp/iZ+kg/Vv6Hw1OAaTbYVM9DA9pYg==", "dev": true, + "license": "MIT", "dependencies": { "app-module-path": "^2.2.0", "commander": "^12.1.0", @@ -12845,6 +12904,7 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" } @@ -12900,16 +12960,17 @@ } }, "node_modules/find-cypress-specs": { - "version": "1.54.7", - "resolved": "https://registry.npmjs.org/find-cypress-specs/-/find-cypress-specs-1.54.7.tgz", - "integrity": "sha512-98JCtoXwKFK6smjHBbj7mlwUMMuUXUFgomafArBKt7AzzbtSxqqOc0KT9tRtror8D09TnTFCIsiRe0NvwcX2CQ==", + "version": "1.54.8", + "resolved": "https://registry.npmjs.org/find-cypress-specs/-/find-cypress-specs-1.54.8.tgz", + "integrity": "sha512-SrYhCx2/+fgEIfhoxBMp+NO2xTtXosevNrUhK9MpTYiUCrJTGgPePhCgIgeb6abPxfLe2RSD00Rlz38aoBySIg==", "dev": true, + "license": "MIT", "dependencies": { "@actions/core": "^1.10.0", "arg": "^5.0.1", "console.table": "^0.10.0", "debug": "^4.3.3", - "find-test-names": "1.29.18", + "find-test-names": "1.29.19", "minimatch": "^5.1.4", "pluralize": "^8.0.0", "require-and-forget": "^1.0.1", @@ -12930,6 +12991,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -12938,17 +13000,18 @@ } }, "node_modules/find-test-names": { - "version": "1.29.18", - "resolved": "https://registry.npmjs.org/find-test-names/-/find-test-names-1.29.18.tgz", - "integrity": "sha512-PmM4NQiyVVuM2t0FFoCDiliMppVYtIKFIEK1S2E9n+STDG/cpyXiKq5s2XQdF7AnQBeUftBdH5iEs3FUAgjfKA==", + "version": "1.29.19", + "resolved": "https://registry.npmjs.org/find-test-names/-/find-test-names-1.29.19.tgz", + "integrity": "sha512-fSO2GXgOU6dH+FdffmRXYN/kLdnd8zkBGIZrKsmAdfLSFUUDLpDFF7+F/h+wjmjDWQmMgD8hPfJZR+igiEUQHQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/parser": "^7.27.2", "@babel/plugin-syntax-jsx": "^7.27.1", "acorn-walk": "^8.2.0", "debug": "^4.3.3", - "globby": "^11.0.4", - "simple-bin-help": "^1.8.0" + "simple-bin-help": "^1.8.0", + "tinyglobby": "^0.2.13" }, "bin": { "find-test-names": "bin/find-test-names.js", @@ -13264,6 +13327,7 @@ "resolved": "https://registry.npmjs.org/get-amd-module-type/-/get-amd-module-type-6.0.1.tgz", "integrity": "sha512-MtjsmYiCXcYDDrGqtNbeIYdAl85n+5mSv2r3FbzER/YV3ZILw4HNNIw34HuV5pyl0jzs6GFYU1VHVEefhgcNHQ==", "dev": true, + "license": "MIT", "dependencies": { "ast-module-types": "^6.0.1", "node-source-walk": "^7.0.1" @@ -13372,16 +13436,6 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "node_modules/getos": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", - "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "async": "^3.2.0" - } - }, "node_modules/getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -13584,6 +13638,7 @@ "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.3.0.tgz", "integrity": "sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.5" }, @@ -13820,6 +13875,23 @@ "minimalistic-assert": "^1.0.1" } }, + "node_modules/hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -14667,7 +14739,6 @@ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -15230,13 +15301,15 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-url-superb": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-url-superb/-/is-url-superb-4.0.0.tgz", "integrity": "sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -15888,9 +15961,9 @@ "license": "MIT" }, "node_modules/lazy-ass": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", - "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-2.0.3.tgz", + "integrity": "sha512-/O3/DoQmI1XAhklDvF1dAjFf/epE8u3lzOZegQfLZ8G7Ud5bTRSZiFOpukHCu6jODrCA4gtIdwUCC7htxcDACA==", "dev": true, "license": "MIT", "engines": { @@ -17207,27 +17280,6 @@ "node": ">=8" } }, - "node_modules/minizlib": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", - "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", - "dev": true, - "dependencies": { - "minipass": "^7.1.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", @@ -17240,6 +17292,7 @@ "resolved": "https://registry.npmjs.org/module-definition/-/module-definition-6.0.1.tgz", "integrity": "sha512-FeVc50FTfVVQnolk/WQT8MX+2WVcDnTGiq6Wo+/+lJ2ET1bRVi3HG3YlJUfqagNMc/kUlFSoR96AJkxGpKz13g==", "dev": true, + "license": "MIT", "dependencies": { "ast-module-types": "^6.0.1", "node-source-walk": "^7.0.1" @@ -17256,6 +17309,7 @@ "resolved": "https://registry.npmjs.org/module-lookup-amd/-/module-lookup-amd-9.0.5.tgz", "integrity": "sha512-Rs5FVpVcBYRHPLuhHOjgbRhosaQYLtEo3JIeDIbmNo7mSssi1CTzwMh8v36gAzpbzLGXI9wB/yHh+5+3fY1QVw==", "dev": true, + "license": "MIT", "dependencies": { "commander": "^12.1.0", "glob": "^7.2.3", @@ -17274,6 +17328,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -17284,6 +17339,7 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" } @@ -17294,6 +17350,7 @@ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -17314,6 +17371,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -17733,6 +17791,7 @@ "resolved": "https://registry.npmjs.org/node-source-walk/-/node-source-walk-7.0.1.tgz", "integrity": "sha512-3VW/8JpPqPvnJvseXowjZcirPisssnBuDikk6JIZ8jQzF7KJQX52iPFX4RYYxLycYH7IbMRSPUOga/esVjy5Yg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/parser": "^7.26.7" }, @@ -18841,6 +18900,7 @@ "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -19111,6 +19171,7 @@ "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-6.0.2.tgz", "integrity": "sha512-YLJpK0N1brcNJrs9WatuJFtHaV9q5aAOj+S4DI5S7jgHlRfm0PIbDCAFRYMQD5SHq7Fy6xsDhyutgS0QOAs0qw==", "dev": true, + "license": "MPL-2.0", "dependencies": { "color-name": "^1.1.4", "is-url-superb": "^4.0.0", @@ -19128,6 +19189,7 @@ "resolved": "https://registry.npmjs.org/precinct/-/precinct-12.2.0.tgz", "integrity": "sha512-NFBMuwIfaJ4SocE9YXPU/n4AcNSoFMVFjP72nvl3cx69j/ke61/hPOWFREVxLkFhhEGnA8ZuVfTqJBa+PK3b5w==", "dev": true, + "license": "MIT", "dependencies": { "@dependents/detective-less": "^5.0.1", "commander": "^12.1.0", @@ -19157,6 +19219,7 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" } @@ -19590,7 +19653,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/quote-unquote/-/quote-unquote-1.0.0.tgz", "integrity": "sha512-twwRO/ilhlG/FIgYeKGFqyHhoEhqgnKVkcmqMKi2r524gz3ZbDTcyFt38E9xjJI2vT+KbRNHVbnJ/e0I25Azwg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/ramda": { "version": "0.29.1", @@ -19714,7 +19778,6 @@ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -20118,6 +20181,7 @@ "resolved": "https://registry.npmjs.org/require-and-forget/-/require-and-forget-1.0.1.tgz", "integrity": "sha512-Sea861D/seGo3cptxc857a34Df0oEijXit8Q3IDodiwZMzVmyXrRI9EgQQa3hjkhoEjNzCBvv0t/0fMgebmWLg==", "dev": true, + "license": "MIT", "dependencies": { "debug": "4.3.4" }, @@ -20130,6 +20194,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -20146,7 +20211,8 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/require-directory": { "version": "2.1.1", @@ -20178,6 +20244,7 @@ "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.7.tgz", "integrity": "sha512-DouTG8T1WanGok6Qjg2SXuCMzszOo0eHeH9hDZ5Y4x8Je+9JB38HdTLT4/VA8OaUhBa0JPVHJ0pyBkM1z+pDsw==", "dev": true, + "license": "MIT", "bin": { "r_js": "bin/r.js", "r.js": "bin/r.js" @@ -20191,6 +20258,7 @@ "resolved": "https://registry.npmjs.org/requirejs-config-file/-/requirejs-config-file-4.0.0.tgz", "integrity": "sha512-jnIre8cbWOyvr8a5F2KuqBnY+SDA4NXr/hzEZJG79Mxm2WiFQz2dzhC8ibtPJS7zkmBEl1mxSwp5HhC1W4qpxw==", "dev": true, + "license": "MIT", "dependencies": { "esprima": "^4.0.0", "stringify-object": "^3.2.1" @@ -20260,6 +20328,7 @@ "resolved": "https://registry.npmjs.org/resolve-dependency-path/-/resolve-dependency-path-4.0.1.tgz", "integrity": "sha512-YQftIIC4vzO9UMhO/sCgXukNyiwVRCVaxiWskCBy7Zpqkplm8kTAISZ8O1MoKW1ca6xzgLUBjZTcDgypXvXxiQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" } @@ -20598,6 +20667,7 @@ "resolved": "https://registry.npmjs.org/sass-lookup/-/sass-lookup-6.1.0.tgz", "integrity": "sha512-Zx+lVyoWqXZxHuYWlTA17Z5sczJ6braNT2C7rmClw+c4E7r/n911Zwss3h1uHI9reR5AgHZyNHF7c2+VIp5AUA==", "dev": true, + "license": "MIT", "dependencies": { "commander": "^12.1.0", "enhanced-resolve": "^5.18.0" @@ -20614,6 +20684,7 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" } @@ -21064,6 +21135,7 @@ "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.10.0.tgz", "integrity": "sha512-Jex+xw5Mg2qMZL3qnzXIfaxEtBaC4n7xifqaqtrZDdlheR70OGkydrPJWT0V1cA1k3nanC86x9FwAmQl6w3Klw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "execa": "^5.1.1", "fast-glob": "^3.3.2" @@ -21077,6 +21149,7 @@ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -21100,6 +21173,7 @@ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -21112,6 +21186,7 @@ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=10.17.0" } @@ -21207,6 +21282,7 @@ "resolved": "https://registry.npmjs.org/simple-bin-help/-/simple-bin-help-1.8.0.tgz", "integrity": "sha512-0LxHn+P1lF5r2WwVB/za3hLRIsYoLaNq1CXqjbrs3ZvLuvlWnRKrUjEWzV7umZL7hpQ7xULiQMV+0iXdRa5iFg==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.16" } @@ -21455,6 +21531,7 @@ "resolved": "https://registry.npmjs.org/spec-change/-/spec-change-1.11.20.tgz", "integrity": "sha512-N9V0tptwsYs6WRvO3CYdHaptwj+EAaTAktTwIx9cEKkdboX4BBWY5//EhV9EoOzpGYO/4zHhs6lY3dHQPcMB6g==", "dev": true, + "license": "MIT", "dependencies": { "arg": "^5.0.2", "debug": "^4.3.4", @@ -21467,15 +21544,6 @@ "spec-change": "bin/spec-change.js" } }, - "node_modules/spec-change/node_modules/lazy-ass": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-2.0.3.tgz", - "integrity": "sha512-/O3/DoQmI1XAhklDvF1dAjFf/epE8u3lzOZegQfLZ8G7Ud5bTRSZiFOpukHCu6jODrCA4gtIdwUCC7htxcDACA==", - "dev": true, - "engines": { - "node": "> 0.8" - } - }, "node_modules/split-ca": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/split-ca/-/split-ca-1.0.1.tgz", @@ -21875,6 +21943,7 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -22404,6 +22473,7 @@ "resolved": "https://registry.npmjs.org/stylus-lookup/-/stylus-lookup-6.1.0.tgz", "integrity": "sha512-5QSwgxAzXPMN+yugy61C60PhoANdItfdjSEZR8siFwz7yL9jTmV0UBKDCfn3K8GkGB4g0Y9py7vTCX8rFu4/pQ==", "dev": true, + "license": "MIT", "dependencies": { "commander": "^12.1.0" }, @@ -22419,6 +22489,7 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" } @@ -22478,6 +22549,33 @@ "dev": true, "license": "MIT" }, + "node_modules/systeminformation": { + "version": "5.27.7", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.27.7.tgz", + "integrity": "sha512-saaqOoVEEFaux4v0K8Q7caiauRwjXC4XbD2eH60dxHXbpKxQ8kH9Rf7Jh+nryKpOUSEFxtCdBlSUx0/lO6rwRg==", + "dev": true, + "license": "MIT", + "os": [ + "darwin", + "linux", + "win32", + "freebsd", + "openbsd", + "netbsd", + "sunos", + "android" + ], + "bin": { + "systeminformation": "lib/cli.js" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "Buy me a coffee", + "url": "https://www.buymeacoffee.com/systeminfo" + } + }, "node_modules/tabbable": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", @@ -22556,22 +22654,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/tar": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.1.tgz", - "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", - "dev": true, - "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.1.0", - "yallist": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/tar-fs": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", @@ -22623,26 +22705,6 @@ "node": ">= 6" } }, - "node_modules/tar/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/tar/node_modules/yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, "node_modules/temp-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", @@ -23307,6 +23369,7 @@ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", "dev": true, + "license": "MIT", "dependencies": { "json5": "^2.2.2", "minimist": "^1.2.6", @@ -23392,6 +23455,16 @@ "node": ">= 0.8.0" } }, + "node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", diff --git a/package.json b/package.json index 94701945d00..865a1c25dd1 100644 --- a/package.json +++ b/package.json @@ -126,9 +126,8 @@ "@babel/plugin-transform-private-methods": "^7.27.1", "@babel/preset-typescript": "^7.27.1", "@codecov/webpack-plugin": "^1.9.1", - "@cypress/webpack-preprocessor": "^7.0.0", "@nextcloud/babel-config": "^1.2.0", - "@nextcloud/cypress": "^1.0.0-beta.15", + "@nextcloud/e2e-test-server": "^0.4.0", "@nextcloud/eslint-config": "^9.0.0-rc.5", "@nextcloud/stylelint-config": "^3.1.0", "@nextcloud/typings": "^1.9.1", @@ -149,15 +148,15 @@ "babel-plugin-module-resolver": "^5.0.2", "browserslist": "^4.26.3", "colord": "^2.9.3", - "cypress": "^13.17.0", + "cypress": "^15.5.0", "cypress-axe": "^1.7.0", - "cypress-delete-downloads-folder": "^0.0.6", "cypress-if": "^1.13.2", - "cypress-split": "^1.24.24", + "cypress-split": "^1.24.25", + "cypress-vite": "^1.8.0", "cypress-wait-until": "^3.0.2", "dockerode": "^4.0.9", "eslint": "^9.36.0", - "eslint-plugin-cypress": "^5.1.1", + "eslint-plugin-cypress": "^5.2.0", "eslint-plugin-no-only-tests": "^3.3.0", "exports-loader": "^5.0.0", "file-loader": "^6.2.0", @@ -171,7 +170,6 @@ "sass": "^1.93.2", "stylelint": "^16.24.0", "stylelint-use-logical": "^2.1.2", - "tar": "^7.5.1", "ts-node": "^10.9.2", "tslib": "^2.8.1", "typescript": "^5.9.2",