diff --git a/CHANGELOG.md b/CHANGELOG.md index 06012330dd..c7dcef4d07 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,37 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [6.1.15](https://github.com/ionic-team/ionic-framework/compare/v6.1.14...v6.1.15) (2022-07-20) + + +### Bug Fixes + +* **datetime:** use scroll listener to detect month changes ([#25586](https://github.com/ionic-team/ionic-framework/issues/25586)) ([b7afcb0](https://github.com/ionic-team/ionic-framework/commit/b7afcb0f0c36d84f3b4d65844df28e6293bc1ea5)), closes [#25257](https://github.com/ionic-team/ionic-framework/issues/25257) [#25608](https://github.com/ionic-team/ionic-framework/issues/25608) [#24980](https://github.com/ionic-team/ionic-framework/issues/24980) +* **fab-button:** aria attributes are inherited ([#25635](https://github.com/ionic-team/ionic-framework/issues/25635)) ([64ae3d2](https://github.com/ionic-team/ionic-framework/commit/64ae3d2b9729c5c6be8644b1df6c8b3d40584d3b)), closes [#25633](https://github.com/ionic-team/ionic-framework/issues/25633) +* **modal:** allow for custom dialog implementations ([#25630](https://github.com/ionic-team/ionic-framework/issues/25630)) ([a6f3ae6](https://github.com/ionic-team/ionic-framework/commit/a6f3ae67ab91ab95408ad425156167edc3570978)), closes [#24080](https://github.com/ionic-team/ionic-framework/issues/24080) +* **react:** swipe to go back gesture works on ios ([#25563](https://github.com/ionic-team/ionic-framework/issues/25563)) ([7ec3683](https://github.com/ionic-team/ionic-framework/commit/7ec3683e94e5397022560ce8489532ff40d3f40c)), closes [#22342](https://github.com/ionic-team/ionic-framework/issues/22342) + + +### Performance Improvements + +* **input:** passive event listener for touch start events ([#25610](https://github.com/ionic-team/ionic-framework/issues/25610)) ([2d1efdb](https://github.com/ionic-team/ionic-framework/commit/2d1efdbe6dd9436badab4684f2a484476489c166)), closes [#25599](https://github.com/ionic-team/ionic-framework/issues/25599) + + + + + +## [6.1.14](https://github.com/ionic-team/ionic-framework/compare/v6.1.13...v6.1.14) (2022-07-13) + + +### Bug Fixes + +* **datetime:** datetime works within stencil apps ([#25592](https://github.com/ionic-team/ionic-framework/issues/25592)) ([7b10fa6](https://github.com/ionic-team/ionic-framework/commit/7b10fa6476c2c2896c6810c57b3160f8c8896faa)), closes [#25591](https://github.com/ionic-team/ionic-framework/issues/25591) +* **react:** IonNav works with react ([#25565](https://github.com/ionic-team/ionic-framework/issues/25565)) ([420f9bb](https://github.com/ionic-team/ionic-framework/commit/420f9bbebd41f3eab6def795bcdd1933d5c5a47a)), closes [#24002](https://github.com/ionic-team/ionic-framework/issues/24002) + + + + + ## [6.1.13](https://github.com/ionic-team/ionic-framework/compare/v6.1.12...v6.1.13) (2022-07-06) diff --git a/angular/CHANGELOG.md b/angular/CHANGELOG.md index 9f473fc895..4185ea30a3 100644 --- a/angular/CHANGELOG.md +++ b/angular/CHANGELOG.md @@ -3,6 +3,22 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [6.1.15](https://github.com/ionic-team/ionic/compare/v6.1.14...v6.1.15) (2022-07-20) + +**Note:** Version bump only for package @ionic/angular + + + + + +## [6.1.14](https://github.com/ionic-team/ionic/compare/v6.1.13...v6.1.14) (2022-07-13) + +**Note:** Version bump only for package @ionic/angular + + + + + ## [6.1.13](https://github.com/ionic-team/ionic/compare/v6.1.12...v6.1.13) (2022-07-06) **Note:** Version bump only for package @ionic/angular diff --git a/angular/package-lock.json b/angular/package-lock.json index 25dc117bfe..2896793b9b 100644 --- a/angular/package-lock.json +++ b/angular/package-lock.json @@ -1,15 +1,15 @@ { "name": "@ionic/angular", - "version": "6.1.13", + "version": "6.1.15", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/angular", - "version": "6.1.13", + "version": "6.1.15", "license": "MIT", "dependencies": { - "@ionic/core": "^6.1.13", + "@ionic/core": "^6.1.15", "jsonc-parser": "^3.0.0", "tslib": "^2.0.0" }, @@ -1023,9 +1023,9 @@ "dev": true }, "node_modules/@ionic/core": { - "version": "6.1.13", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.1.13.tgz", - "integrity": "sha512-CZ5P1El/bk6ZDKqey/67/ZgpUhVQTr+WyhGxFTnPCsIWg+VfOogQ7rHCkEqWfXJqdzNPsvtH5/Lck4qoD0nCkg==", + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.1.15.tgz", + "integrity": "sha512-NvBlHR7O4kfp9KYz6oLsghFzGZImA7hM4qS4tFRUI62R+Q5iCJEY4OmXE5bif5K+SQkMhQY+x1l2Nq20waLzLg==", "dependencies": { "@stencil/core": "^2.16.0", "ionicons": "^6.0.2", @@ -7939,9 +7939,9 @@ "dev": true }, "@ionic/core": { - "version": "6.1.13", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.1.13.tgz", - "integrity": "sha512-CZ5P1El/bk6ZDKqey/67/ZgpUhVQTr+WyhGxFTnPCsIWg+VfOogQ7rHCkEqWfXJqdzNPsvtH5/Lck4qoD0nCkg==", + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.1.15.tgz", + "integrity": "sha512-NvBlHR7O4kfp9KYz6oLsghFzGZImA7hM4qS4tFRUI62R+Q5iCJEY4OmXE5bif5K+SQkMhQY+x1l2Nq20waLzLg==", "requires": { "@stencil/core": "^2.16.0", "ionicons": "^6.0.2", diff --git a/angular/package.json b/angular/package.json index fc9d6df90f..f6e6ac03e9 100644 --- a/angular/package.json +++ b/angular/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/angular", - "version": "6.1.13", + "version": "6.1.15", "description": "Angular specific wrappers for @ionic/core", "keywords": [ "ionic", @@ -44,7 +44,7 @@ "validate": "npm i && npm run lint && npm run test && npm run build" }, "dependencies": { - "@ionic/core": "^6.1.13", + "@ionic/core": "^6.1.15", "jsonc-parser": "^3.0.0", "tslib": "^2.0.0" }, diff --git a/angular/test/test-app/cypress/support/commands.js b/angular/test/test-app/cypress/support/commands.js index 9e660c70d7..eed4f1768c 100644 --- a/angular/test/test-app/cypress/support/commands.js +++ b/angular/test/test-app/cypress/support/commands.js @@ -25,7 +25,7 @@ // Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) Cypress.Commands.add('ionSwipeToGoBack', (complete = false, selector = 'ion-router-outlet') => { - const increment = (complete) ? 60 : 25; + const increment = complete ? 60 : 25; cy.get(selector) .first() .trigger('mousedown', 0, 275, { which: 1, force: true }) @@ -37,18 +37,16 @@ Cypress.Commands.add('ionSwipeToGoBack', (complete = false, selector = 'ion-rout .wait(50) .trigger('mousemove', increment * 4, 275, { which: 1, force: true }) .wait(50) - .trigger('mouseup', increment * 4, 275, { which: 1, force: true }) + .trigger('mouseup', increment * 4, 275, { which: 1, force: true }); cy.wait(150); -}) +}); Cypress.Commands.add('testStack', (selector, expected) => { cy.document().then((doc) => { - const children = Array.from( - doc.querySelector(selector).children - ).map(el => el.tagName.toLowerCase()); + const children = Array.from(doc.querySelector(selector).children).map((el) => el.tagName.toLowerCase()); expect(children).to.deep.equal(expected); - }) -}) + }); +}); Cypress.Commands.add('testLifeCycle', (selector, expected) => { cy.get(`${selector} #ngOnInit`).invoke('text').should('equal', '1'); @@ -56,24 +54,26 @@ Cypress.Commands.add('testLifeCycle', (selector, expected) => { cy.get(`${selector} #ionViewDidEnter`).invoke('text').should('equal', expected.ionViewDidEnter.toString()); cy.get(`${selector} #ionViewWillLeave`).invoke('text').should('equal', expected.ionViewWillLeave.toString()); cy.get(`${selector} #ionViewDidLeave`).invoke('text').should('equal', expected.ionViewDidLeave.toString()); -}) +}); Cypress.Commands.add('ionPageVisible', (selector) => { cy.get(selector) .should('have.class', 'ion-page') .should('not.have.class', 'ion-page-hidden') .should('not.have.class', 'ion-page-invisible') - .should('have.length', 1) -}) + .should('have.length', 1); +}); Cypress.Commands.add('ionPageHidden', (selector) => { - cy.get(selector) - .should('have.class', 'ion-page') - .should('have.class', 'ion-page-hidden') - .should('have.length', 1) -}) + cy.get(selector).should('have.class', 'ion-page').should('have.class', 'ion-page-hidden').should('have.length', 1); +}); Cypress.Commands.add('ionPageDoesNotExist', (selector) => { - cy.get(selector) - .should('not.exist') + cy.get(selector).should('not.exist'); +}); + +Cypress.Commands.add('ionTabClick', (tabText) => { + // TODO: Figure out how to get rid of wait. It's a workaround for flakiness in CI. + cy.wait(250); + cy.contains('ion-tab-button', tabText).click({ force: true }); }); diff --git a/angular/test/test-app/cypress/support/index.d.ts b/angular/test/test-app/cypress/support/index.d.ts index e3c14379fd..acf1649fc4 100644 --- a/angular/test/test-app/cypress/support/index.d.ts +++ b/angular/test/test-app/cypress/support/index.d.ts @@ -63,6 +63,11 @@ declare namespace Cypress { * ``` */ ionPageDoesNotExist(selector: string): Chainable + + /** + * Clicks on a tab button with the given text. + */ + ionTabClick(tabText: string): Chainable; } } diff --git a/angular/test/test-app/e2e/src/tabs.spec.ts b/angular/test/test-app/e2e/src/tabs.spec.ts index c2bf709b9d..589e8a1740 100644 --- a/angular/test/test-app/e2e/src/tabs.spec.ts +++ b/angular/test/test-app/e2e/src/tabs.spec.ts @@ -230,13 +230,13 @@ describe('Tabs', () => { tab.find('#goto-next').click(); testTabTitle('Tab 1 - Page 2 (2)'); - cy.get('#tab-button-contact').click(); + cy.ionTabClick('Tab Two'); testTabTitle('Tab 2 - Page 1'); - cy.get('#tab-button-account').click(); + cy.ionTabClick('Tab One'); testTabTitle('Tab 1 - Page 2 (2)'); - cy.get('#tab-button-account').click(); + cy.ionTabClick('Tab One'); testTabTitle('Tab 1 - Page 1'); testUrlContains(rootUrl); diff --git a/core/CHANGELOG.md b/core/CHANGELOG.md index 04c2e89b2d..1ca8e815c2 100644 --- a/core/CHANGELOG.md +++ b/core/CHANGELOG.md @@ -3,6 +3,35 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [6.1.15](https://github.com/ionic-team/ionic/compare/v6.1.14...v6.1.15) (2022-07-20) + + +### Bug Fixes + +* **datetime:** use scroll listener to detect month changes ([#25586](https://github.com/ionic-team/ionic/issues/25586)) ([b7afcb0](https://github.com/ionic-team/ionic/commit/b7afcb0f0c36d84f3b4d65844df28e6293bc1ea5)), closes [#25257](https://github.com/ionic-team/ionic/issues/25257) [#25608](https://github.com/ionic-team/ionic/issues/25608) [#24980](https://github.com/ionic-team/ionic/issues/24980) +* **fab-button:** aria attributes are inherited ([#25635](https://github.com/ionic-team/ionic/issues/25635)) ([64ae3d2](https://github.com/ionic-team/ionic/commit/64ae3d2b9729c5c6be8644b1df6c8b3d40584d3b)), closes [#25633](https://github.com/ionic-team/ionic/issues/25633) +* **modal:** allow for custom dialog implementations ([#25630](https://github.com/ionic-team/ionic/issues/25630)) ([a6f3ae6](https://github.com/ionic-team/ionic/commit/a6f3ae67ab91ab95408ad425156167edc3570978)), closes [#24080](https://github.com/ionic-team/ionic/issues/24080) + + +### Performance Improvements + +* **input:** passive event listener for touch start events ([#25610](https://github.com/ionic-team/ionic/issues/25610)) ([2d1efdb](https://github.com/ionic-team/ionic/commit/2d1efdbe6dd9436badab4684f2a484476489c166)), closes [#25599](https://github.com/ionic-team/ionic/issues/25599) + + + + + +## [6.1.14](https://github.com/ionic-team/ionic/compare/v6.1.13...v6.1.14) (2022-07-13) + + +### Bug Fixes + +* **datetime:** datetime works within stencil apps ([#25592](https://github.com/ionic-team/ionic/issues/25592)) ([7b10fa6](https://github.com/ionic-team/ionic/commit/7b10fa6476c2c2896c6810c57b3160f8c8896faa)), closes [#25591](https://github.com/ionic-team/ionic/issues/25591) + + + + + ## [6.1.13](https://github.com/ionic-team/ionic/compare/v6.1.12...v6.1.13) (2022-07-06) diff --git a/core/package-lock.json b/core/package-lock.json index 12c8a5d072..e622f693c6 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -1,12 +1,12 @@ { "name": "@ionic/core", - "version": "6.1.13", + "version": "6.1.15", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/core", - "version": "6.1.13", + "version": "6.1.15", "license": "MIT", "dependencies": { "@stencil/core": "^2.16.0", @@ -19,7 +19,7 @@ "@ionic/eslint-config": "^0.3.0", "@ionic/prettier-config": "^2.0.0", "@jest/core": "^26.6.3", - "@playwright/test": "^1.20.0", + "@playwright/test": "^1.23.3", "@rollup/plugin-node-resolve": "^8.4.0", "@rollup/plugin-virtual": "^2.0.3", "@stencil/angular-output-target": "^0.4.0", @@ -189,18 +189,6 @@ "node": ">=0.10.0" } }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", - "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-compilation-targets": { "version": "7.17.7", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", @@ -228,27 +216,6 @@ "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.6.tgz", - "integrity": "sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-member-expression-to-functions": "^7.16.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, "node_modules/@babel/helper-environment-visitor": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", @@ -299,18 +266,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", - "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.17.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-module-imports": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", @@ -342,18 +297,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", - "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-plugin-utils": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", @@ -363,22 +306,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", - "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-member-expression-to-functions": "^7.16.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-simple-access": { "version": "7.17.7", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", @@ -391,18 +318,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", - "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-split-export-declaration": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", @@ -473,153 +388,6 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", - "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", - "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz", - "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz", - "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz", - "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", - "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz", - "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.16.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", - "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.16.10", - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz", - "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", @@ -656,30 +424,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", @@ -776,21 +520,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", @@ -803,73 +532,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz", - "integrity": "sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz", - "integrity": "sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-simple-access": "^7.16.7", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz", - "integrity": "sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-typescript": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-typescript": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz", - "integrity": "sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-transform-typescript": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/template": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", @@ -2021,80 +1683,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/types/node_modules/@types/yargs": { - "version": "16.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", - "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@jest/types/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/@jest/types/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/@jest/types/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/@jest/types/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/@nodelib/fs.scandir": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", @@ -2131,293 +1719,19 @@ } }, "node_modules/@playwright/test": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.20.1.tgz", - "integrity": "sha512-muk3KZXfA7sXTwUEXfL3m4tusj/MBGYjxIFmooi+F2Pf6hKjjVl4+8niy77Xujk4jpL7hZbbqq9v5bRl2m+C8Q==", + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.23.3.tgz", + "integrity": "sha512-kR4vo2UGHC84DGqE6EwvAeaehj3xCAK6LoC1P1eu6ZGdC79rlqRKf8cFDx6q6c9T8MQSL1O9eOlup0BpwqNF0w==", "dev": true, "dependencies": { - "@babel/code-frame": "7.16.7", - "@babel/core": "7.16.12", - "@babel/helper-plugin-utils": "7.16.7", - "@babel/plugin-proposal-class-properties": "7.16.7", - "@babel/plugin-proposal-dynamic-import": "7.16.7", - "@babel/plugin-proposal-export-namespace-from": "7.16.7", - "@babel/plugin-proposal-logical-assignment-operators": "7.16.7", - "@babel/plugin-proposal-nullish-coalescing-operator": "7.16.7", - "@babel/plugin-proposal-numeric-separator": "7.16.7", - "@babel/plugin-proposal-optional-chaining": "7.16.7", - "@babel/plugin-proposal-private-methods": "7.16.11", - "@babel/plugin-proposal-private-property-in-object": "7.16.7", - "@babel/plugin-syntax-async-generators": "7.8.4", - "@babel/plugin-syntax-json-strings": "7.8.3", - "@babel/plugin-syntax-object-rest-spread": "7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "7.8.3", - "@babel/plugin-transform-modules-commonjs": "7.16.8", - "@babel/preset-typescript": "7.16.7", - "colors": "1.4.0", - "commander": "8.3.0", - "debug": "4.3.3", - "expect": "27.2.5", - "jest-matcher-utils": "27.2.5", - "json5": "2.2.1", - "mime": "3.0.0", - "minimatch": "3.0.4", - "ms": "2.1.3", - "open": "8.4.0", - "pirates": "4.0.4", - "playwright-core": "1.20.1", - "rimraf": "3.0.2", - "source-map-support": "0.4.18", - "stack-utils": "2.0.5", - "yazl": "2.5.1" + "@types/node": "*", + "playwright-core": "1.23.3" }, "bin": { "playwright": "cli.js" }, "engines": { - "node": ">=12" - } - }, - "node_modules/@playwright/test/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@playwright/test/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@playwright/test/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/@playwright/test/node_modules/chalk/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/@playwright/test/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/@playwright/test/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/@playwright/test/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, - "node_modules/@playwright/test/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@playwright/test/node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/@playwright/test/node_modules/expect": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.2.5.tgz", - "integrity": "sha512-ZrO0w7bo8BgGoP/bLz+HDCI+0Hfei9jUSZs5yI/Wyn9VkG9w8oJ7rHRgYj+MA7yqqFa0IwHA3flJzZtYugShJA==", - "dev": true, - "dependencies": { - "@jest/types": "^27.2.5", - "ansi-styles": "^5.0.0", - "jest-get-type": "^27.0.6", - "jest-matcher-utils": "^27.2.5", - "jest-message-util": "^27.2.5", - "jest-regex-util": "^27.0.6" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@playwright/test/node_modules/jest-diff": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", - "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@playwright/test/node_modules/jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "dev": true, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@playwright/test/node_modules/jest-matcher-utils": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.2.5.tgz", - "integrity": "sha512-qNR/kh6bz0Dyv3m68Ck2g1fLW5KlSOUNcFQh87VXHZwWc/gY6XwnKofx76Qytz3x5LDWT09/2+yXndTkaG4aWg==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^27.2.5", - "jest-get-type": "^27.0.6", - "pretty-format": "^27.2.5" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@playwright/test/node_modules/jest-message-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", - "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@playwright/test/node_modules/jest-regex-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", - "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", - "dev": true, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@playwright/test/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/@playwright/test/node_modules/open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", - "dev": true, - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@playwright/test/node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@playwright/test/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@playwright/test/node_modules/source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "dependencies": { - "source-map": "^0.5.6" + "node": ">=14" } }, "node_modules/@rollup/plugin-node-resolve": { @@ -3801,15 +3115,6 @@ "node": ">=4" } }, - "node_modules/babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dev": true, - "dependencies": { - "object.assign": "^4.1.0" - } - }, "node_modules/babel-plugin-istanbul": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", @@ -5002,15 +4307,6 @@ "node": ">=0.10.0" } }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -5098,15 +4394,6 @@ "integrity": "sha512-4INMPwNm9XRpBukhNbF7OB6fNTTCaI8pzy/fXg0xQzAy5h3zL1P8xT3QazgKqBrb/hAYwIBizqDBZ7GtJE74QQ==", "dev": true }, - "node_modules/diff-sequences": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", - "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", - "dev": true, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -11083,121 +10370,15 @@ } }, "node_modules/playwright-core": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.20.1.tgz", - "integrity": "sha512-A8ZsZ09gaSbxP0UijoLyzp3LJc0kWMxDooLPi+mm4/5iYnTbd6PF5nKjoFw1a7KwjZIEgdhJduah4BcUIh+IPA==", + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.23.3.tgz", + "integrity": "sha512-x35yzsXDyo0BIXYimLnUFNyb42c//NadUNH6IPGOteZm96oTGA1kn4Hq6qJTI1/f9wEc1F9O1DsznXIgXMil7A==", "dev": true, - "dependencies": { - "colors": "1.4.0", - "commander": "8.3.0", - "debug": "4.3.3", - "extract-zip": "2.0.1", - "https-proxy-agent": "5.0.0", - "jpeg-js": "0.4.3", - "mime": "3.0.0", - "pixelmatch": "5.2.1", - "pngjs": "6.0.0", - "progress": "2.0.3", - "proper-lockfile": "4.1.2", - "proxy-from-env": "1.1.0", - "rimraf": "3.0.2", - "socks-proxy-agent": "6.1.1", - "stack-utils": "2.0.5", - "ws": "8.4.2", - "yauzl": "2.10.0", - "yazl": "2.5.1" - }, "bin": { "playwright": "cli.js" }, "engines": { - "node": ">=12" - } - }, - "node_modules/playwright-core/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, - "node_modules/playwright-core/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/playwright-core/node_modules/pixelmatch": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-5.2.1.tgz", - "integrity": "sha512-WjcAdYSnKrrdDdqTcVEY7aB7UhhwjYQKYhHiBXdJef0MOaQeYpUdQ+iVyBLa5YBKS8MPVPPMX7rpOByISLpeEQ==", - "dev": true, - "dependencies": { - "pngjs": "^4.0.1" - }, - "bin": { - "pixelmatch": "bin/pixelmatch" - } - }, - "node_modules/playwright-core/node_modules/pixelmatch/node_modules/pngjs": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-4.0.1.tgz", - "integrity": "sha512-rf5+2/ioHeQxR6IxuYNYGFytUyG3lma/WW1nsmjeHlWwtb2aByla6dkVc8pmJ9nplzkTA0q2xx7mMWrOTqT4Gg==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/playwright-core/node_modules/pngjs": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-6.0.0.tgz", - "integrity": "sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==", - "dev": true, - "engines": { - "node": ">=12.13.0" - } - }, - "node_modules/playwright-core/node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/playwright-core/node_modules/ws": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.4.2.tgz", - "integrity": "sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "node": ">=14" } }, "node_modules/playwright/node_modules/commander": { @@ -15187,15 +14368,6 @@ } } }, - "@babel/helper-annotate-as-pure": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", - "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, "@babel/helper-compilation-targets": { "version": "7.17.7", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", @@ -15216,21 +14388,6 @@ } } }, - "@babel/helper-create-class-features-plugin": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.6.tgz", - "integrity": "sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-member-expression-to-functions": "^7.16.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7" - } - }, "@babel/helper-environment-visitor": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", @@ -15269,15 +14426,6 @@ "@babel/types": "^7.16.7" } }, - "@babel/helper-member-expression-to-functions": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", - "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", - "dev": true, - "requires": { - "@babel/types": "^7.17.0" - } - }, "@babel/helper-module-imports": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", @@ -15303,34 +14451,12 @@ "@babel/types": "^7.17.0" } }, - "@babel/helper-optimise-call-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", - "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, "@babel/helper-plugin-utils": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", "dev": true }, - "@babel/helper-replace-supers": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", - "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-member-expression-to-functions": "^7.16.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" - } - }, "@babel/helper-simple-access": { "version": "7.17.7", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", @@ -15340,15 +14466,6 @@ "@babel/types": "^7.17.0" } }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", - "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, "@babel/helper-split-export-declaration": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", @@ -15398,99 +14515,6 @@ "integrity": "sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==", "dev": true }, - "@babel/plugin-proposal-class-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", - "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", - "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-proposal-export-namespace-from": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz", - "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz", - "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz", - "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", - "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz", - "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/plugin-proposal-private-methods": { - "version": "7.16.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", - "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.10", - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz", - "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - } - }, "@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", @@ -15518,24 +14542,6 @@ "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, "@babel/plugin-syntax-import-meta": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", @@ -15608,15 +14614,6 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, "@babel/plugin-syntax-top-level-await": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", @@ -15626,49 +14623,6 @@ "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-syntax-typescript": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz", - "integrity": "sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz", - "integrity": "sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-simple-access": "^7.16.7", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-typescript": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz", - "integrity": "sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-typescript": "^7.16.7" - } - }, - "@babel/preset-typescript": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz", - "integrity": "sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-transform-typescript": "^7.16.7" - } - }, "@babel/template": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", @@ -16506,64 +15460,6 @@ } } }, - "@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "dependencies": { - "@types/yargs": { - "version": "16.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", - "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "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 - } - } - }, "@nodelib/fs.scandir": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", @@ -16591,228 +15487,13 @@ } }, "@playwright/test": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.20.1.tgz", - "integrity": "sha512-muk3KZXfA7sXTwUEXfL3m4tusj/MBGYjxIFmooi+F2Pf6hKjjVl4+8niy77Xujk4jpL7hZbbqq9v5bRl2m+C8Q==", + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.23.3.tgz", + "integrity": "sha512-kR4vo2UGHC84DGqE6EwvAeaehj3xCAK6LoC1P1eu6ZGdC79rlqRKf8cFDx6q6c9T8MQSL1O9eOlup0BpwqNF0w==", "dev": true, "requires": { - "@babel/code-frame": "7.16.7", - "@babel/core": "7.16.12", - "@babel/helper-plugin-utils": "7.16.7", - "@babel/plugin-proposal-class-properties": "7.16.7", - "@babel/plugin-proposal-dynamic-import": "7.16.7", - "@babel/plugin-proposal-export-namespace-from": "7.16.7", - "@babel/plugin-proposal-logical-assignment-operators": "7.16.7", - "@babel/plugin-proposal-nullish-coalescing-operator": "7.16.7", - "@babel/plugin-proposal-numeric-separator": "7.16.7", - "@babel/plugin-proposal-optional-chaining": "7.16.7", - "@babel/plugin-proposal-private-methods": "7.16.11", - "@babel/plugin-proposal-private-property-in-object": "7.16.7", - "@babel/plugin-syntax-async-generators": "7.8.4", - "@babel/plugin-syntax-json-strings": "7.8.3", - "@babel/plugin-syntax-object-rest-spread": "7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "7.8.3", - "@babel/plugin-transform-modules-commonjs": "7.16.8", - "@babel/preset-typescript": "7.16.7", - "colors": "1.4.0", - "commander": "8.3.0", - "debug": "4.3.3", - "expect": "27.2.5", - "jest-matcher-utils": "27.2.5", - "json5": "2.2.1", - "mime": "3.0.0", - "minimatch": "3.0.4", - "ms": "2.1.3", - "open": "8.4.0", - "pirates": "4.0.4", - "playwright-core": "1.20.1", - "rimraf": "3.0.2", - "source-map-support": "0.4.18", - "stack-utils": "2.0.5", - "yazl": "2.5.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - }, - "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" - }, - "dependencies": { - "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" - } - } - } - }, - "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 - }, - "commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true - }, - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "expect": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.2.5.tgz", - "integrity": "sha512-ZrO0w7bo8BgGoP/bLz+HDCI+0Hfei9jUSZs5yI/Wyn9VkG9w8oJ7rHRgYj+MA7yqqFa0IwHA3flJzZtYugShJA==", - "dev": true, - "requires": { - "@jest/types": "^27.2.5", - "ansi-styles": "^5.0.0", - "jest-get-type": "^27.0.6", - "jest-matcher-utils": "^27.2.5", - "jest-message-util": "^27.2.5", - "jest-regex-util": "^27.0.6" - } - }, - "jest-diff": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", - "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - } - }, - "jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "dev": true - }, - "jest-matcher-utils": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.2.5.tgz", - "integrity": "sha512-qNR/kh6bz0Dyv3m68Ck2g1fLW5KlSOUNcFQh87VXHZwWc/gY6XwnKofx76Qytz3x5LDWT09/2+yXndTkaG4aWg==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^27.2.5", - "jest-get-type": "^27.0.6", - "pretty-format": "^27.2.5" - } - }, - "jest-message-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", - "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-regex-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", - "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", - "dev": true - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", - "dev": true, - "requires": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - } - }, - "pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "requires": { - "source-map": "^0.5.6" - } - } + "@types/node": "*", + "playwright-core": "1.23.3" } }, "@rollup/plugin-node-resolve": { @@ -17796,15 +16477,6 @@ "integrity": "sha512-gd1kmb21kwNuWr6BQz8fv6GNECPBnUasepcoLbekws23NVBLODdsClRZ+bQ8+9Uomf3Sm3+Vwn0oYG9NvwnJCw==", "dev": true }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dev": true, - "requires": { - "object.assign": "^4.1.0" - } - }, "babel-plugin-istanbul": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", @@ -18734,12 +17406,6 @@ "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", "dev": true }, - "define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true - }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -18808,12 +17474,6 @@ "integrity": "sha512-4INMPwNm9XRpBukhNbF7OB6fNTTCaI8pzy/fXg0xQzAy5h3zL1P8xT3QazgKqBrb/hAYwIBizqDBZ7GtJE74QQ==", "dev": true }, - "diff-sequences": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", - "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", - "dev": true - }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -23424,82 +22084,10 @@ } }, "playwright-core": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.20.1.tgz", - "integrity": "sha512-A8ZsZ09gaSbxP0UijoLyzp3LJc0kWMxDooLPi+mm4/5iYnTbd6PF5nKjoFw1a7KwjZIEgdhJduah4BcUIh+IPA==", - "dev": true, - "requires": { - "colors": "1.4.0", - "commander": "8.3.0", - "debug": "4.3.3", - "extract-zip": "2.0.1", - "https-proxy-agent": "5.0.0", - "jpeg-js": "0.4.3", - "mime": "3.0.0", - "pixelmatch": "5.2.1", - "pngjs": "6.0.0", - "progress": "2.0.3", - "proper-lockfile": "4.1.2", - "proxy-from-env": "1.1.0", - "rimraf": "3.0.2", - "socks-proxy-agent": "6.1.1", - "stack-utils": "2.0.5", - "ws": "8.4.2", - "yauzl": "2.10.0", - "yazl": "2.5.1" - }, - "dependencies": { - "commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true - }, - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "pixelmatch": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-5.2.1.tgz", - "integrity": "sha512-WjcAdYSnKrrdDdqTcVEY7aB7UhhwjYQKYhHiBXdJef0MOaQeYpUdQ+iVyBLa5YBKS8MPVPPMX7rpOByISLpeEQ==", - "dev": true, - "requires": { - "pngjs": "^4.0.1" - }, - "dependencies": { - "pngjs": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-4.0.1.tgz", - "integrity": "sha512-rf5+2/ioHeQxR6IxuYNYGFytUyG3lma/WW1nsmjeHlWwtb2aByla6dkVc8pmJ9nplzkTA0q2xx7mMWrOTqT4Gg==", - "dev": true - } - } - }, - "pngjs": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-6.0.0.tgz", - "integrity": "sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==", - "dev": true - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "ws": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.4.2.tgz", - "integrity": "sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA==", - "dev": true - } - } + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.23.3.tgz", + "integrity": "sha512-x35yzsXDyo0BIXYimLnUFNyb42c//NadUNH6IPGOteZm96oTGA1kn4Hq6qJTI1/f9wEc1F9O1DsznXIgXMil7A==", + "dev": true }, "pngjs": { "version": "3.4.0", diff --git a/core/package.json b/core/package.json index 522309efc4..3222b2a625 100644 --- a/core/package.json +++ b/core/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/core", - "version": "6.1.13", + "version": "6.1.15", "description": "Base components for Ionic", "keywords": [ "ionic", @@ -41,7 +41,7 @@ "@ionic/eslint-config": "^0.3.0", "@ionic/prettier-config": "^2.0.0", "@jest/core": "^26.6.3", - "@playwright/test": "^1.20.0", + "@playwright/test": "^1.23.3", "@rollup/plugin-node-resolve": "^8.4.0", "@rollup/plugin-virtual": "^2.0.3", "@stencil/angular-output-target": "^0.4.0", diff --git a/core/src/components/action-sheet/test/basic/action-sheet.e2e.ts b/core/src/components/action-sheet/test/basic/action-sheet.e2e.ts index 226b84b4b7..f7da10aa4b 100644 --- a/core/src/components/action-sheet/test/basic/action-sheet.e2e.ts +++ b/core/src/components/action-sheet/test/basic/action-sheet.e2e.ts @@ -20,7 +20,7 @@ test.describe('action sheet: basic', () => { await buttonOption.click(); await ionActionSheetDidDismiss.next(); - expect(ionActionSheetDidDismiss).toHaveReceivedEventDetail({ data: { type: '1' } }); + expect(ionActionSheetDidDismiss).toHaveReceivedEventDetail({ data: { type: '1' }, role: undefined }); }); test('should return cancel button data', async ({ page }, testInfo) => { test.skip(testInfo.project.metadata.rtl === true, 'This does not test LTR vs. RTL layout.'); diff --git a/core/src/components/checkbox/test/basic/checkbox.e2e.ts b/core/src/components/checkbox/test/basic/checkbox.e2e.ts new file mode 100644 index 0000000000..ac8efcfd2a --- /dev/null +++ b/core/src/components/checkbox/test/basic/checkbox.e2e.ts @@ -0,0 +1,12 @@ +import { expect } from '@playwright/test'; +import { test } from '@utils/test/playwright'; + +test.describe('checkbox: basic', () => { + test('should not have visual regressions', async ({ page }) => { + await page.goto(`/src/components/checkbox/test/basic`); + + await page.setIonViewport(); + + expect(await page.screenshot()).toMatchSnapshot(`checkbox-basic-${page.getSnapshotSettings()}.png`); + }); +}); diff --git a/core/src/components/checkbox/test/basic/checkbox.e2e.ts-snapshots/checkbox-basic-ios-ltr-Mobile-Chrome-linux.png b/core/src/components/checkbox/test/basic/checkbox.e2e.ts-snapshots/checkbox-basic-ios-ltr-Mobile-Chrome-linux.png new file mode 100644 index 0000000000..d0030387f5 Binary files /dev/null and b/core/src/components/checkbox/test/basic/checkbox.e2e.ts-snapshots/checkbox-basic-ios-ltr-Mobile-Chrome-linux.png differ diff --git a/core/src/components/checkbox/test/basic/checkbox.e2e.ts-snapshots/checkbox-basic-ios-ltr-Mobile-Firefox-linux.png b/core/src/components/checkbox/test/basic/checkbox.e2e.ts-snapshots/checkbox-basic-ios-ltr-Mobile-Firefox-linux.png new file mode 100644 index 0000000000..6d2ec7c206 Binary files /dev/null and b/core/src/components/checkbox/test/basic/checkbox.e2e.ts-snapshots/checkbox-basic-ios-ltr-Mobile-Firefox-linux.png differ diff --git a/core/src/components/checkbox/test/basic/checkbox.e2e.ts-snapshots/checkbox-basic-ios-ltr-Mobile-Safari-linux.png b/core/src/components/checkbox/test/basic/checkbox.e2e.ts-snapshots/checkbox-basic-ios-ltr-Mobile-Safari-linux.png new file mode 100644 index 0000000000..0b1b990b18 Binary files /dev/null and b/core/src/components/checkbox/test/basic/checkbox.e2e.ts-snapshots/checkbox-basic-ios-ltr-Mobile-Safari-linux.png differ diff --git a/core/src/components/checkbox/test/basic/checkbox.e2e.ts-snapshots/checkbox-basic-ios-rtl-Mobile-Chrome-linux.png b/core/src/components/checkbox/test/basic/checkbox.e2e.ts-snapshots/checkbox-basic-ios-rtl-Mobile-Chrome-linux.png new file mode 100644 index 0000000000..63fb9c4cc5 Binary files /dev/null and b/core/src/components/checkbox/test/basic/checkbox.e2e.ts-snapshots/checkbox-basic-ios-rtl-Mobile-Chrome-linux.png differ diff --git a/core/src/components/checkbox/test/basic/checkbox.e2e.ts-snapshots/checkbox-basic-ios-rtl-Mobile-Firefox-linux.png b/core/src/components/checkbox/test/basic/checkbox.e2e.ts-snapshots/checkbox-basic-ios-rtl-Mobile-Firefox-linux.png new file mode 100644 index 0000000000..b90d8a6b78 Binary files /dev/null and b/core/src/components/checkbox/test/basic/checkbox.e2e.ts-snapshots/checkbox-basic-ios-rtl-Mobile-Firefox-linux.png differ diff --git a/core/src/components/checkbox/test/basic/checkbox.e2e.ts-snapshots/checkbox-basic-ios-rtl-Mobile-Safari-linux.png b/core/src/components/checkbox/test/basic/checkbox.e2e.ts-snapshots/checkbox-basic-ios-rtl-Mobile-Safari-linux.png new file mode 100644 index 0000000000..c1aa53cf41 Binary files /dev/null and b/core/src/components/checkbox/test/basic/checkbox.e2e.ts-snapshots/checkbox-basic-ios-rtl-Mobile-Safari-linux.png differ diff --git a/core/src/components/checkbox/test/basic/checkbox.e2e.ts-snapshots/checkbox-basic-md-ltr-Mobile-Chrome-linux.png b/core/src/components/checkbox/test/basic/checkbox.e2e.ts-snapshots/checkbox-basic-md-ltr-Mobile-Chrome-linux.png new file mode 100644 index 0000000000..6d02bbcb6d Binary files /dev/null and b/core/src/components/checkbox/test/basic/checkbox.e2e.ts-snapshots/checkbox-basic-md-ltr-Mobile-Chrome-linux.png differ diff --git a/core/src/components/checkbox/test/basic/checkbox.e2e.ts-snapshots/checkbox-basic-md-ltr-Mobile-Firefox-linux.png b/core/src/components/checkbox/test/basic/checkbox.e2e.ts-snapshots/checkbox-basic-md-ltr-Mobile-Firefox-linux.png new file mode 100644 index 0000000000..1a4ebbfb1b Binary files /dev/null and b/core/src/components/checkbox/test/basic/checkbox.e2e.ts-snapshots/checkbox-basic-md-ltr-Mobile-Firefox-linux.png differ diff --git a/core/src/components/checkbox/test/basic/checkbox.e2e.ts-snapshots/checkbox-basic-md-ltr-Mobile-Safari-linux.png b/core/src/components/checkbox/test/basic/checkbox.e2e.ts-snapshots/checkbox-basic-md-ltr-Mobile-Safari-linux.png new file mode 100644 index 0000000000..cb8b676022 Binary files /dev/null and b/core/src/components/checkbox/test/basic/checkbox.e2e.ts-snapshots/checkbox-basic-md-ltr-Mobile-Safari-linux.png differ diff --git a/core/src/components/checkbox/test/basic/checkbox.e2e.ts-snapshots/checkbox-basic-md-rtl-Mobile-Chrome-linux.png b/core/src/components/checkbox/test/basic/checkbox.e2e.ts-snapshots/checkbox-basic-md-rtl-Mobile-Chrome-linux.png new file mode 100644 index 0000000000..b49bcc6693 Binary files /dev/null and b/core/src/components/checkbox/test/basic/checkbox.e2e.ts-snapshots/checkbox-basic-md-rtl-Mobile-Chrome-linux.png differ diff --git a/core/src/components/checkbox/test/basic/checkbox.e2e.ts-snapshots/checkbox-basic-md-rtl-Mobile-Firefox-linux.png b/core/src/components/checkbox/test/basic/checkbox.e2e.ts-snapshots/checkbox-basic-md-rtl-Mobile-Firefox-linux.png new file mode 100644 index 0000000000..0e1ca02cba Binary files /dev/null and b/core/src/components/checkbox/test/basic/checkbox.e2e.ts-snapshots/checkbox-basic-md-rtl-Mobile-Firefox-linux.png differ diff --git a/core/src/components/checkbox/test/basic/checkbox.e2e.ts-snapshots/checkbox-basic-md-rtl-Mobile-Safari-linux.png b/core/src/components/checkbox/test/basic/checkbox.e2e.ts-snapshots/checkbox-basic-md-rtl-Mobile-Safari-linux.png new file mode 100644 index 0000000000..4ea3f7b2fd Binary files /dev/null and b/core/src/components/checkbox/test/basic/checkbox.e2e.ts-snapshots/checkbox-basic-md-rtl-Mobile-Safari-linux.png differ diff --git a/core/src/components/checkbox/test/basic/e2e.ts b/core/src/components/checkbox/test/basic/e2e.ts deleted file mode 100644 index f97b1907aa..0000000000 --- a/core/src/components/checkbox/test/basic/e2e.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { newE2EPage } from '@stencil/core/testing'; - -test('checkbox: basic', async () => { - const page = await newE2EPage({ - url: '/src/components/checkbox/test/basic?ionic:_testing=true', - }); - - const compare = await page.compareScreenshot(); - expect(compare).toMatchScreenshot(); -}); diff --git a/core/src/components/checkbox/test/basic/index.html b/core/src/components/checkbox/test/basic/index.html index 3d70d70b0a..1ce484aef7 100644 --- a/core/src/components/checkbox/test/basic/index.html +++ b/core/src/components/checkbox/test/basic/index.html @@ -44,7 +44,7 @@ - Secondary + Secondary, disabled @@ -64,7 +64,7 @@ - Dark + Dark, --size @@ -83,11 +83,6 @@ - - Dark - - - Checkmark width @@ -109,33 +104,5 @@ - - diff --git a/core/src/components/checkbox/test/indeterminate/checkbox.e2e.ts b/core/src/components/checkbox/test/indeterminate/checkbox.e2e.ts new file mode 100644 index 0000000000..c6b0d99f95 --- /dev/null +++ b/core/src/components/checkbox/test/indeterminate/checkbox.e2e.ts @@ -0,0 +1,12 @@ +import { expect } from '@playwright/test'; +import { test } from '@utils/test/playwright'; + +test.describe('checkbox: indeterminate', () => { + test('should not have visual regressions', async ({ page }) => { + await page.goto(`/src/components/checkbox/test/indeterminate`); + + await page.setIonViewport(); + + expect(await page.screenshot()).toMatchSnapshot(`checkbox-indeterminate-${page.getSnapshotSettings()}.png`); + }); +}); diff --git a/core/src/components/checkbox/test/indeterminate/checkbox.e2e.ts-snapshots/checkbox-indeterminate-ios-ltr-Mobile-Chrome-linux.png b/core/src/components/checkbox/test/indeterminate/checkbox.e2e.ts-snapshots/checkbox-indeterminate-ios-ltr-Mobile-Chrome-linux.png new file mode 100644 index 0000000000..da540b2bba Binary files /dev/null and b/core/src/components/checkbox/test/indeterminate/checkbox.e2e.ts-snapshots/checkbox-indeterminate-ios-ltr-Mobile-Chrome-linux.png differ diff --git a/core/src/components/checkbox/test/indeterminate/checkbox.e2e.ts-snapshots/checkbox-indeterminate-ios-ltr-Mobile-Firefox-linux.png b/core/src/components/checkbox/test/indeterminate/checkbox.e2e.ts-snapshots/checkbox-indeterminate-ios-ltr-Mobile-Firefox-linux.png new file mode 100644 index 0000000000..5be4fb42ff Binary files /dev/null and b/core/src/components/checkbox/test/indeterminate/checkbox.e2e.ts-snapshots/checkbox-indeterminate-ios-ltr-Mobile-Firefox-linux.png differ diff --git a/core/src/components/checkbox/test/indeterminate/checkbox.e2e.ts-snapshots/checkbox-indeterminate-ios-ltr-Mobile-Safari-linux.png b/core/src/components/checkbox/test/indeterminate/checkbox.e2e.ts-snapshots/checkbox-indeterminate-ios-ltr-Mobile-Safari-linux.png new file mode 100644 index 0000000000..b581cdb0d0 Binary files /dev/null and b/core/src/components/checkbox/test/indeterminate/checkbox.e2e.ts-snapshots/checkbox-indeterminate-ios-ltr-Mobile-Safari-linux.png differ diff --git a/core/src/components/checkbox/test/indeterminate/checkbox.e2e.ts-snapshots/checkbox-indeterminate-ios-rtl-Mobile-Chrome-linux.png b/core/src/components/checkbox/test/indeterminate/checkbox.e2e.ts-snapshots/checkbox-indeterminate-ios-rtl-Mobile-Chrome-linux.png new file mode 100644 index 0000000000..89927e1744 Binary files /dev/null and b/core/src/components/checkbox/test/indeterminate/checkbox.e2e.ts-snapshots/checkbox-indeterminate-ios-rtl-Mobile-Chrome-linux.png differ diff --git a/core/src/components/checkbox/test/indeterminate/checkbox.e2e.ts-snapshots/checkbox-indeterminate-ios-rtl-Mobile-Firefox-linux.png b/core/src/components/checkbox/test/indeterminate/checkbox.e2e.ts-snapshots/checkbox-indeterminate-ios-rtl-Mobile-Firefox-linux.png new file mode 100644 index 0000000000..dddaf3c36b Binary files /dev/null and b/core/src/components/checkbox/test/indeterminate/checkbox.e2e.ts-snapshots/checkbox-indeterminate-ios-rtl-Mobile-Firefox-linux.png differ diff --git a/core/src/components/checkbox/test/indeterminate/checkbox.e2e.ts-snapshots/checkbox-indeterminate-ios-rtl-Mobile-Safari-linux.png b/core/src/components/checkbox/test/indeterminate/checkbox.e2e.ts-snapshots/checkbox-indeterminate-ios-rtl-Mobile-Safari-linux.png new file mode 100644 index 0000000000..163c70e77c Binary files /dev/null and b/core/src/components/checkbox/test/indeterminate/checkbox.e2e.ts-snapshots/checkbox-indeterminate-ios-rtl-Mobile-Safari-linux.png differ diff --git a/core/src/components/checkbox/test/indeterminate/checkbox.e2e.ts-snapshots/checkbox-indeterminate-md-ltr-Mobile-Chrome-linux.png b/core/src/components/checkbox/test/indeterminate/checkbox.e2e.ts-snapshots/checkbox-indeterminate-md-ltr-Mobile-Chrome-linux.png new file mode 100644 index 0000000000..1a23baadd3 Binary files /dev/null and b/core/src/components/checkbox/test/indeterminate/checkbox.e2e.ts-snapshots/checkbox-indeterminate-md-ltr-Mobile-Chrome-linux.png differ diff --git a/core/src/components/checkbox/test/indeterminate/checkbox.e2e.ts-snapshots/checkbox-indeterminate-md-ltr-Mobile-Firefox-linux.png b/core/src/components/checkbox/test/indeterminate/checkbox.e2e.ts-snapshots/checkbox-indeterminate-md-ltr-Mobile-Firefox-linux.png new file mode 100644 index 0000000000..d4ed7e2e7b Binary files /dev/null and b/core/src/components/checkbox/test/indeterminate/checkbox.e2e.ts-snapshots/checkbox-indeterminate-md-ltr-Mobile-Firefox-linux.png differ diff --git a/core/src/components/checkbox/test/indeterminate/checkbox.e2e.ts-snapshots/checkbox-indeterminate-md-ltr-Mobile-Safari-linux.png b/core/src/components/checkbox/test/indeterminate/checkbox.e2e.ts-snapshots/checkbox-indeterminate-md-ltr-Mobile-Safari-linux.png new file mode 100644 index 0000000000..f94bfce75c Binary files /dev/null and b/core/src/components/checkbox/test/indeterminate/checkbox.e2e.ts-snapshots/checkbox-indeterminate-md-ltr-Mobile-Safari-linux.png differ diff --git a/core/src/components/checkbox/test/indeterminate/checkbox.e2e.ts-snapshots/checkbox-indeterminate-md-rtl-Mobile-Chrome-linux.png b/core/src/components/checkbox/test/indeterminate/checkbox.e2e.ts-snapshots/checkbox-indeterminate-md-rtl-Mobile-Chrome-linux.png new file mode 100644 index 0000000000..be5424b42a Binary files /dev/null and b/core/src/components/checkbox/test/indeterminate/checkbox.e2e.ts-snapshots/checkbox-indeterminate-md-rtl-Mobile-Chrome-linux.png differ diff --git a/core/src/components/checkbox/test/indeterminate/checkbox.e2e.ts-snapshots/checkbox-indeterminate-md-rtl-Mobile-Firefox-linux.png b/core/src/components/checkbox/test/indeterminate/checkbox.e2e.ts-snapshots/checkbox-indeterminate-md-rtl-Mobile-Firefox-linux.png new file mode 100644 index 0000000000..0c2604c2b3 Binary files /dev/null and b/core/src/components/checkbox/test/indeterminate/checkbox.e2e.ts-snapshots/checkbox-indeterminate-md-rtl-Mobile-Firefox-linux.png differ diff --git a/core/src/components/checkbox/test/indeterminate/checkbox.e2e.ts-snapshots/checkbox-indeterminate-md-rtl-Mobile-Safari-linux.png b/core/src/components/checkbox/test/indeterminate/checkbox.e2e.ts-snapshots/checkbox-indeterminate-md-rtl-Mobile-Safari-linux.png new file mode 100644 index 0000000000..f0b3a1ca2d Binary files /dev/null and b/core/src/components/checkbox/test/indeterminate/checkbox.e2e.ts-snapshots/checkbox-indeterminate-md-rtl-Mobile-Safari-linux.png differ diff --git a/core/src/components/checkbox/test/indeterminate/e2e.ts b/core/src/components/checkbox/test/indeterminate/e2e.ts deleted file mode 100644 index e8b6e206ef..0000000000 --- a/core/src/components/checkbox/test/indeterminate/e2e.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { newE2EPage } from '@stencil/core/testing'; - -test('checkbox: indeterminate', async () => { - const page = await newE2EPage({ - url: '/src/components/checkbox/test/indeterminate?ionic:_testing=true', - }); - - const compare = await page.compareScreenshot(); - expect(compare).toMatchScreenshot(); -}); diff --git a/core/src/components/checkbox/test/indeterminate/index.html b/core/src/components/checkbox/test/indeterminate/index.html index 5b6740c196..97cc49d097 100644 --- a/core/src/components/checkbox/test/indeterminate/index.html +++ b/core/src/components/checkbox/test/indeterminate/index.html @@ -23,45 +23,6 @@ - - Native - - -
- - - -
- - - - -
- - - - -
- - - - -
-
- - - Ionic - - - Unchecked - - - - - Checked - - - Indeterminate diff --git a/core/src/components/checkbox/test/standalone/checkbox.e2e.ts b/core/src/components/checkbox/test/standalone/checkbox.e2e.ts new file mode 100644 index 0000000000..2c2261d735 --- /dev/null +++ b/core/src/components/checkbox/test/standalone/checkbox.e2e.ts @@ -0,0 +1,12 @@ +import { expect } from '@playwright/test'; +import { test } from '@utils/test/playwright'; + +test.describe('checkbox: standalone', () => { + test('should not have visual regressions', async ({ page }) => { + await page.goto(`/src/components/checkbox/test/standalone`); + + expect(await page.screenshot({ fullPage: true })).toMatchSnapshot( + `checkbox-standalone-${page.getSnapshotSettings()}.png` + ); + }); +}); diff --git a/core/src/components/checkbox/test/standalone/checkbox.e2e.ts-snapshots/checkbox-standalone-ios-ltr-Mobile-Chrome-linux.png b/core/src/components/checkbox/test/standalone/checkbox.e2e.ts-snapshots/checkbox-standalone-ios-ltr-Mobile-Chrome-linux.png new file mode 100644 index 0000000000..55030c9d6d Binary files /dev/null and b/core/src/components/checkbox/test/standalone/checkbox.e2e.ts-snapshots/checkbox-standalone-ios-ltr-Mobile-Chrome-linux.png differ diff --git a/core/src/components/checkbox/test/standalone/checkbox.e2e.ts-snapshots/checkbox-standalone-ios-ltr-Mobile-Firefox-linux.png b/core/src/components/checkbox/test/standalone/checkbox.e2e.ts-snapshots/checkbox-standalone-ios-ltr-Mobile-Firefox-linux.png new file mode 100644 index 0000000000..a4f5ae7fe7 Binary files /dev/null and b/core/src/components/checkbox/test/standalone/checkbox.e2e.ts-snapshots/checkbox-standalone-ios-ltr-Mobile-Firefox-linux.png differ diff --git a/core/src/components/checkbox/test/standalone/checkbox.e2e.ts-snapshots/checkbox-standalone-ios-ltr-Mobile-Safari-linux.png b/core/src/components/checkbox/test/standalone/checkbox.e2e.ts-snapshots/checkbox-standalone-ios-ltr-Mobile-Safari-linux.png new file mode 100644 index 0000000000..76415762c7 Binary files /dev/null and b/core/src/components/checkbox/test/standalone/checkbox.e2e.ts-snapshots/checkbox-standalone-ios-ltr-Mobile-Safari-linux.png differ diff --git a/core/src/components/checkbox/test/standalone/checkbox.e2e.ts-snapshots/checkbox-standalone-ios-rtl-Mobile-Chrome-linux.png b/core/src/components/checkbox/test/standalone/checkbox.e2e.ts-snapshots/checkbox-standalone-ios-rtl-Mobile-Chrome-linux.png new file mode 100644 index 0000000000..954e7f160c Binary files /dev/null and b/core/src/components/checkbox/test/standalone/checkbox.e2e.ts-snapshots/checkbox-standalone-ios-rtl-Mobile-Chrome-linux.png differ diff --git a/core/src/components/checkbox/test/standalone/checkbox.e2e.ts-snapshots/checkbox-standalone-ios-rtl-Mobile-Firefox-linux.png b/core/src/components/checkbox/test/standalone/checkbox.e2e.ts-snapshots/checkbox-standalone-ios-rtl-Mobile-Firefox-linux.png new file mode 100644 index 0000000000..ecbc04e5c5 Binary files /dev/null and b/core/src/components/checkbox/test/standalone/checkbox.e2e.ts-snapshots/checkbox-standalone-ios-rtl-Mobile-Firefox-linux.png differ diff --git a/core/src/components/checkbox/test/standalone/checkbox.e2e.ts-snapshots/checkbox-standalone-ios-rtl-Mobile-Safari-linux.png b/core/src/components/checkbox/test/standalone/checkbox.e2e.ts-snapshots/checkbox-standalone-ios-rtl-Mobile-Safari-linux.png new file mode 100644 index 0000000000..4153fb3390 Binary files /dev/null and b/core/src/components/checkbox/test/standalone/checkbox.e2e.ts-snapshots/checkbox-standalone-ios-rtl-Mobile-Safari-linux.png differ diff --git a/core/src/components/checkbox/test/standalone/checkbox.e2e.ts-snapshots/checkbox-standalone-md-ltr-Mobile-Chrome-linux.png b/core/src/components/checkbox/test/standalone/checkbox.e2e.ts-snapshots/checkbox-standalone-md-ltr-Mobile-Chrome-linux.png new file mode 100644 index 0000000000..81598b0d45 Binary files /dev/null and b/core/src/components/checkbox/test/standalone/checkbox.e2e.ts-snapshots/checkbox-standalone-md-ltr-Mobile-Chrome-linux.png differ diff --git a/core/src/components/checkbox/test/standalone/checkbox.e2e.ts-snapshots/checkbox-standalone-md-ltr-Mobile-Firefox-linux.png b/core/src/components/checkbox/test/standalone/checkbox.e2e.ts-snapshots/checkbox-standalone-md-ltr-Mobile-Firefox-linux.png new file mode 100644 index 0000000000..8c93806ec1 Binary files /dev/null and b/core/src/components/checkbox/test/standalone/checkbox.e2e.ts-snapshots/checkbox-standalone-md-ltr-Mobile-Firefox-linux.png differ diff --git a/core/src/components/checkbox/test/standalone/checkbox.e2e.ts-snapshots/checkbox-standalone-md-ltr-Mobile-Safari-linux.png b/core/src/components/checkbox/test/standalone/checkbox.e2e.ts-snapshots/checkbox-standalone-md-ltr-Mobile-Safari-linux.png new file mode 100644 index 0000000000..d9b0491056 Binary files /dev/null and b/core/src/components/checkbox/test/standalone/checkbox.e2e.ts-snapshots/checkbox-standalone-md-ltr-Mobile-Safari-linux.png differ diff --git a/core/src/components/checkbox/test/standalone/checkbox.e2e.ts-snapshots/checkbox-standalone-md-rtl-Mobile-Chrome-linux.png b/core/src/components/checkbox/test/standalone/checkbox.e2e.ts-snapshots/checkbox-standalone-md-rtl-Mobile-Chrome-linux.png new file mode 100644 index 0000000000..61a2c5524b Binary files /dev/null and b/core/src/components/checkbox/test/standalone/checkbox.e2e.ts-snapshots/checkbox-standalone-md-rtl-Mobile-Chrome-linux.png differ diff --git a/core/src/components/checkbox/test/standalone/checkbox.e2e.ts-snapshots/checkbox-standalone-md-rtl-Mobile-Firefox-linux.png b/core/src/components/checkbox/test/standalone/checkbox.e2e.ts-snapshots/checkbox-standalone-md-rtl-Mobile-Firefox-linux.png new file mode 100644 index 0000000000..6caf9ee9e1 Binary files /dev/null and b/core/src/components/checkbox/test/standalone/checkbox.e2e.ts-snapshots/checkbox-standalone-md-rtl-Mobile-Firefox-linux.png differ diff --git a/core/src/components/checkbox/test/standalone/checkbox.e2e.ts-snapshots/checkbox-standalone-md-rtl-Mobile-Safari-linux.png b/core/src/components/checkbox/test/standalone/checkbox.e2e.ts-snapshots/checkbox-standalone-md-rtl-Mobile-Safari-linux.png new file mode 100644 index 0000000000..07e3f2cb4b Binary files /dev/null and b/core/src/components/checkbox/test/standalone/checkbox.e2e.ts-snapshots/checkbox-standalone-md-rtl-Mobile-Safari-linux.png differ diff --git a/core/src/components/checkbox/test/standalone/e2e.ts b/core/src/components/checkbox/test/standalone/e2e.ts deleted file mode 100644 index 74bb013efa..0000000000 --- a/core/src/components/checkbox/test/standalone/e2e.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { newE2EPage } from '@stencil/core/testing'; - -test('checkbox: standalone', async () => { - const page = await newE2EPage({ - url: '/src/components/checkbox/test/standalone?ionic:_testing=true', - }); - - const compare = await page.compareScreenshot(); - expect(compare).toMatchScreenshot(); -}); diff --git a/core/src/components/datetime/datetime.scss b/core/src/components/datetime/datetime.scss index 6024e60d72..309e347de6 100644 --- a/core/src/components/datetime/datetime.scss +++ b/core/src/components/datetime/datetime.scss @@ -126,9 +126,8 @@ ion-picker-column-internal { } /** - * Safari 14 has an issue where Intersection - * Observer is incorrectly fired when - * unhiding the calendar content. + * Safari 14 has an issue where a scroll event + * is incorrectly fired when unhiding the calendar content. * To workaround this, we set the opacity * of the content to 0 and hide it offscreen. * diff --git a/core/src/components/datetime/datetime.tsx b/core/src/components/datetime/datetime.tsx index 3f167dfc3c..ec4732a437 100644 --- a/core/src/components/datetime/datetime.tsx +++ b/core/src/components/datetime/datetime.tsx @@ -68,7 +68,6 @@ export class Datetime implements ComponentInterface { private calendarBodyRef?: HTMLElement; private popoverRef?: HTMLIonPopoverElement; private clearFocusVisible?: () => void; - private overlayIsPresenting = false; /** * Whether to highlight the active day with a solid circle (as opposed @@ -86,9 +85,8 @@ export class Datetime implements ComponentInterface { private parsedYearValues?: number[]; private parsedDayValues?: number[]; - private destroyCalendarIO?: () => void; + private destroyCalendarListener?: () => void; private destroyKeyboardMO?: () => void; - private destroyOverlayListener?: () => void; private minParts?: any; private maxParts?: any; @@ -806,20 +804,17 @@ export class Datetime implements ComponentInterface { }; }; - private initializeCalendarIOListeners = () => { + private initializeCalendarListener = () => { const calendarBodyRef = this.getCalendarBodyEl(); if (!calendarBodyRef) { return; } - const mode = getIonMode(this); - /** * For performance reasons, we only render 3 * months at a time: The current month, the previous - * month, and the next month. We have IntersectionObservers - * on the previous and next month elements to append/prepend - * new months. + * month, and the next month. We have a scroll listener + * on the calendar body to append/prepend new months. * * We can do this because Stencil is smart enough to not * re-create the .calendar-month containers, but rather @@ -835,43 +830,78 @@ export class Datetime implements ComponentInterface { const startMonth = months[0] as HTMLElement; const workingMonth = months[1] as HTMLElement; const endMonth = months[2] as HTMLElement; + const mode = getIonMode(this); + const needsiOSRubberBandFix = mode === 'ios' && typeof navigator !== 'undefined' && navigator.maxTouchPoints > 1; /** - * Before setting up the IntersectionObserver, + * Before setting up the scroll listener, * scroll the middle month into view. * scrollIntoView() will scroll entire page * if element is not in viewport. Use scrollLeft instead. */ - let endIO: IntersectionObserver | undefined; - let startIO: IntersectionObserver | undefined; writeTask(() => { calendarBodyRef.scrollLeft = startMonth.clientWidth * (isRTL(this.el) ? -1 : 1); - const ioCallback = (callbackType: 'start' | 'end', entries: IntersectionObserverEntry[]) => { - const refIO = callbackType === 'start' ? startIO : endIO; - const refMonth = callbackType === 'start' ? startMonth : endMonth; - const refMonthFn = callbackType === 'start' ? getPreviousMonth : getNextMonth; + + const getChangedMonth = (parts: DatetimeParts): DatetimeParts | undefined => { + const box = calendarBodyRef.getBoundingClientRect(); + const root = this.el!.shadowRoot!; /** - * If the month is not fully in view, do not do anything + * Get the element that is in the center of the calendar body. + * This will be an element inside of the active month. */ - const ev = entries[0]; - if (!ev.isIntersecting) { + const elementAtCenter = root.elementFromPoint(box.x + box.width / 2, box.y + box.height / 2); + /** + * If there is no element then the + * component may be re-rendering on a slow device. + */ + if (!elementAtCenter) return; + + const month = elementAtCenter.closest('.calendar-month'); + if (!month) return; + + /** + * The edge of the month must be lined up with + * the edge of the calendar body in order for + * the component to update. Otherwise, it + * may be the case that the user has paused their + * swipe or the browser has not finished snapping yet. + * Rather than check if the x values are equal, + * we give it a tolerance of 2px to account for + * sub pixel rendering. + */ + const monthBox = month.getBoundingClientRect(); + if (Math.abs(monthBox.x - box.x) > 2) return; + + /** + * From here, we can determine if the start + * month or the end month was scrolled into view. + * If no month was changed, then we can return from + * the scroll callback early. + */ + if (month === startMonth) { + return getPreviousMonth(parts); + } else if (month === endMonth) { + return getNextMonth(parts); + } else { return; } + }; + + const updateActiveMonth = () => { + if (needsiOSRubberBandFix) { + calendarBodyRef.style.removeProperty('pointer-events'); + appliediOSRubberBandFix = false; + } /** - * When presenting an inline overlay, - * subsequent presentations will cause - * the IO to fire again (since the overlay - * is now visible and therefore the calendar - * months are intersecting). + * If the month did not change + * then we can return early. */ - if (this.overlayIsPresenting) { - this.overlayIsPresenting = false; - return; - } + const newDate = getChangedMonth(this.workingParts); + if (!newDate) return; - const { month, year, day } = refMonthFn(this.workingParts); + const { month, day, year } = newDate; if ( isMonthDisabled( @@ -885,25 +915,6 @@ export class Datetime implements ComponentInterface { return; } - /** - * On iOS, we need to set pointer-events: none - * when the user is almost done with the gesture - * so that they cannot quickly swipe while - * the scrollable container is snapping. - * Updating the container while snapping - * causes WebKit to snap incorrectly. - */ - if (mode === 'ios') { - const ratio = ev.intersectionRatio; - // `maxTouchPoints` will be 1 in device preview, but > 1 on device - const shouldDisable = Math.abs(ratio - 0.7) <= 0.1 && navigator.maxTouchPoints > 1; - - if (shouldDisable) { - calendarBodyRef.style.setProperty('pointer-events', 'none'); - return; - } - } - /** * Prevent scrolling for other browsers * to give the DOM time to update and the container @@ -911,16 +922,6 @@ export class Datetime implements ComponentInterface { */ calendarBodyRef.style.setProperty('overflow', 'hidden'); - /** - * Remove the IO temporarily - * otherwise you can sometimes get duplicate - * events when rubber banding. - */ - if (refIO === undefined) { - return; - } - refIO.disconnect(); - /** * Use a writeTask here to ensure * that the state is updated and the @@ -931,85 +932,57 @@ export class Datetime implements ComponentInterface { * if we did not do this. */ writeTask(() => { - // Disconnect all active intersection observers - // to avoid a re-render causing a duplicate event. - if (this.destroyCalendarIO) { - this.destroyCalendarIO(); - } - - raf(() => { - this.setWorkingParts({ - ...this.workingParts, - month, - day: day!, - year, - }); - - calendarBodyRef.scrollLeft = workingMonth.clientWidth * (isRTL(this.el) ? -1 : 1); - calendarBodyRef.style.removeProperty('overflow'); - calendarBodyRef.style.removeProperty('pointer-events'); - - endIO?.observe(endMonth); - startIO?.observe(startMonth); + this.setWorkingParts({ + ...this.workingParts, + month, + day: day!, + year, }); - /** - * Now that state has been updated - * and the correct month is in view, - * we can resume the IO. - */ - if (refIO === undefined) { - return; - } - refIO.observe(refMonth); + calendarBodyRef.scrollLeft = workingMonth.clientWidth * (isRTL(this.el) ? -1 : 1); + calendarBodyRef.style.removeProperty('overflow'); }); }; - const threshold = - mode === 'ios' && typeof navigator !== 'undefined' && navigator.maxTouchPoints > 1 ? [0.7, 1] : 1; - - // Intersection observers cannot accurately detect the - // intersection with a threshold of 1, when the observed - // element width is a sub-pixel value (i.e. 334.05px). - // Setting a root margin to 1px solves the issue. - const rootMargin = '1px'; + /** + * When the container finishes scrolling we + * need to update the DOM with the selected month. + */ + let scrollTimeout: ReturnType | undefined; /** - * Listen on the first month to - * prepend a new month and on the last - * month to append a new month. - * The 0.7 threshold is required on ios - * so that we can remove pointer-events - * when adding new months. - * Adding to a scroll snapping container - * while the container is snapping does not - * completely work as expected in WebKit. - * Adding pointer-events: none allows us to - * avoid these issues. - * - * This should be fine on Chromium, but - * when you set pointer-events: none - * it applies to active gestures which is not - * something WebKit does. + * We do not want to attempt to set pointer-events + * multiple times within a single swipe gesture as + * that adds unnecessary work to the main thread. */ + let appliediOSRubberBandFix = false; + const scrollCallback = () => { + if (scrollTimeout) { + clearTimeout(scrollTimeout); + } - endIO = new IntersectionObserver((ev) => ioCallback('end', ev), { - threshold, - root: calendarBodyRef, - rootMargin, - }); - endIO.observe(endMonth); + /** + * On iOS it is possible to quickly rubber band + * the scroll area before the scroll timeout has fired. + * This results in users reaching the end of the scrollable + * container before the DOM has updated. + * By setting `pointer-events: none` we can ensure that + * subsequent swipes do not happen while the container + * is snapping. + */ + if (!appliediOSRubberBandFix && needsiOSRubberBandFix) { + calendarBodyRef.style.setProperty('pointer-events', 'none'); + appliediOSRubberBandFix = true; + } - startIO = new IntersectionObserver((ev) => ioCallback('start', ev), { - threshold, - root: calendarBodyRef, - rootMargin, - }); - startIO.observe(startMonth); + // Wait ~3 frames + scrollTimeout = setTimeout(updateActiveMonth, 50); + }; - this.destroyCalendarIO = () => { - endIO?.disconnect(); - startIO?.disconnect(); + calendarBodyRef.addEventListener('scroll', scrollCallback); + + this.destroyCalendarListener = () => { + calendarBodyRef.removeEventListener('scroll', scrollCallback); }; }); }; @@ -1031,10 +1004,10 @@ export class Datetime implements ComponentInterface { * if the datetime has been hidden/presented by a modal or popover. */ private destroyInteractionListeners = () => { - const { destroyCalendarIO, destroyKeyboardMO } = this; + const { destroyCalendarListener, destroyKeyboardMO } = this; - if (destroyCalendarIO !== undefined) { - destroyCalendarIO(); + if (destroyCalendarListener !== undefined) { + destroyCalendarListener(); } if (destroyKeyboardMO !== undefined) { @@ -1043,9 +1016,8 @@ export class Datetime implements ComponentInterface { }; private initializeListeners() { - this.initializeCalendarIOListeners(); + this.initializeCalendarListener(); this.initializeKeyboardListeners(); - this.initializeOverlayListener(); } componentDidLoad() { @@ -1140,37 +1112,10 @@ export class Datetime implements ComponentInterface { this.prevPresentation = presentation; this.destroyInteractionListeners(); - if (this.destroyOverlayListener !== undefined) { - this.destroyOverlayListener(); - } this.initializeListeners(); } - /** - * When doing subsequent presentations of an inline - * overlay, the IO callback will fire again causing - * the calendar to go back one month. We need to listen - * for the presentation of the overlay so we can properly - * cancel that IO callback. - */ - private initializeOverlayListener = () => { - const overlay = this.el.closest('ion-popover, ion-modal'); - if (overlay === null) { - return; - } - - const overlayListener = () => { - this.overlayIsPresenting = true; - }; - - overlay.addEventListener('willPresent', overlayListener); - - this.destroyOverlayListener = () => { - overlay.removeEventListener('willPresent', overlayListener); - }; - }; - private processValue = (value?: string | string[] | null) => { this.highlightActiveParts = !!value; let valueToProcess = parseDate(value || getToday()); @@ -1471,11 +1416,12 @@ export class Datetime implements ComponentInterface { items={items} value={todayString} onIonChange={(ev: CustomEvent) => { + // TODO(FW-1823) Remove this when iOS 14 support is dropped. // Due to a Safari 14 issue we need to destroy - // the intersection observer before we update state + // the scroll listener before we update state // and trigger a re-render. - if (this.destroyCalendarIO) { - this.destroyCalendarIO(); + if (this.destroyCalendarListener) { + this.destroyCalendarListener(); } const { value } = ev.detail; @@ -1493,9 +1439,9 @@ export class Datetime implements ComponentInterface { }); } - // We can re-attach the intersection observer after + // We can re-attach the scroll listener after // the working parts have been updated. - this.initializeCalendarIOListeners(); + this.initializeCalendarListener(); ev.stopPropagation(); }} @@ -1569,11 +1515,12 @@ export class Datetime implements ComponentInterface { items={days} value={(workingParts.day || this.todayParts.day) ?? undefined} onIonChange={(ev: CustomEvent) => { + // TODO(FW-1823) Remove this when iOS 14 support is dropped. // Due to a Safari 14 issue we need to destroy - // the intersection observer before we update state + // the scroll listener before we update state // and trigger a re-render. - if (this.destroyCalendarIO) { - this.destroyCalendarIO(); + if (this.destroyCalendarListener) { + this.destroyCalendarListener(); } this.setWorkingParts({ @@ -1588,9 +1535,9 @@ export class Datetime implements ComponentInterface { }); } - // We can re-attach the intersection observer after + // We can re-attach the scroll listener after // the working parts have been updated. - this.initializeCalendarIOListeners(); + this.initializeCalendarListener(); ev.stopPropagation(); }} @@ -1612,11 +1559,12 @@ export class Datetime implements ComponentInterface { items={months} value={workingParts.month} onIonChange={(ev: CustomEvent) => { + // TODO(FW-1823) Remove this when iOS 14 support is dropped. // Due to a Safari 14 issue we need to destroy - // the intersection observer before we update state + // the scroll listener before we update state // and trigger a re-render. - if (this.destroyCalendarIO) { - this.destroyCalendarIO(); + if (this.destroyCalendarListener) { + this.destroyCalendarListener(); } this.setWorkingParts({ @@ -1631,9 +1579,9 @@ export class Datetime implements ComponentInterface { }); } - // We can re-attach the intersection observer after + // We can re-attach the scroll listener after // the working parts have been updated. - this.initializeCalendarIOListeners(); + this.initializeCalendarListener(); ev.stopPropagation(); }} @@ -1654,11 +1602,12 @@ export class Datetime implements ComponentInterface { items={years} value={workingParts.year} onIonChange={(ev: CustomEvent) => { + // TODO(FW-1823) Remove this when iOS 14 support is dropped. // Due to a Safari 14 issue we need to destroy - // the intersection observer before we update state + // the scroll listener before we update state // and trigger a re-render. - if (this.destroyCalendarIO) { - this.destroyCalendarIO(); + if (this.destroyCalendarListener) { + this.destroyCalendarListener(); } this.setWorkingParts({ @@ -1673,9 +1622,9 @@ export class Datetime implements ComponentInterface { }); } - // We can re-attach the intersection observer after + // We can re-attach the scroll listener after // the working parts have been updated. - this.initializeCalendarIOListeners(); + this.initializeCalendarListener(); ev.stopPropagation(); }} diff --git a/core/src/components/datetime/test/basic/datetime.e2e.ts b/core/src/components/datetime/test/basic/datetime.e2e.ts index cf11c992d5..5f4a41fafe 100644 --- a/core/src/components/datetime/test/basic/datetime.e2e.ts +++ b/core/src/components/datetime/test/basic/datetime.e2e.ts @@ -183,3 +183,69 @@ test.describe('datetime: footer', () => { ); }); }); + +test.describe('datetime: swiping', () => { + // eslint-disable-next-line no-empty-pattern + test.beforeEach(({}, testInfo) => { + test.skip(testInfo.project.metadata.rtl === true, 'This does not test LTR vs RTL layouts.'); + test.skip(testInfo.project.metadata.mode === 'ios', 'This does not have mode-specific logic.'); + }); + test('should move to prev month by swiping', async ({ page }) => { + await page.setContent(` + + `); + + await page.waitForSelector('.datetime-ready'); + + const calendarBody = page.locator('ion-datetime .calendar-body'); + const calendarHeader = page.locator('ion-datetime .calendar-month-year'); + + await expect(calendarHeader).toHaveText(/May 2022/); + + await calendarBody.evaluate((el: HTMLElement) => (el.scrollLeft = 0)); + await page.waitForChanges(); + + await expect(calendarHeader).toHaveText(/April 2022/); + }); + test('should move to next month by swiping', async ({ page }) => { + await page.setContent(` + + `); + + await page.waitForSelector('.datetime-ready'); + + const calendarBody = page.locator('ion-datetime .calendar-body'); + const calendarHeader = page.locator('ion-datetime .calendar-month-year'); + + await expect(calendarHeader).toHaveText(/May 2022/); + + await calendarBody.evaluate((el: HTMLElement) => (el.scrollLeft = el.scrollWidth)); + await page.waitForChanges(); + + await expect(calendarHeader).toHaveText(/June 2022/); + }); + test('should not re-render if swipe is in progress', async ({ page, browserName }) => { + test.skip(browserName === 'webkit', 'Wheel is not available in WebKit'); + + await page.setContent(` + + `); + + await page.waitForSelector('.datetime-ready'); + + const calendarBody = page.locator('ion-datetime .calendar-body'); + const calendarHeader = page.locator('ion-datetime .calendar-month-year'); + + await expect(calendarHeader).toHaveText(/May 2022/); + + const box = await calendarBody.boundingBox(); + + if (box) { + await page.mouse.move(box.x + box.width / 2, box.y + box.height / 2); + await page.mouse.wheel(-50, 0); + await page.waitForChanges(); + + await expect(calendarHeader).toHaveText(/May 2022/); + } + }); +}); diff --git a/core/src/components/datetime/test/minmax/datetime.e2e.ts b/core/src/components/datetime/test/minmax/datetime.e2e.ts index aae8b679f4..4a97594361 100644 --- a/core/src/components/datetime/test/minmax/datetime.e2e.ts +++ b/core/src/components/datetime/test/minmax/datetime.e2e.ts @@ -33,8 +33,8 @@ test.describe('datetime: minmax', () => { const prevButton = page.locator('ion-datetime .calendar-next-prev ion-button:nth-child(1)'); const nextButton = page.locator('ion-datetime .calendar-next-prev ion-button:nth-child(2)'); - await expect(nextButton).toBeEnabled(); - await expect(prevButton).toBeDisabled(); + await expect(nextButton).toHaveJSProperty('disabled', false); + await expect(prevButton).toHaveJSProperty('disabled', true); await page.evaluate('initDatetimeChangeEvent()'); @@ -45,8 +45,8 @@ test.describe('datetime: minmax', () => { await monthDidChangeSpy.next(); - await expect(nextButton).toBeDisabled(); - await expect(prevButton).toBeEnabled(); + await expect(nextButton).toHaveJSProperty('disabled', true); + await expect(prevButton).toHaveJSProperty('disabled', false); }); test('datetime: minmax months disabled', async ({ page }) => { diff --git a/core/src/components/datetime/test/sub-pixel-width/datetime.e2e.ts b/core/src/components/datetime/test/sub-pixel-width/datetime.e2e.ts deleted file mode 100644 index de79e99ffc..0000000000 --- a/core/src/components/datetime/test/sub-pixel-width/datetime.e2e.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { expect } from '@playwright/test'; -import { test } from '@utils/test/playwright'; - -test.describe('datetime: sub-pixel width', () => { - test.beforeEach(async ({ page }) => { - await page.goto('/src/components/datetime/test/sub-pixel-width'); - }); - test('should update the month when next button is clicked', async ({ page }) => { - const ionModalDidPresent = await page.spyOnEvent('ionModalDidPresent'); - const datetimeMonthDidChange = await page.spyOnEvent('datetimeMonthDidChange'); - - const openModalBtn = page.locator('#open-modal'); - - await openModalBtn.click(); - await ionModalDidPresent.next(); - await page.waitForSelector('.datetime-ready'); - - const buttons = page.locator('ion-datetime .calendar-next-prev ion-button'); - await buttons.nth(1).click(); - - await datetimeMonthDidChange.next(); - - const monthYear = page.locator('ion-datetime .calendar-month-year'); - await expect(monthYear).toHaveText('March 2022'); - }); - - test('should update the month when prev button is clicked', async ({ page }) => { - const ionModalDidPresent = await page.spyOnEvent('ionModalDidPresent'); - const datetimeMonthDidChange = await page.spyOnEvent('datetimeMonthDidChange'); - - const openModalBtn = page.locator('#open-modal'); - - await openModalBtn.click(); - await ionModalDidPresent.next(); - await page.waitForSelector('.datetime-ready'); - - const buttons = page.locator('ion-datetime .calendar-next-prev ion-button'); - await buttons.nth(0).click(); - - await datetimeMonthDidChange.next(); - - const monthYear = page.locator('ion-datetime .calendar-month-year'); - await expect(monthYear).toHaveText('January 2022'); - }); -}); diff --git a/core/src/components/datetime/test/sub-pixel-width/index.html b/core/src/components/datetime/test/sub-pixel-width/index.html deleted file mode 100644 index 87e58f328d..0000000000 --- a/core/src/components/datetime/test/sub-pixel-width/index.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - Datetime - Sub Pixel Width - - - - - - - - - - - - - Datetime - Sub Pixel Width - - - -

Modal

- Present Modal - -
- -
-
-
-
- - - - diff --git a/core/src/components/datetime/test/zoom/datetime-zoom-in.e2e.ts b/core/src/components/datetime/test/zoom/datetime-zoom-in.e2e.ts deleted file mode 100644 index 08cccc1ba3..0000000000 --- a/core/src/components/datetime/test/zoom/datetime-zoom-in.e2e.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { expect } from '@playwright/test'; -import { test } from '@utils/test/playwright'; - -test.use({ - viewport: { - width: 640, - height: 480, - }, - deviceScaleFactor: 2, -}); - -/** - * This test emulates zoom behavior in the browser to make sure - * that key functions of the ion-datetime continue to function even - * if the page is zoomed in or out. - */ -test.describe('datetime: zoom in interactivity', () => { - test.beforeEach(async ({ page }) => { - await page.goto('/src/components/datetime/test/zoom'); - }); - - test('should update the month when next button is clicked', async ({ page }) => { - const openModalBtn = page.locator('#open-modal'); - const ionModalDidPresent = await page.spyOnEvent('ionModalDidPresent'); - const datetimeMonthDidChange = await page.spyOnEvent('datetimeMonthDidChange'); - - await openModalBtn.click(); - await ionModalDidPresent.next(); - - const buttons = page.locator('ion-datetime .calendar-next-prev ion-button'); - - await buttons.nth(1).click(); - await datetimeMonthDidChange.next(); - - const monthYear = page.locator('ion-datetime .calendar-month-year'); - await expect(monthYear).toHaveText('March 2022'); - }); - - test('should update the month when prev button is clicked', async ({ page }) => { - const openModalBtn = page.locator('#open-modal'); - const ionModalDidPresent = await page.spyOnEvent('ionModalDidPresent'); - const datetimeMonthDidChange = await page.spyOnEvent('datetimeMonthDidChange'); - - await openModalBtn.click(); - await ionModalDidPresent.next(); - - const buttons = page.locator('ion-datetime .calendar-next-prev ion-button'); - - await buttons.nth(0).click(); - await datetimeMonthDidChange.next(); - - const monthYear = page.locator('ion-datetime .calendar-month-year'); - await expect(monthYear).toHaveText('January 2022'); - }); -}); diff --git a/core/src/components/datetime/test/zoom/datetime-zoom-out.e2e.ts b/core/src/components/datetime/test/zoom/datetime-zoom-out.e2e.ts deleted file mode 100644 index c4e131417b..0000000000 --- a/core/src/components/datetime/test/zoom/datetime-zoom-out.e2e.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { expect } from '@playwright/test'; -import { test } from '@utils/test/playwright'; - -test.use({ - viewport: { - width: 640, - height: 480, - }, - deviceScaleFactor: 0.75, -}); - -/** - * This test emulates zoom behavior in the browser to make sure - * that key functions of the ion-datetime continue to function even - * if the page is zoomed in or out. - */ -test.describe('datetime: zoom out interactivity', () => { - test.beforeEach(async ({ page }) => { - await page.goto('/src/components/datetime/test/zoom'); - }); - - test('should update the month when next button is clicked', async ({ page }) => { - const openModalBtn = page.locator('#open-modal'); - const ionModalDidPresent = await page.spyOnEvent('ionModalDidPresent'); - const datetimeMonthDidChange = await page.spyOnEvent('datetimeMonthDidChange'); - - await openModalBtn.click(); - await ionModalDidPresent.next(); - - const buttons = page.locator('ion-datetime .calendar-next-prev ion-button'); - - await buttons.nth(1).click(); - await datetimeMonthDidChange.next(); - - const monthYear = page.locator('ion-datetime .calendar-month-year'); - await expect(monthYear).toHaveText('March 2022'); - }); - - test('should update the month when prev button is clicked', async ({ page }) => { - const openModalBtn = page.locator('#open-modal'); - const ionModalDidPresent = await page.spyOnEvent('ionModalDidPresent'); - const datetimeMonthDidChange = await page.spyOnEvent('datetimeMonthDidChange'); - - await openModalBtn.click(); - await ionModalDidPresent.next(); - - const buttons = page.locator('ion-datetime .calendar-next-prev ion-button'); - - await buttons.nth(0).click(); - await datetimeMonthDidChange.next(); - - const monthYear = page.locator('ion-datetime .calendar-month-year'); - await expect(monthYear).toHaveText('January 2022'); - }); -}); diff --git a/core/src/components/datetime/test/zoom/index.html b/core/src/components/datetime/test/zoom/index.html deleted file mode 100644 index 087b459878..0000000000 --- a/core/src/components/datetime/test/zoom/index.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - Datetime - Zoom - - - - - - - - - - - - - Datetime - Zoom - - - -

Modal

- Present Modal - -
- -
-
-
-
- - - - diff --git a/core/src/components/fab-button/fab-button.tsx b/core/src/components/fab-button/fab-button.tsx index 0597a1d879..36e870da0e 100755 --- a/core/src/components/fab-button/fab-button.tsx +++ b/core/src/components/fab-button/fab-button.tsx @@ -5,6 +5,8 @@ import { close } from 'ionicons/icons'; import { getIonMode } from '../../global/ionic-global'; import type { AnimationBuilder, Color, RouterDirection } from '../../interface'; import type { AnchorInterface, ButtonInterface } from '../../utils/element-interface'; +import { inheritAriaAttributes } from '../../utils/helpers'; +import type { Attributes } from '../../utils/helpers'; import { createColorClasses, hostContext, openURL } from '../../utils/theme'; /** @@ -23,6 +25,7 @@ import { createColorClasses, hostContext, openURL } from '../../utils/theme'; }) export class FabButton implements ComponentInterface, AnchorInterface, ButtonInterface { private fab: HTMLIonFabElement | null = null; + private inheritedAttributes: Attributes = {}; @Element() el!: HTMLElement; @@ -142,8 +145,12 @@ export class FabButton implements ComponentInterface, AnchorInterface, ButtonInt fab.toggle(); }; + componentWillLoad() { + this.inheritedAttributes = inheritAriaAttributes(this.el); + } + render() { - const { el, disabled, color, href, activated, show, translucent, size } = this; + const { el, disabled, color, href, activated, show, translucent, size, inheritedAttributes } = this; const inList = hostContext('ion-fab-list', el); const mode = getIonMode(this); const TagType = href === undefined ? 'button' : ('a' as any); @@ -182,6 +189,7 @@ export class FabButton implements ComponentInterface, AnchorInterface, ButtonInt onFocus={this.onFocus} onBlur={this.onBlur} onClick={(ev: Event) => openURL(href, ev, this.routerDirection, this.routerAnimation)} + {...inheritedAttributes} > diff --git a/core/src/components/fab-button/test/fab-button.spec.ts b/core/src/components/fab-button/test/fab-button.spec.ts new file mode 100644 index 0000000000..930fcea9bc --- /dev/null +++ b/core/src/components/fab-button/test/fab-button.spec.ts @@ -0,0 +1,19 @@ +import { newSpecPage } from '@stencil/core/testing'; + +import { FabButton } from '../fab-button'; + +describe('fab-button: aria attributes', () => { + it('should inherit aria attributes to inner