From b5d3a1c67f1c8acf81fcfd85a4c28376493600fa Mon Sep 17 00:00:00 2001 From: Ferdinand Thiessen Date: Fri, 12 Jul 2024 00:47:24 +0200 Subject: [PATCH] test: Make cypress tests more resilent Wait for HTTP requests and use proper selectors Signed-off-by: Ferdinand Thiessen --- cypress.config.ts | 4 +- cypress/e2e/filesUtils.ts | 63 +++- cypress/e2e/settings.cy.ts | 66 ++--- cypress/e2e/sidebar.cy.ts | 85 ++++-- cypress/e2e/sidebarUtils.ts | 74 ----- cypress/pages/SidebarPage.ts | 132 +++++++++ cypress/plugins/index.js | 22 -- cypress/support/commands.ts | 1 + cypress/tsconfig.json | 1 + package-lock.json | 539 ++++++++++++++++------------------- package.json | 3 +- vite.config.ts | 9 - 12 files changed, 522 insertions(+), 477 deletions(-) delete mode 100644 cypress/e2e/sidebarUtils.ts create mode 100644 cypress/pages/SidebarPage.ts delete mode 100644 cypress/plugins/index.js diff --git a/cypress.config.ts b/cypress.config.ts index 9875c977b..7f2fd48f2 100644 --- a/cypress.config.ts +++ b/cypress.config.ts @@ -40,7 +40,9 @@ export default defineConfig({ trashAssetsBeforeRuns: true, e2e: { - testIsolation: false, + testIsolation: true, + + requestTimeout: 10000, // We've imported your old cypress plugins here. // You may want to clean this up later by importing these. diff --git a/cypress/e2e/filesUtils.ts b/cypress/e2e/filesUtils.ts index 09afce0a5..5023d9dcd 100644 --- a/cypress/e2e/filesUtils.ts +++ b/cypress/e2e/filesUtils.ts @@ -3,16 +3,39 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -export function renameFile(fileName: string, newName: string) { - toggleMenuAction(fileName) - cy.get(`[data-cy-files-list] [data-cy-files-list-row-action="rename"]`).click() - cy.get(`[data-cy-files-list] [data-cy-files-list-row-name="${fileName}"] .files-list__row-rename input`).clear() - cy.get(`[data-cy-files-list] [data-cy-files-list-row-name="${fileName}"] .files-list__row-rename input`).type(`${newName}.txt`) - cy.get(`[data-cy-files-list] [data-cy-files-list-row-name="${fileName}"] .files-list__row-rename`).submit() - cy.get('.toast-close').click() - cy.wait(500) +import { SidebarPage } from "../pages/SidebarPage" + +export const getRowForFile = (filename: string) => cy.get(`[data-cy-files-list-row-name="${CSS.escape(filename)}"]`) +export const getActionsForFile = (filename: string) => getRowForFile(filename).find('[data-cy-files-list-row-actions]') +export const getActionButtonForFile = (filename: string) => getActionsForFile(filename).find('button[aria-label="Actions"]') +export const triggerActionForFile = (filename: string, actionId: string) => { + getActionButtonForFile(filename) + .click({ force: true }) + cy.get(`[data-cy-files-list-row-action="${CSS.escape(actionId)}"] > button`) + .should('exist') + .click({ force: true }) +} + +export function renameFile(fileName: string, newFileName: string) { + getRowForFile(fileName) + triggerActionForFile(fileName, 'rename') + + // intercept the move so we can wait for it + cy.intercept('MOVE', /\/remote.php\/dav\/files\//).as('moveFile') + + getRowForFile(fileName) + .find('[data-cy-files-list-row-name] input') + .should('be.visible') + .clear() + getRowForFile(fileName).find('[data-cy-files-list-row-name] input').type(`${newFileName}{enter}`) + + cy.wait('@moveFile') + cy.findByRole('button', { name: 'All files' }).click() + + getRowForFile(newFileName).should('be.visible') } + export function goToDir(dirName: string) { cy.get(`[data-cy-files-list] [data-cy-files-list-row-name="${dirName}"]`).click() cy.url().should('match', new RegExp(`\\?dir=(.*/)?${encodeURI(dirName)}`)) @@ -33,8 +56,8 @@ export function createFolder (dirName: string) { export function moveFile (fileName: string, dirName: string) { cy.intercept('MOVE', '**/remote.php/dav/files/**').as('moveFile') - toggleMenuAction(fileName) - cy.get(`[data-cy-files-list] [data-cy-files-list-row-action="move-copy"]`).click() + triggerActionForFile(fileName, 'move-copy') + cy.get('.file-picker').within(() => { cy.get(`[data-filename="${dirName}"]`).click() cy.contains(`Move to ${dirName}`).click() @@ -43,7 +66,21 @@ export function moveFile (fileName: string, dirName: string) { cy.wait('@moveFile') } -export function toggleMenuAction(fileName: string) { - cy.get(`[data-cy-files-list] [data-cy-files-list-row-name="${fileName}"] [data-cy-files-list-row-actions] .action-item__menutoggle`).click() - cy.get('[data-cy-files-list-row-action]').should('be.visible') +export function toggleFavorite(fileName: string) { + cy.intercept('POST', `**/apps/files/api/v1/files/${fileName}`).as('makeFavorite') + + triggerActionForFile(fileName, 'favorite') + + cy.wait('@makeFavorite') + cy.get('.toast-close').should('be.visible').click() +} + +export function showSidebarForFile(fileName: string) { + const sidebar = new SidebarPage() + sidebar.close() + + triggerActionForFile(fileName, 'details') + + sidebar.sidebar() + .should('be.visible') } diff --git a/cypress/e2e/settings.cy.ts b/cypress/e2e/settings.cy.ts index 9e51aadb5..5e91e8543 100644 --- a/cypress/e2e/settings.cy.ts +++ b/cypress/e2e/settings.cy.ts @@ -4,7 +4,8 @@ */ describe('Check that user\'s settings survive a reload', () => { - before(() => { + + beforeEach(() => { cy.createRandomUser() .then((user) => { cy.login(user) @@ -12,55 +13,47 @@ describe('Check that user\'s settings survive a reload', () => { }) }) - it('Form survive a reload', () => { - cy.get("#app-content input[type='checkbox']").uncheck({ force: true }) - cy.get("#app-content input[type='checkbox']").should('not.be.checked') + function checkBox(id: string) { + cy.intercept('POST', '**/apps/activity/settings').as('checkbox') + cy.get(id) + .scrollIntoView() + .check({ force: true }) - cy.reload() + cy.wait('@checkbox') + } + + it('Form survive a reload', () => { + cy.get('#file_changed_notification').should('not.be.checked') + cy.get('#comments_email').should('not.be.checked') + cy.get('#comments_notification').should('not.be.checked') + cy.get('#calendar_email').should('not.be.checked') + cy.get('#calendar_notification').should('not.be.checked') + cy.get('#systemtags_email').should('not.be.checked') + cy.get('#personal_settings_notification').should('not.be.checked') - cy.get("#app-content input[type='checkbox']").uncheck({ force: true }) - cy.get("#app-content input[type='checkbox']").should('not.be.checked') + checkBox('#file_changed_notification') + checkBox('#comments_email') + checkBox('#comments_notification') + checkBox('#calendar_email') + checkBox('#calendar_notification') + checkBox('#systemtags_email') + checkBox('#personal_settings_notification') - cy.get('#file_changed_notification').check({ force: true }) - cy.get('#comments_email').check({ force: true }) - cy.get('#comments_notification').check({ force: true }) - cy.get('#calendar_email').check({ force: true }) - cy.get('#calendar_notification').check({ force: true }) - cy.get('#personal_settings_email').check({ force: true }) - cy.get('#personal_settings_notification').check({ force: true }) cy.reload() - cy.get('#file_changed_email').should('not.be.checked') cy.get('#file_changed_notification').should('be.checked') - cy.get('#shared_email').should('not.be.checked') - cy.get('#shared_notification').should('not.be.checked') - cy.get('#remote_share_email').should('not.be.checked') - cy.get('#remote_share_notification').should('not.be.checked') - cy.get('#public_links_email').should('not.be.checked') - cy.get('#public_links_notification').should('not.be.checked') + cy.get('#comments_email').should('be.checked') + cy.get('#comments_notification').should('be.checked') cy.get('#calendar_email').should('be.checked') cy.get('#calendar_notification').should('be.checked') - cy.get('#calendar_event_email').should('not.be.checked') - cy.get('#calendar_event_notification').should('not.be.checked') - cy.get('#calendar_todo_email').should('not.be.checked') - cy.get('#calendar_todo_notification').should('not.be.checked') - cy.get('#contacts_email').should('not.be.checked') - cy.get('#contacts_notification').should('not.be.checked') - cy.get('#group_settings_email').should('not.be.checked') - cy.get('#group_settings_notification').should('not.be.checked') - cy.get('#personal_settings_email').should('not.be.checked') + cy.get('#systemtags_email').should('be.checked') cy.get('#personal_settings_notification').should('be.checked') - cy.get('#security_email').should('be.checked') - cy.get('#security_notification').should('not.be.checked') - cy.get('#comments_email').should('be.checked') - cy.get('#comments_notification').should('be.checked') - cy.get('#systemtags_email').should('not.be.checked') - cy.get('#systemtags_notification').should('not.be.checked') }) it('Notification frequency survive a reload', () => { cy.intercept({ method: 'POST', url: '**/activity/settings' }).as('apiCall') + cy.get('.notification-frequency__select').scrollIntoView() cy.get('.notification-frequency__select').select('Weekly') cy.wait('@apiCall') @@ -79,6 +72,7 @@ describe('Check that user\'s settings survive a reload', () => { cy.intercept({ method: 'POST', url: '**/activity/settings' }).as('apiCall') cy.contains('[data-cy-checkbox]', 'Send daily activity summary in the morning') + .scrollIntoView() .find('input') .check({ force: true }) cy.contains('[data-cy-checkbox]', 'Send daily activity summary in the morning') diff --git a/cypress/e2e/sidebar.cy.ts b/cypress/e2e/sidebar.cy.ts index 8db5524ed..81ef5c856 100644 --- a/cypress/e2e/sidebar.cy.ts +++ b/cypress/e2e/sidebar.cy.ts @@ -3,71 +3,100 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import { createFolder, goToDir, moveFile, renameFile } from './filesUtils' -import { addComment, addTag, addToFavorites, createPublicShare, removeFromFavorites, showActivityTab } from './sidebarUtils' +import { createFolder, goToDir, moveFile, renameFile, showSidebarForFile, toggleFavorite } from './filesUtils' +import { SidebarPage } from '../pages/SidebarPage' describe('Check activity listing in the sidebar', { testIsolation: true }, () => { + let sidebar: SidebarPage + beforeEach(function() { cy.createRandomUser() .then((user) => { cy.login(user) cy.visit('/apps/files') + sidebar = new SidebarPage() }) }) it('Has creation activity', () => { - showActivityTab('welcome.txt') - cy.get('.activity-entry').last().should('contains.text', 'You created') + showSidebarForFile('welcome.txt') + sidebar.getActivities() + .last() + .should('contains.text', 'You created') }) it('Has favorite activity', () => { - addToFavorites('welcome.txt') - showActivityTab('welcome.txt') - cy.get('.activity-entry').first().should('contains.text', 'Added to favorites') + toggleFavorite('welcome.txt') + + showSidebarForFile('welcome.txt') + sidebar.getActivities() + .first() + .should('contains.text', 'Added to favorites') + sidebar.close() + + cy.reload() + toggleFavorite('welcome.txt') - removeFromFavorites('welcome.txt') - showActivityTab('welcome.txt') - cy.get('.activity-entry').first().should('contains.text', 'Removed from favorites') + showSidebarForFile('welcome.txt') + sidebar.getActivities() + .first() + .should('contains.text', 'Removed from favorites') }) it('Has share activity', () => { - createPublicShare('welcome.txt') - cy.get('body').contains('Link share created').should('exist') - cy.get('.toast-close').click({ multiple: true }) - showActivityTab('welcome.txt') - cy.get('.activity-entry').first().should('contains.text', 'Shared as public link') + showSidebarForFile('welcome.txt') + sidebar.createPublicShare() + sidebar.close() + + showSidebarForFile('welcome.txt') + sidebar.getActivities() + .first() + .should('contains.text', 'Shared as public link') }) - it('Has rename activity', () => { - renameFile('welcome.txt', 'new name') - renameFile('new name.txt', 'welcome') + it('Has rename activity', { retries: 5 }, () => { + renameFile('welcome.txt', 'new name.txt') + renameFile('new name.txt', 'welcome.txt') - showActivityTab('welcome.txt') - cy.get('.activity-entry').first().should('contains.text', 'You renamed') + showSidebarForFile('welcome.txt') + sidebar.getActivities() + .first() + .should('contains.text', 'You renamed') }) it('Has move activity', () => { createFolder('Test folder') moveFile('welcome.txt', 'Test folder') cy.get('.toast-close').click({ multiple: true }) + goToDir('Test folder') - showActivityTab('welcome.txt') - cy.get('.activity-entry').first().should('contains.text', 'You moved') + showSidebarForFile('welcome.txt') + sidebar.getActivities() + .first() + .should('contains.text', 'You moved') }) it('Has tag activity', () => { - addTag('welcome.txt', 'my_tag') + showSidebarForFile('welcome.txt') + sidebar.addTag('some cool tag') + sidebar.close() - showActivityTab('welcome.txt') - cy.get('.activity-entry').first().should('contains.text', 'Added system tag') + showSidebarForFile('welcome.txt') + sidebar.getActivities() + .first() + .should('contains.text', 'Added system tag') }) it('Has comment activity', () => { - addComment('welcome.txt', 'A comment') + showSidebarForFile('welcome.txt') + sidebar.addComment('A comment') + sidebar.close() - showActivityTab('welcome.txt') - cy.get('.comments-activity').first().should('contains.text', 'A comment') + showSidebarForFile('welcome.txt') + sidebar.getActivities() + .first() + .should('contains.text', 'A comment') }) }) diff --git a/cypress/e2e/sidebarUtils.ts b/cypress/e2e/sidebarUtils.ts deleted file mode 100644 index db46d1e2e..000000000 --- a/cypress/e2e/sidebarUtils.ts +++ /dev/null @@ -1,74 +0,0 @@ -/** - * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors - * SPDX-License-Identifier: AGPL-3.0-or-later - */ - -import { toggleMenuAction } from './filesUtils' - -function showSidebarForFile(fileName: string) { - closeSidebar() - toggleMenuAction(fileName) - cy.get('[data-cy-files-list-row-action="details"] button').click() - cy.get('#app-sidebar-vue').should('be.visible') -} - -function closeSidebar() { - cy.get('body') - .then(($body) => { - if ($body.find('.app-sidebar__close').length !== 0) { - cy.get('.app-sidebar__close').click({ force: true }) - } - }) - cy.get('#app-sidebar-vue').should('not.exist') -} - -export function showActivityTab(fileName: string) { - showSidebarForFile(fileName) - cy.get('#app-sidebar-vue').contains('Activity').click() -} - -export function addToFavorites(fileName: string) { - toggleMenuAction(fileName) - cy.get('[data-cy-files-list-row-action="favorite"]').should('contain', 'Add to favorites').click() - cy.get('.toast-close').click() -} - -export function removeFromFavorites(fileName: string) { - toggleMenuAction(fileName) - cy.get('[data-cy-files-list-row-action="favorite"]').should('contain', 'Remove from favorites').click() - cy.get('.toast-close').click() -} - -/** - * Create a new public link share for a given file - * - * @param fileName Name of the file to share - */ -export function createPublicShare(fileName: string) { - showSidebarForFile(fileName) - cy.get('#app-sidebar-vue').contains('Sharing').click() - - cy.get('#app-sidebar-vue #tab-sharing').should('be.visible') - cy.get('#app-sidebar-vue button.new-share-link').click({ force: true }) - cy.get('#app-sidebar-vue .sharing-entry__copy').should('be.visible') - closeSidebar() -} - -export function addTag(fileName: string, tag: string) { - showSidebarForFile(fileName) - - cy.get('.app-sidebar-header__menu button').click() - cy.get('.action-button__icon.icon-tag').click() - cy.get('.system-tags input').type(`${tag}{enter}{esc}`) - - cy.wait(500) -} - -export function addComment(fileName: string, comment: string) { - showSidebarForFile(fileName) - cy.get('#app-sidebar-vue').contains('Activity').click() - cy.get('.comment__editor .rich-contenteditable__input').type(comment) - cy.get('.comment__submit button').click() - - cy.wait(500) -} diff --git a/cypress/pages/SidebarPage.ts b/cypress/pages/SidebarPage.ts new file mode 100644 index 000000000..edca9466b --- /dev/null +++ b/cypress/pages/SidebarPage.ts @@ -0,0 +1,132 @@ +/** + * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +/** + * Page Object Model for testing the sidebar + */ +export class SidebarPage { + constructor() { + cy.intercept('GET', '**/ocs/v2.php/apps/activity/api/v2/activity/filter*').as('fetchActivities') + } + + /** + * Get the sidebar locator + */ + public sidebar() { + return cy.get('[data-cy-sidebar]') + } + + /** + * Get the system tag input locator + */ + public systemTagInput() { + return this.sidebar() + .findByRole('combobox', { name: 'Search or create collaborative tags' }) + } + + /** + * Get a tab selector by name + */ + public getTab(name: string) { + return this.sidebar() + .findByRole('tablist') + .findByRole('tab', { name }) + } + + /** + * Open a sidebar tab + * @param name Tab to open + */ + public openTab(name: string) { + this.getTab(name).click() + this.sidebar() + .findByRole('tabpanel', { name }) + .should('be.visible') + } + + /** + * Get activities in sidebar + */ + public getActivities() { + this.openTab('Activity') + cy.wait('@fetchActivities') + + this.sidebar() + .findByRole('list', { name: 'Activities', timeout: 10000 }) + .should('be.visible') + + return this.sidebar() + .findByRole('list', { name: 'Activities' }) + .findAllByRole('listitem') + } + + /** + * Add a system tag in the sidebar + * @param tag Tag to add + */ + public addTag(tag: string) { + cy.intercept('PUT', '**/remote.php/dav/systemtags-relations/files/**').as('addTag') + + this.sidebar() + .findByRole('button', { name: 'Actions' }) + .click() + + cy.findByRole('menuitem', { name: 'Tags' }) + .should('be.visible') + .click() + + this.systemTagInput() + .type(`${tag}{enter}{esc}`) + + cy.wait('@addTag') + } + + /** + * Add a new public share + */ + public createPublicShare() { + cy.intercept('POST', '**/ocs/v2.php/apps/files_sharing/api/v1/shares').as('createShare') + + this.openTab('Sharing') + this.sidebar() + .findByRole('tabpanel') + .findByRole('button', { name: 'Create a new share link' }) + .click() + + cy.wait('@createShare') + cy.get('.toast-close') + .click({ multiple: true }) + } + + /** + * Ad a new comment + */ + public addComment(comment: string) { + cy.intercept('POST', '**/remote.php/dav/comments/files/*').as('addComment') + + this.openTab('Activity') + this.sidebar() + .findByRole('tabpanel', { name: 'Activity' }) + .within(() => { + cy.findByRole('textbox', { name: 'New comment' }) + .type(comment) + cy.findByRole('button', { name: 'Post comment' }) + .click() + }) + + cy.wait('@addComment') + } + + /** + * Close the sidebar + */ + close() { + this.sidebar() + .findByRole('button', { name: 'Close sidebar' }) + .click() + + this.sidebar().should('not.exist') + } +} diff --git a/cypress/plugins/index.js b/cypress/plugins/index.js deleted file mode 100644 index 59b2bab6e..000000000 --- a/cypress/plugins/index.js +++ /dev/null @@ -1,22 +0,0 @@ -/// -// *********************************************************** -// This example plugins/index.js can be used to load plugins -// -// You can change the location of this file or turn off loading -// the plugins file with the 'pluginsFile' configuration option. -// -// You can read more here: -// https://on.cypress.io/plugins-guide -// *********************************************************** - -// This function is called when a project is opened or re-opened (e.g. due to -// the project's config changing) - -/** - * @type {Cypress.PluginConfig} - */ -// eslint-disable-next-line no-unused-vars -module.exports = (on, config) => { - // `on` is used to hook into various events Cypress emits - // `config` is the resolved Cypress config -} diff --git a/cypress/support/commands.ts b/cypress/support/commands.ts index a96f35810..f74b78437 100644 --- a/cypress/support/commands.ts +++ b/cypress/support/commands.ts @@ -7,6 +7,7 @@ import { addCommands } from '@nextcloud/cypress' import { addCompareSnapshotCommand } from 'cypress-visual-regression/dist/command' import 'cypress-wait-until' +import '@testing-library/cypress/add-commands' // Add custom commands addCommands() diff --git a/cypress/tsconfig.json b/cypress/tsconfig.json index de9a4309e..a63cc5774 100644 --- a/cypress/tsconfig.json +++ b/cypress/tsconfig.json @@ -4,6 +4,7 @@ "compilerOptions": { "types": [ "cypress", + "@testing-library/cypress", "dockerode", "node" ] diff --git a/package-lock.json b/package-lock.json index a64766a9c..2c68fc545 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,12 +33,13 @@ "@nextcloud/eslint-config": "^8.4.1", "@nextcloud/stylelint-config": "^2.4.0", "@nextcloud/vite-config": "^1.3.0", + "@testing-library/cypress": "^10.0.2", "@testing-library/vue": "^5.9.0", "@types/dockerode": "^3.3.29", "@vitest/coverage-v8": "^2.0.2", "@vue/test-utils": "^1.3.6", "@vue/tsconfig": "^0.5.1", - "cypress": "^13.7.1", + "cypress": "^13.13.0", "cypress-visual-regression": "^5.0.0", "cypress-vite": "^1.5.0", "cypress-wait-until": "^3.0.1", @@ -2489,6 +2490,112 @@ "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", "dev": true }, + "node_modules/@testing-library/cypress": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@testing-library/cypress/-/cypress-10.0.2.tgz", + "integrity": "sha512-dKv95Bre5fDmNb9tOIuWedhGUryxGu1GWYWtXDqUsDPcr9Ekld0fiTb+pcBvSsFpYXAZSpmyEjhoXzLbhh06yQ==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.14.6", + "@testing-library/dom": "^10.1.0" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "cypress": "^12.0.0 || ^13.0.0" + } + }, + "node_modules/@testing-library/cypress/node_modules/@testing-library/dom": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.3.1.tgz", + "integrity": "sha512-q/WL+vlXMpC0uXDyfsMtc1rmotzLV8Y0gq6q1gfrrDjQeHoeLrqHbxdPvPNAh1i+xuJl7+BezywcXArz7vLqKQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/cypress/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@testing-library/cypress/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@testing-library/cypress/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@testing-library/cypress/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@testing-library/cypress/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/cypress/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@testing-library/dom": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.0.1.tgz", @@ -3649,12 +3756,12 @@ "peer": true }, "node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "dev": true, "dependencies": { - "deep-equal": "^2.0.5" + "dequal": "^2.0.3" } }, "node_modules/array-find-index": { @@ -4988,9 +5095,9 @@ "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" }, "node_modules/cypress": { - "version": "13.7.1", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.7.1.tgz", - "integrity": "sha512-4u/rpFNxOFCoFX/Z5h+uwlkBO4mWzAjveURi3vqdSu56HPvVdyGTxGw4XKGWt399Y1JwIn9E1L9uMXQpc0o55w==", + "version": "13.13.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.13.0.tgz", + "integrity": "sha512-ou/MQUDq4tcDJI2FsPaod2FZpex4kpIK43JJlcBgWrX8WX7R/05ZxGTuxedOuZBfxjZxja+fbijZGyxiLP6CFA==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -5033,7 +5140,7 @@ "request-progress": "^3.0.0", "semver": "^7.5.3", "supports-color": "^8.1.1", - "tmp": "~0.2.1", + "tmp": "~0.2.3", "untildify": "^4.0.0", "yauzl": "^2.10.0" }, @@ -5334,40 +5441,6 @@ "node": ">=6" } }, - "node_modules/deep-equal": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz", - "integrity": "sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "es-get-iterator": "^1.1.2", - "get-intrinsic": "^1.1.3", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.1", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/deep-equal/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -5809,32 +5882,6 @@ "node": ">= 0.4" } }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-get-iterator/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, "node_modules/es-shim-unscopables": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", @@ -7235,6 +7282,7 @@ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, + "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7345,6 +7393,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -7550,6 +7599,7 @@ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, + "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7940,6 +7990,7 @@ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", "dev": true, + "peer": true, "dependencies": { "get-intrinsic": "^1.2.0", "has": "^1.0.3", @@ -7976,20 +8027,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -8002,6 +8039,7 @@ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, + "peer": true, "dependencies": { "has-bigints": "^1.0.1" }, @@ -8026,6 +8064,7 @@ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, + "peer": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -8099,6 +8138,7 @@ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, + "peer": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -8179,15 +8219,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-nan": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", @@ -8231,6 +8262,7 @@ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, + "peer": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -8275,6 +8307,7 @@ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, + "peer": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -8286,20 +8319,12 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-shared-array-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", "dev": true, + "peer": true, "dependencies": { "call-bind": "^1.0.2" }, @@ -8324,6 +8349,7 @@ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, + "peer": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -8353,6 +8379,7 @@ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, + "peer": true, "dependencies": { "has-symbols": "^1.0.2" }, @@ -8400,15 +8427,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -8422,19 +8440,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-whitespace": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/is-whitespace/-/is-whitespace-0.3.0.tgz", @@ -10169,6 +10174,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -10739,6 +10745,7 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -11399,6 +11406,7 @@ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", "dev": true, + "peer": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", @@ -11743,6 +11751,7 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, + "peer": true, "dependencies": { "glob": "^7.1.3" }, @@ -12336,18 +12345,6 @@ "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", "dev": true }, - "node_modules/stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "dev": true, - "dependencies": { - "internal-slot": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/stream-browserify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", @@ -13208,15 +13205,12 @@ } }, "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", "dev": true, - "dependencies": { - "rimraf": "^3.0.0" - }, "engines": { - "node": ">=8.17.0" + "node": ">=14.14" } }, "node_modules/to-fast-properties": { @@ -14820,6 +14814,7 @@ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, + "peer": true, "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -14831,21 +14826,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", - "dev": true, - "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/which-typed-array": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", @@ -16797,6 +16777,83 @@ "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", "dev": true }, + "@testing-library/cypress": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@testing-library/cypress/-/cypress-10.0.2.tgz", + "integrity": "sha512-dKv95Bre5fDmNb9tOIuWedhGUryxGu1GWYWtXDqUsDPcr9Ekld0fiTb+pcBvSsFpYXAZSpmyEjhoXzLbhh06yQ==", + "dev": true, + "requires": { + "@babel/runtime": "^7.14.6", + "@testing-library/dom": "^10.1.0" + }, + "dependencies": { + "@testing-library/dom": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.3.1.tgz", + "integrity": "sha512-q/WL+vlXMpC0uXDyfsMtc1rmotzLV8Y0gq6q1gfrrDjQeHoeLrqHbxdPvPNAh1i+xuJl7+BezywcXArz7vLqKQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "@testing-library/dom": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.0.1.tgz", @@ -17647,12 +17704,12 @@ "peer": true }, "aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "dev": true, "requires": { - "deep-equal": "^2.0.5" + "dequal": "^2.0.3" } }, "array-find-index": { @@ -18703,9 +18760,9 @@ "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" }, "cypress": { - "version": "13.7.1", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.7.1.tgz", - "integrity": "sha512-4u/rpFNxOFCoFX/Z5h+uwlkBO4mWzAjveURi3vqdSu56HPvVdyGTxGw4XKGWt399Y1JwIn9E1L9uMXQpc0o55w==", + "version": "13.13.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.13.0.tgz", + "integrity": "sha512-ou/MQUDq4tcDJI2FsPaod2FZpex4kpIK43JJlcBgWrX8WX7R/05ZxGTuxedOuZBfxjZxja+fbijZGyxiLP6CFA==", "dev": true, "requires": { "@cypress/request": "^3.0.0", @@ -18747,7 +18804,7 @@ "request-progress": "^3.0.0", "semver": "^7.5.3", "supports-color": "^8.1.1", - "tmp": "~0.2.1", + "tmp": "~0.2.3", "untildify": "^4.0.0", "yauzl": "^2.10.0" }, @@ -18958,39 +19015,6 @@ "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", "dev": true }, - "deep-equal": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz", - "integrity": "sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-get-iterator": "^1.1.2", - "get-intrinsic": "^1.1.3", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.1", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" - }, - "dependencies": { - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - } - } - }, "deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -19350,31 +19374,6 @@ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true }, - "es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "dependencies": { - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - } - } - }, "es-shim-unscopables": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", @@ -20400,7 +20399,8 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true + "dev": true, + "peer": true }, "gensync": { "version": "1.0.0-beta.2", @@ -20481,6 +20481,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -20639,7 +20640,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true + "dev": true, + "peer": true }, "has-flag": { "version": "3.0.0", @@ -20926,6 +20928,7 @@ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", "dev": true, + "peer": true, "requires": { "get-intrinsic": "^1.2.0", "has": "^1.0.3", @@ -20947,17 +20950,6 @@ "has-tostringtag": "^1.0.0" } }, - "is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - } - }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -20970,6 +20962,7 @@ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, + "peer": true, "requires": { "has-bigints": "^1.0.1" } @@ -20988,6 +20981,7 @@ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, + "peer": true, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -21037,6 +21031,7 @@ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, + "peer": true, "requires": { "has-tostringtag": "^1.0.0" } @@ -21087,12 +21082,6 @@ "is-path-inside": "^3.0.2" } }, - "is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "dev": true - }, "is-nan": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", @@ -21121,6 +21110,7 @@ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, + "peer": true, "requires": { "has-tostringtag": "^1.0.0" } @@ -21150,22 +21140,18 @@ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, + "peer": true, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" } }, - "is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "dev": true - }, "is-shared-array-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", "dev": true, + "peer": true, "requires": { "call-bind": "^1.0.2" } @@ -21181,6 +21167,7 @@ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, + "peer": true, "requires": { "has-tostringtag": "^1.0.0" } @@ -21198,6 +21185,7 @@ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, + "peer": true, "requires": { "has-symbols": "^1.0.2" } @@ -21227,12 +21215,6 @@ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true }, - "is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "dev": true - }, "is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -21243,16 +21225,6 @@ "call-bind": "^1.0.2" } }, - "is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, "is-whitespace": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/is-whitespace/-/is-whitespace-0.3.0.tgz", @@ -22491,6 +22463,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "peer": true, "requires": { "brace-expansion": "^1.1.7" } @@ -22912,7 +22885,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true + "dev": true, + "peer": true }, "path-key": { "version": "3.1.1", @@ -23389,6 +23363,7 @@ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", "dev": true, + "peer": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", @@ -23631,6 +23606,7 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, + "peer": true, "requires": { "glob": "^7.1.3" } @@ -24079,15 +24055,6 @@ "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", "dev": true }, - "stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "dev": true, - "requires": { - "internal-slot": "^1.0.4" - } - }, "stream-browserify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", @@ -24761,13 +24728,10 @@ "dev": true }, "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dev": true, - "requires": { - "rimraf": "^3.0.0" - } + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "dev": true }, "to-fast-properties": { "version": "2.0.0", @@ -25777,6 +25741,7 @@ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, + "peer": true, "requires": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -25785,18 +25750,6 @@ "is-symbol": "^1.0.3" } }, - "which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", - "dev": true, - "requires": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - } - }, "which-typed-array": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", diff --git a/package.json b/package.json index 9d6aa535e..1aeda62f0 100644 --- a/package.json +++ b/package.json @@ -63,12 +63,13 @@ "@nextcloud/eslint-config": "^8.4.1", "@nextcloud/stylelint-config": "^2.4.0", "@nextcloud/vite-config": "^1.3.0", + "@testing-library/cypress": "^10.0.2", "@testing-library/vue": "^5.9.0", "@types/dockerode": "^3.3.29", "@vitest/coverage-v8": "^2.0.2", "@vue/test-utils": "^1.3.6", "@vue/tsconfig": "^0.5.1", - "cypress": "^13.7.1", + "cypress": "^13.13.0", "cypress-visual-regression": "^5.0.0", "cypress-vite": "^1.5.0", "cypress-wait-until": "^3.0.1", diff --git a/vite.config.ts b/vite.config.ts index 832b95e06..1a521c016 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -15,14 +15,6 @@ export default createAppConfig({ inlineCSS: { relativeCSSInjection: true }, thirdPartyLicense: false, config: { - experimental: { - renderBuiltUrl(filename) { - return { - // already contains the "js/" prefix as it is our output file configuration - runtime: `OC.filePath('activity', '', '${filename}')`, - } - }, - }, // Setup for vitest unit tests test: { environment: 'happy-dom', @@ -30,7 +22,6 @@ export default createAppConfig({ all: true, clean: true, extension: ['.js', '.ts', '.vue'], - provider: 'v8', }, root: 'src/', deps: {