diff --git a/.github/workflows/actions/download-archive/action.yml b/.github/workflows/actions/download-archive/action.yml
index 04cf5108f26..343e2451bce 100644
--- a/.github/workflows/actions/download-archive/action.yml
+++ b/.github/workflows/actions/download-archive/action.yml
@@ -10,7 +10,7 @@ inputs:
runs:
using: 'composite'
steps:
- - uses: actions/download-artifact@v4
+ - uses: actions/download-artifact@v5
with:
name: ${{ inputs.name }}
path: ${{ inputs.path }}
diff --git a/.github/workflows/actions/test-angular-e2e/action.yml b/.github/workflows/actions/test-angular-e2e/action.yml
index 53abb4e0af3..705d6e27cf4 100644
--- a/.github/workflows/actions/test-angular-e2e/action.yml
+++ b/.github/workflows/actions/test-angular-e2e/action.yml
@@ -32,6 +32,10 @@ runs:
run: npm install
shell: bash
working-directory: ./packages/angular/test/build/${{ inputs.app }}
+ - name: Install Playwright Browsers
+ run: npx playwright install
+ shell: bash
+ working-directory: ./packages/angular/test/build/${{ inputs.app }}
- name: Sync Built Changes
run: npm run sync
shell: bash
diff --git a/.github/workflows/actions/update-reference-screenshots/action.yml b/.github/workflows/actions/update-reference-screenshots/action.yml
index 256676fe484..d454b2e2a32 100644
--- a/.github/workflows/actions/update-reference-screenshots/action.yml
+++ b/.github/workflows/actions/update-reference-screenshots/action.yml
@@ -10,7 +10,7 @@ runs:
- uses: actions/setup-node@v4
with:
node-version: 22.x
- - uses: actions/download-artifact@v4
+ - uses: actions/download-artifact@v5
with:
path: ./artifacts
- name: Extract Archives
diff --git a/CHANGELOG.md b/CHANGELOG.md
index f6eba907eb6..0ba2f3e326c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,9 +3,23 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [8.7.2](https://github.com/ionic-team/ionic-framework/compare/v8.7.1...v8.7.2) (2025-08-06)
+
+
+### Bug Fixes
+
+* **reorder-group:** add children fallback for framework compatibility ([#30593](https://github.com/ionic-team/ionic-framework/issues/30593)) ([1cd81b9](https://github.com/ionic-team/ionic-framework/commit/1cd81b92301378d55bce63a01dfcf95a91c92652)), closes [#30592](https://github.com/ionic-team/ionic-framework/issues/30592)
+* **tabs:** add fallback to select tab if router integration fails ([#30599](https://github.com/ionic-team/ionic-framework/issues/30599)) ([a2e803a](https://github.com/ionic-team/ionic-framework/commit/a2e803a553dc58fc0e1599e515a56180a7ab263a)), closes [#30552](https://github.com/ionic-team/ionic-framework/issues/30552)
+
+
+
+
+
## [8.7.1](https://github.com/ionic-team/ionic-framework/compare/v8.7.0...v8.7.1) (2025-07-31)
-**Note:** Version bump only for package ionic-framework
+### Dependencies
+
+* **stencil:** upgrade `@stencil/core` to version 4.36.2
diff --git a/core/CHANGELOG.md b/core/CHANGELOG.md
index da5ccc20cd6..ebbd0421168 100644
--- a/core/CHANGELOG.md
+++ b/core/CHANGELOG.md
@@ -3,9 +3,23 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [8.7.2](https://github.com/ionic-team/ionic-framework/compare/v8.7.1...v8.7.2) (2025-08-06)
+
+
+### Bug Fixes
+
+* **reorder-group:** add children fallback for framework compatibility ([#30593](https://github.com/ionic-team/ionic-framework/issues/30593)) ([1cd81b9](https://github.com/ionic-team/ionic-framework/commit/1cd81b92301378d55bce63a01dfcf95a91c92652)), closes [#30592](https://github.com/ionic-team/ionic-framework/issues/30592)
+* **tabs:** add fallback to select tab if router integration fails ([#30599](https://github.com/ionic-team/ionic-framework/issues/30599)) ([a2e803a](https://github.com/ionic-team/ionic-framework/commit/a2e803a553dc58fc0e1599e515a56180a7ab263a)), closes [#30552](https://github.com/ionic-team/ionic-framework/issues/30552)
+
+
+
+
+
## [8.7.1](https://github.com/ionic-team/ionic-framework/compare/v8.7.0...v8.7.1) (2025-07-31)
-**Note:** Version bump only for package @ionic/core
+### Dependencies
+
+* **stencil:** upgrade `@stencil/core` to version 4.36.2
diff --git a/core/Dockerfile b/core/Dockerfile
index 5f24265654f..ab667d50f97 100644
--- a/core/Dockerfile
+++ b/core/Dockerfile
@@ -1,5 +1,5 @@
# Get Playwright
-FROM mcr.microsoft.com/playwright:v1.54.1
+FROM mcr.microsoft.com/playwright:v1.54.2
# Set the working directory
WORKDIR /ionic
diff --git a/core/package-lock.json b/core/package-lock.json
index dea13cadf94..95b0695eaa7 100644
--- a/core/package-lock.json
+++ b/core/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "@ionic/core",
- "version": "8.7.1",
+ "version": "8.7.2",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@ionic/core",
- "version": "8.7.1",
+ "version": "8.7.2",
"license": "MIT",
"dependencies": {
"@stencil/core": "4.36.2",
@@ -22,13 +22,13 @@
"@clack/prompts": "^0.11.0",
"@ionic/eslint-config": "^0.3.0",
"@ionic/prettier-config": "^2.0.0",
- "@playwright/test": "^1.54.1",
+ "@playwright/test": "^1.54.2",
"@rollup/plugin-node-resolve": "^8.4.0",
"@rollup/plugin-virtual": "^2.0.3",
- "@stencil/angular-output-target": "^0.10.0",
+ "@stencil/angular-output-target": "^1.0.0",
"@stencil/react-output-target": "0.5.3",
"@stencil/sass": "^3.0.9",
- "@stencil/vue-output-target": "0.10.8",
+ "@stencil/vue-output-target": "0.11.8",
"@types/jest": "^29.5.6",
"@types/node": "^14.6.0",
"@typescript-eslint/eslint-plugin": "^6.7.2",
@@ -672,27 +672,27 @@
}
},
"node_modules/@capacitor/haptics": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/@capacitor/haptics/-/haptics-7.0.1.tgz",
- "integrity": "sha512-ewZmspE5krgDUj5ZvUDcfNZvgerAIr+3bDSk6DLzyvBZ/dYmr/tMLu5H6WtYaaKYZJ32aZAudGpIal5epDyBYA==",
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/@capacitor/haptics/-/haptics-7.0.2.tgz",
+ "integrity": "sha512-vqfeEM6s2zMgLjpITCTUIy7P/hadq/Gr5E/RClFgMJPB41Y5FsqOKD+j85/uwh8N2cf/aWaPeXUmjnTzJbEB2g==",
"dev": true,
"peerDependencies": {
"@capacitor/core": ">=7.0.0"
}
},
"node_modules/@capacitor/keyboard": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/@capacitor/keyboard/-/keyboard-7.0.1.tgz",
- "integrity": "sha512-Gi064vOARMac+x9/DmEFeywN9oAETMf3OYsMuYm9gA8SvdsDJ3QJqMoFnSEIORYXe21Jzt2SIEdLlpT65P/b2g==",
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/@capacitor/keyboard/-/keyboard-7.0.2.tgz",
+ "integrity": "sha512-9We5BY1mu+QWOReDukr+6HxA4Bh0mKBU0txFtwXJdjBohttMYWJzB+dQf4oHrX8odiU2Cm/BfDdAU2wV06Cyig==",
"dev": true,
"peerDependencies": {
"@capacitor/core": ">=7.0.0"
}
},
"node_modules/@capacitor/status-bar": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/@capacitor/status-bar/-/status-bar-7.0.1.tgz",
- "integrity": "sha512-iDv3mXYo9CdxYRVwt3/pRyuk25p7Sn4GfaS/zMZyVIqTzsvKLCIIH3GdKK+ta+nsNcAVpCw/t5jFEBt1D18ctA==",
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/@capacitor/status-bar/-/status-bar-7.0.2.tgz",
+ "integrity": "sha512-fYYkkdzCbQV+MjZVnaQTFl5I4bddnFW8ZrPVxDjNoGVPTUG7H58Ij1+NcuNxHLXjJvZOoZeYJ3w3I16Wb2zssw==",
"dev": true,
"peerDependencies": {
"@capacitor/core": ">=7.0.0"
@@ -1715,12 +1715,12 @@
}
},
"node_modules/@playwright/test": {
- "version": "1.54.1",
- "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.54.1.tgz",
- "integrity": "sha512-FS8hQ12acieG2dYSksmLOF7BNxnVf2afRJdCuM1eMSxj6QTSE6G4InGF7oApGgDb65MX7AwMVlIkpru0yZA4Xw==",
+ "version": "1.54.2",
+ "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.54.2.tgz",
+ "integrity": "sha512-A+znathYxPf+72riFd1r1ovOLqsIIB0jKIoPjyK2kqEIe30/6jF6BC7QNluHuwUmsD2tv1XZVugN8GqfTMOxsA==",
"dev": true,
"dependencies": {
- "playwright": "1.54.1"
+ "playwright": "1.54.2"
},
"bin": {
"playwright": "cli.js"
@@ -1905,9 +1905,9 @@
}
},
"node_modules/@stencil/angular-output-target": {
- "version": "0.10.2",
- "resolved": "https://registry.npmjs.org/@stencil/angular-output-target/-/angular-output-target-0.10.2.tgz",
- "integrity": "sha512-jPRa2NMAPtm/iMY+mUaWATbIhgY5zPJfUNQyF8nwC0rMrfXifPoRCf6BbH2S4Gy7SX0X4hlP+jAbVUjQNg/P+Q==",
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@stencil/angular-output-target/-/angular-output-target-1.0.0.tgz",
+ "integrity": "sha512-6/XtjEWlJS+40b3x2geCV43rjQKlHS/a1/62QjYGXBtHhMo92KyGwKns3ntmX6B4fdk/xAKehxD2WKtHIM3oxQ==",
"dev": true,
"peerDependencies": {
"@stencil/core": ">=2.0.0 || >=3 || >= 4.0.0-beta.0 || >= 4.0.0"
@@ -1960,9 +1960,9 @@
}
},
"node_modules/@stencil/vue-output-target": {
- "version": "0.10.8",
- "resolved": "https://registry.npmjs.org/@stencil/vue-output-target/-/vue-output-target-0.10.8.tgz",
- "integrity": "sha512-/a20LG29xqy/lxBqo6zc1LbyS20GW9xghypZ7vYdo5fQB8jHClAQDkn+c8aykQlre5TtHiODgvr/rRDUrQKwyg==",
+ "version": "0.11.8",
+ "resolved": "https://registry.npmjs.org/@stencil/vue-output-target/-/vue-output-target-0.11.8.tgz",
+ "integrity": "sha512-R/kQoN15irgL7NJxWaUNSmwDLfoDBZjlYaXNnW3LHlF30TYfyez6pRgD7ZglSSTVktMtCXz6ZPhg0uq59VkhOw==",
"dev": true,
"peerDependencies": {
"@stencil/core": ">=2.0.0 || >=3 || >= 4.0.0-beta.0 || >= 4.0.0",
@@ -3474,9 +3474,9 @@
]
},
"node_modules/chalk": {
- "version": "5.4.1",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz",
- "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==",
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.5.0.tgz",
+ "integrity": "sha512-1tm8DTaJhPBG3bIkVeZt1iZM9GfSX2lzOeDVZH9R9ffRHpmHvxZ/QhgQH/aDTkswQVt+YHdXAdS/In/30OjCbg==",
"dev": true,
"engines": {
"node": "^12.17.0 || ^14.13 || >=16.0.0"
@@ -8593,12 +8593,12 @@
}
},
"node_modules/playwright": {
- "version": "1.54.1",
- "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.54.1.tgz",
- "integrity": "sha512-peWpSwIBmSLi6aW2auvrUtf2DqY16YYcCMO8rTVx486jKmDTJg7UAhyrraP98GB8BoPURZP8+nxO7TSd4cPr5g==",
+ "version": "1.54.2",
+ "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.54.2.tgz",
+ "integrity": "sha512-Hu/BMoA1NAdRUuulyvQC0pEqZ4vQbGfn8f7wPXcnqQmM+zct9UliKxsIkLNmz/ku7LElUNqmaiv1TG/aL5ACsw==",
"dev": true,
"dependencies": {
- "playwright-core": "1.54.1"
+ "playwright-core": "1.54.2"
},
"bin": {
"playwright": "cli.js"
@@ -8611,9 +8611,9 @@
}
},
"node_modules/playwright-core": {
- "version": "1.54.1",
- "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.54.1.tgz",
- "integrity": "sha512-Nbjs2zjj0htNhzgiy5wu+3w09YetDx5pkrpI/kZotDlDUaYk0HVA5xrBVPdow4SAUIlhgKcJeJg4GRKW6xHusA==",
+ "version": "1.54.2",
+ "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.54.2.tgz",
+ "integrity": "sha512-n5r4HFbMmWsB4twG7tJLDN9gmBUeSPcsBZiWSE4DnYz9mJMAFqr2ID7+eGC9kpEnxExJ1epttwR59LEWCk8mtA==",
"dev": true,
"bin": {
"playwright-core": "cli.js"
@@ -11111,23 +11111,23 @@
}
},
"@capacitor/haptics": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/@capacitor/haptics/-/haptics-7.0.1.tgz",
- "integrity": "sha512-ewZmspE5krgDUj5ZvUDcfNZvgerAIr+3bDSk6DLzyvBZ/dYmr/tMLu5H6WtYaaKYZJ32aZAudGpIal5epDyBYA==",
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/@capacitor/haptics/-/haptics-7.0.2.tgz",
+ "integrity": "sha512-vqfeEM6s2zMgLjpITCTUIy7P/hadq/Gr5E/RClFgMJPB41Y5FsqOKD+j85/uwh8N2cf/aWaPeXUmjnTzJbEB2g==",
"dev": true,
"requires": {}
},
"@capacitor/keyboard": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/@capacitor/keyboard/-/keyboard-7.0.1.tgz",
- "integrity": "sha512-Gi064vOARMac+x9/DmEFeywN9oAETMf3OYsMuYm9gA8SvdsDJ3QJqMoFnSEIORYXe21Jzt2SIEdLlpT65P/b2g==",
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/@capacitor/keyboard/-/keyboard-7.0.2.tgz",
+ "integrity": "sha512-9We5BY1mu+QWOReDukr+6HxA4Bh0mKBU0txFtwXJdjBohttMYWJzB+dQf4oHrX8odiU2Cm/BfDdAU2wV06Cyig==",
"dev": true,
"requires": {}
},
"@capacitor/status-bar": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/@capacitor/status-bar/-/status-bar-7.0.1.tgz",
- "integrity": "sha512-iDv3mXYo9CdxYRVwt3/pRyuk25p7Sn4GfaS/zMZyVIqTzsvKLCIIH3GdKK+ta+nsNcAVpCw/t5jFEBt1D18ctA==",
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/@capacitor/status-bar/-/status-bar-7.0.2.tgz",
+ "integrity": "sha512-fYYkkdzCbQV+MjZVnaQTFl5I4bddnFW8ZrPVxDjNoGVPTUG7H58Ij1+NcuNxHLXjJvZOoZeYJ3w3I16Wb2zssw==",
"dev": true,
"requires": {}
},
@@ -11863,12 +11863,12 @@
}
},
"@playwright/test": {
- "version": "1.54.1",
- "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.54.1.tgz",
- "integrity": "sha512-FS8hQ12acieG2dYSksmLOF7BNxnVf2afRJdCuM1eMSxj6QTSE6G4InGF7oApGgDb65MX7AwMVlIkpru0yZA4Xw==",
+ "version": "1.54.2",
+ "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.54.2.tgz",
+ "integrity": "sha512-A+znathYxPf+72riFd1r1ovOLqsIIB0jKIoPjyK2kqEIe30/6jF6BC7QNluHuwUmsD2tv1XZVugN8GqfTMOxsA==",
"dev": true,
"requires": {
- "playwright": "1.54.1"
+ "playwright": "1.54.2"
}
},
"@rollup/plugin-node-resolve": {
@@ -11977,9 +11977,9 @@
}
},
"@stencil/angular-output-target": {
- "version": "0.10.2",
- "resolved": "https://registry.npmjs.org/@stencil/angular-output-target/-/angular-output-target-0.10.2.tgz",
- "integrity": "sha512-jPRa2NMAPtm/iMY+mUaWATbIhgY5zPJfUNQyF8nwC0rMrfXifPoRCf6BbH2S4Gy7SX0X4hlP+jAbVUjQNg/P+Q==",
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@stencil/angular-output-target/-/angular-output-target-1.0.0.tgz",
+ "integrity": "sha512-6/XtjEWlJS+40b3x2geCV43rjQKlHS/a1/62QjYGXBtHhMo92KyGwKns3ntmX6B4fdk/xAKehxD2WKtHIM3oxQ==",
"dev": true,
"requires": {}
},
@@ -12013,9 +12013,9 @@
"requires": {}
},
"@stencil/vue-output-target": {
- "version": "0.10.8",
- "resolved": "https://registry.npmjs.org/@stencil/vue-output-target/-/vue-output-target-0.10.8.tgz",
- "integrity": "sha512-/a20LG29xqy/lxBqo6zc1LbyS20GW9xghypZ7vYdo5fQB8jHClAQDkn+c8aykQlre5TtHiODgvr/rRDUrQKwyg==",
+ "version": "0.11.8",
+ "resolved": "https://registry.npmjs.org/@stencil/vue-output-target/-/vue-output-target-0.11.8.tgz",
+ "integrity": "sha512-R/kQoN15irgL7NJxWaUNSmwDLfoDBZjlYaXNnW3LHlF30TYfyez6pRgD7ZglSSTVktMtCXz6ZPhg0uq59VkhOw==",
"dev": true,
"requires": {}
},
@@ -13076,9 +13076,9 @@
"dev": true
},
"chalk": {
- "version": "5.4.1",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz",
- "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==",
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.5.0.tgz",
+ "integrity": "sha512-1tm8DTaJhPBG3bIkVeZt1iZM9GfSX2lzOeDVZH9R9ffRHpmHvxZ/QhgQH/aDTkswQVt+YHdXAdS/In/30OjCbg==",
"dev": true
},
"chalk-template": {
@@ -16812,19 +16812,19 @@
}
},
"playwright": {
- "version": "1.54.1",
- "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.54.1.tgz",
- "integrity": "sha512-peWpSwIBmSLi6aW2auvrUtf2DqY16YYcCMO8rTVx486jKmDTJg7UAhyrraP98GB8BoPURZP8+nxO7TSd4cPr5g==",
+ "version": "1.54.2",
+ "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.54.2.tgz",
+ "integrity": "sha512-Hu/BMoA1NAdRUuulyvQC0pEqZ4vQbGfn8f7wPXcnqQmM+zct9UliKxsIkLNmz/ku7LElUNqmaiv1TG/aL5ACsw==",
"dev": true,
"requires": {
"fsevents": "2.3.2",
- "playwright-core": "1.54.1"
+ "playwright-core": "1.54.2"
}
},
"playwright-core": {
- "version": "1.54.1",
- "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.54.1.tgz",
- "integrity": "sha512-Nbjs2zjj0htNhzgiy5wu+3w09YetDx5pkrpI/kZotDlDUaYk0HVA5xrBVPdow4SAUIlhgKcJeJg4GRKW6xHusA==",
+ "version": "1.54.2",
+ "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.54.2.tgz",
+ "integrity": "sha512-n5r4HFbMmWsB4twG7tJLDN9gmBUeSPcsBZiWSE4DnYz9mJMAFqr2ID7+eGC9kpEnxExJ1epttwR59LEWCk8mtA==",
"dev": true
},
"postcss": {
diff --git a/core/package.json b/core/package.json
index addc0facfe5..16224583ca8 100644
--- a/core/package.json
+++ b/core/package.json
@@ -1,6 +1,6 @@
{
"name": "@ionic/core",
- "version": "8.7.1",
+ "version": "8.7.2",
"description": "Base components for Ionic",
"keywords": [
"ionic",
@@ -44,13 +44,13 @@
"@clack/prompts": "^0.11.0",
"@ionic/eslint-config": "^0.3.0",
"@ionic/prettier-config": "^2.0.0",
- "@playwright/test": "^1.54.1",
+ "@playwright/test": "^1.54.2",
"@rollup/plugin-node-resolve": "^8.4.0",
"@rollup/plugin-virtual": "^2.0.3",
- "@stencil/angular-output-target": "^0.10.0",
+ "@stencil/angular-output-target": "^1.0.0",
"@stencil/react-output-target": "0.5.3",
"@stencil/sass": "^3.0.9",
- "@stencil/vue-output-target": "0.10.8",
+ "@stencil/vue-output-target": "0.11.8",
"@types/jest": "^29.5.6",
"@types/node": "^14.6.0",
"@typescript-eslint/eslint-plugin": "^6.7.2",
diff --git a/core/src/components/datetime/test/custom/datetime.e2e.ts b/core/src/components/datetime/test/custom/datetime.e2e.ts
index 5563bc6c107..60339fbf742 100644
--- a/core/src/components/datetime/test/custom/datetime.e2e.ts
+++ b/core/src/components/datetime/test/custom/datetime.e2e.ts
@@ -5,6 +5,8 @@ configs({ directions: ['ltr'] }).forEach(({ title, screenshot, config }) => {
test.describe(title('datetime: custom'), () => {
test.beforeEach(async ({ page }) => {
await page.goto(`/src/components/datetime/test/custom`, config);
+
+ await page.locator('.datetime-ready').last().waitFor();
});
test('should allow styling wheel style datetimes', async ({ page }) => {
@@ -30,6 +32,13 @@ configs({ directions: ['ltr'] }).forEach(({ title, screenshot, config }) => {
test('should allow styling calendar days in grid style datetimes', async ({ page }) => {
const datetime = page.locator('#custom-calendar-days');
+ // Wait for calendar days to be rendered
+ await page.waitForFunction(() => {
+ const datetime = document.querySelector('#custom-calendar-days');
+ const calendarDays = datetime?.shadowRoot?.querySelectorAll('.calendar-day');
+ return calendarDays && calendarDays.length > 0;
+ });
+
await expect(datetime).toHaveScreenshot(screenshot(`datetime-custom-calendar-days`));
});
});
diff --git a/core/src/components/datetime/test/custom/index.html b/core/src/components/datetime/test/custom/index.html
index 25c4835c053..09895d9c591 100644
--- a/core/src/components/datetime/test/custom/index.html
+++ b/core/src/components/datetime/test/custom/index.html
@@ -164,7 +164,7 @@
Grid Style
const customDatetime = document.querySelector('#custom-calendar-days');
// Mock the current day to always have the same screenshots
- const mockToday = '2023-06-10T16:22';
+ const mockToday = '2023-06-10T16:22:00.000Z';
Date = class extends Date {
constructor(...args) {
if (args.length === 0) {
diff --git a/core/src/components/datetime/test/datetime.e2e.ts b/core/src/components/datetime/test/datetime.e2e.ts
index 2e26aad48e2..c95e4d20448 100644
--- a/core/src/components/datetime/test/datetime.e2e.ts
+++ b/core/src/components/datetime/test/datetime.e2e.ts
@@ -22,11 +22,23 @@ configs({ modes: ['md'], directions: ['ltr'] }).forEach(({ title, config }) => {
await expect(monthYearToggle).toContainText('January 2022');
+ // Click to open the picker
await monthYearToggle.click();
await page.waitForChanges();
- // February
- await monthColumnItems.nth(1).click();
+ // Wait for the picker to be open
+ await page.locator('.month-year-picker-open').waitFor();
+
+ // Wait a bit for the picker to fully load
+ await page.waitForTimeout(200);
+
+ const ionChange = await page.spyOnEvent('ionChange');
+
+ // Click on February
+ await monthColumnItems.filter({ hasText: 'February' }).click();
+
+ // Wait for changes
+ await ionChange.next();
await page.waitForChanges();
await expect(monthYearToggle).toContainText('February 2022');
@@ -38,13 +50,23 @@ configs({ modes: ['md'], directions: ['ltr'] }).forEach(({ title, config }) => {
const datetime = page.locator('ion-datetime');
const ionChange = await page.spyOnEvent('ionChange');
+ // Click to open the picker
await monthYearToggle.click();
await page.waitForChanges();
- // February
- await monthColumnItems.nth(1).click();
+ // Wait for the picker to be open
+ await page.locator('.month-year-picker-open').waitFor();
+
+ // Wait a bit for the picker to fully load
+ await page.waitForTimeout(200);
+
+ // Click on February
+ await monthColumnItems.filter({ hasText: 'February' }).click();
+ // Wait for changes
await ionChange.next();
+ await page.waitForChanges();
+
await expect(ionChange).toHaveReceivedEventTimes(1);
await expect(datetime).toHaveJSProperty('value', '2022-02-28');
});
diff --git a/core/src/components/input-otp/test/separators/input-otp.e2e.ts b/core/src/components/input-otp/test/separators/input-otp.e2e.ts
index 37c9bb8bb4a..4c92a458950 100644
--- a/core/src/components/input-otp/test/separators/input-otp.e2e.ts
+++ b/core/src/components/input-otp/test/separators/input-otp.e2e.ts
@@ -95,6 +95,8 @@ configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, config }) =>
el.separators = [2, 3];
});
+ await page.waitForChanges();
+
await expect(await hasSeparatorAfter(page, 0)).toBe(false);
await expect(await hasSeparatorAfter(page, 1)).toBe(true);
await expect(await hasSeparatorAfter(page, 2)).toBe(true);
diff --git a/core/src/components/reorder-group/reorder-group.tsx b/core/src/components/reorder-group/reorder-group.tsx
index c9deba6f205..918beebd99a 100644
--- a/core/src/components/reorder-group/reorder-group.tsx
+++ b/core/src/components/reorder-group/reorder-group.tsx
@@ -153,7 +153,7 @@ export class ReorderGroup implements ComponentInterface {
const heights = this.cachedHeights;
heights.length = 0;
const el = this.el;
- const children: any = el.__children;
+ const children: any = el.__children || el.children;
if (!children || children.length === 0) {
return;
}
@@ -259,7 +259,7 @@ export class ReorderGroup implements ComponentInterface {
private completeReorder(listOrReorder?: boolean | any[]): any {
const selectedItemEl = this.selectedItemEl;
if (selectedItemEl && this.state === ReorderGroupState.Complete) {
- const children: any = this.el.__children;
+ const children: any = this.el.__children || this.el.children;
const len = children.length;
const toIndex = this.lastToIndex;
const fromIndex = indexForItem(selectedItemEl);
@@ -309,7 +309,7 @@ export class ReorderGroup implements ComponentInterface {
/********* DOM WRITE ********* */
private reorderMove(fromIndex: number, toIndex: number) {
const itemHeight = this.selectedItemHeight;
- const children: any = this.el.__children;
+ const children: any = this.el.__children || this.el.children;
for (let i = 0; i < children.length; i++) {
const style = (children[i] as any).style;
let value = '';
diff --git a/core/src/components/tabs/tabs.tsx b/core/src/components/tabs/tabs.tsx
index e02e1aa91bd..ada833446ea 100644
--- a/core/src/components/tabs/tabs.tsx
+++ b/core/src/components/tabs/tabs.tsx
@@ -68,7 +68,27 @@ export class Tabs implements NavOutlet {
componentWillRender() {
const tabBar = this.el.querySelector('ion-tab-bar');
if (tabBar) {
- const tab = this.selectedTab ? this.selectedTab.tab : undefined;
+ let tab = this.selectedTab ? this.selectedTab.tab : undefined;
+
+ // Fallback: if no selectedTab is set but we're using router mode,
+ // determine the active tab from the current URL. This works around
+ // timing issues in React Router integration where setRouteId may not
+ // be called in time for the initial render.
+ // TODO(FW-6724): Remove this with React Router upgrade
+ if (!tab && this.useRouter && typeof window !== 'undefined') {
+ const currentPath = window.location.pathname;
+ const tabButtons = this.el.querySelectorAll('ion-tab-button');
+
+ // Look for a tab button that matches the current path pattern
+ for (const tabButton of tabButtons) {
+ const tabId = tabButton.getAttribute('tab');
+ if (tabId && currentPath.includes(tabId)) {
+ tab = tabId;
+ break;
+ }
+ }
+ }
+
tabBar.selectedTab = tab;
}
}
diff --git a/lerna.json b/lerna.json
index c4d88d48ed4..016db8f44e2 100644
--- a/lerna.json
+++ b/lerna.json
@@ -3,5 +3,5 @@
"core",
"packages/*"
],
- "version": "8.7.1"
+ "version": "8.7.2"
}
\ No newline at end of file
diff --git a/packages/angular-server/CHANGELOG.md b/packages/angular-server/CHANGELOG.md
index 2918947c67a..b6d17194244 100644
--- a/packages/angular-server/CHANGELOG.md
+++ b/packages/angular-server/CHANGELOG.md
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [8.7.2](https://github.com/ionic-team/ionic-framework/compare/v8.7.1...v8.7.2) (2025-08-06)
+
+**Note:** Version bump only for package @ionic/angular-server
+
+
+
+
+
## [8.7.1](https://github.com/ionic-team/ionic-framework/compare/v8.7.0...v8.7.1) (2025-07-31)
**Note:** Version bump only for package @ionic/angular-server
diff --git a/packages/angular-server/package-lock.json b/packages/angular-server/package-lock.json
index ee52ee82e78..43eddc2d3e5 100644
--- a/packages/angular-server/package-lock.json
+++ b/packages/angular-server/package-lock.json
@@ -1,15 +1,15 @@
{
"name": "@ionic/angular-server",
- "version": "8.7.1",
+ "version": "8.7.2",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@ionic/angular-server",
- "version": "8.7.1",
+ "version": "8.7.2",
"license": "MIT",
"dependencies": {
- "@ionic/core": "^8.7.1"
+ "@ionic/core": "^8.7.2"
},
"devDependencies": {
"@angular-eslint/eslint-plugin": "^16.0.0",
@@ -1031,39 +1031,16 @@
"dev": true
},
"node_modules/@ionic/core": {
- "version": "8.7.0",
- "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.0.tgz",
- "integrity": "sha512-l/43DXwv3WB2iXfdOQlu0fBY1CP70kek1y75HCwe4C9UlXcSnaLYnr3F/4VLvo1sIjNOmJHxJURpv/ZR7CP4AQ==",
+ "version": "8.7.1",
+ "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.1.tgz",
+ "integrity": "sha512-TSJDPWayn23Dw0gjwvbumo6piDrpZvyVccgMUGyKDrqduvBogzIsPrjPBYfTF4z4Sc/W0HMad17nBskC2+ybqw==",
"license": "MIT",
"dependencies": {
- "@stencil/core": "4.33.1",
+ "@stencil/core": "4.36.2",
"ionicons": "^8.0.13",
"tslib": "^2.1.0"
}
},
- "node_modules/@ionic/core/node_modules/@stencil/core": {
- "version": "4.33.1",
- "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.33.1.tgz",
- "integrity": "sha512-12k9xhAJBkpg598it+NRmaYIdEe6TSnsL/v6/KRXDcUyTK11VYwZQej2eHnMWtqot+znJ+GNTqb5YbiXi+5Low==",
- "license": "MIT",
- "bin": {
- "stencil": "bin/stencil"
- },
- "engines": {
- "node": ">=16.0.0",
- "npm": ">=7.10.0"
- },
- "optionalDependencies": {
- "@rollup/rollup-darwin-arm64": "4.34.9",
- "@rollup/rollup-darwin-x64": "4.34.9",
- "@rollup/rollup-linux-arm64-gnu": "4.34.9",
- "@rollup/rollup-linux-arm64-musl": "4.34.9",
- "@rollup/rollup-linux-x64-gnu": "4.34.9",
- "@rollup/rollup-linux-x64-musl": "4.34.9",
- "@rollup/rollup-win32-arm64-msvc": "4.34.9",
- "@rollup/rollup-win32-x64-msvc": "4.34.9"
- }
- },
"node_modules/@ionic/eslint-config": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/@ionic/eslint-config/-/eslint-config-0.4.0.tgz",
@@ -7329,30 +7306,13 @@
"dev": true
},
"@ionic/core": {
- "version": "8.7.0",
- "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.0.tgz",
- "integrity": "sha512-l/43DXwv3WB2iXfdOQlu0fBY1CP70kek1y75HCwe4C9UlXcSnaLYnr3F/4VLvo1sIjNOmJHxJURpv/ZR7CP4AQ==",
+ "version": "8.7.1",
+ "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.1.tgz",
+ "integrity": "sha512-TSJDPWayn23Dw0gjwvbumo6piDrpZvyVccgMUGyKDrqduvBogzIsPrjPBYfTF4z4Sc/W0HMad17nBskC2+ybqw==",
"requires": {
- "@stencil/core": "4.33.1",
+ "@stencil/core": "4.36.2",
"ionicons": "^8.0.13",
"tslib": "^2.1.0"
- },
- "dependencies": {
- "@stencil/core": {
- "version": "4.33.1",
- "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.33.1.tgz",
- "integrity": "sha512-12k9xhAJBkpg598it+NRmaYIdEe6TSnsL/v6/KRXDcUyTK11VYwZQej2eHnMWtqot+znJ+GNTqb5YbiXi+5Low==",
- "requires": {
- "@rollup/rollup-darwin-arm64": "4.34.9",
- "@rollup/rollup-darwin-x64": "4.34.9",
- "@rollup/rollup-linux-arm64-gnu": "4.34.9",
- "@rollup/rollup-linux-arm64-musl": "4.34.9",
- "@rollup/rollup-linux-x64-gnu": "4.34.9",
- "@rollup/rollup-linux-x64-musl": "4.34.9",
- "@rollup/rollup-win32-arm64-msvc": "4.34.9",
- "@rollup/rollup-win32-x64-msvc": "4.34.9"
- }
- }
}
},
"@ionic/eslint-config": {
diff --git a/packages/angular-server/package.json b/packages/angular-server/package.json
index 24e996f4ce0..490fd8a5f05 100644
--- a/packages/angular-server/package.json
+++ b/packages/angular-server/package.json
@@ -1,6 +1,6 @@
{
"name": "@ionic/angular-server",
- "version": "8.7.1",
+ "version": "8.7.2",
"description": "Angular SSR Module for Ionic",
"keywords": [
"ionic",
@@ -62,6 +62,6 @@
},
"prettier": "@ionic/prettier-config",
"dependencies": {
- "@ionic/core": "^8.7.1"
+ "@ionic/core": "^8.7.2"
}
}
diff --git a/packages/angular/CHANGELOG.md b/packages/angular/CHANGELOG.md
index 7775e4b4241..fac4b495964 100644
--- a/packages/angular/CHANGELOG.md
+++ b/packages/angular/CHANGELOG.md
@@ -3,6 +3,17 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [8.7.2](https://github.com/ionic-team/ionic-framework/compare/v8.7.1...v8.7.2) (2025-08-06)
+
+
+### Bug Fixes
+
+* **reorder-group:** add children fallback for framework compatibility ([#30593](https://github.com/ionic-team/ionic-framework/issues/30593)) ([1cd81b9](https://github.com/ionic-team/ionic-framework/commit/1cd81b92301378d55bce63a01dfcf95a91c92652)), closes [#30592](https://github.com/ionic-team/ionic-framework/issues/30592)
+
+
+
+
+
## [8.7.1](https://github.com/ionic-team/ionic-framework/compare/v8.7.0...v8.7.1) (2025-07-31)
**Note:** Version bump only for package @ionic/angular
diff --git a/packages/angular/package-lock.json b/packages/angular/package-lock.json
index 21ccfa2f22e..7043355072c 100644
--- a/packages/angular/package-lock.json
+++ b/packages/angular/package-lock.json
@@ -1,15 +1,15 @@
{
"name": "@ionic/angular",
- "version": "8.7.1",
+ "version": "8.7.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@ionic/angular",
- "version": "8.7.1",
+ "version": "8.7.2",
"license": "MIT",
"dependencies": {
- "@ionic/core": "^8.7.1",
+ "@ionic/core": "^8.7.2",
"ionicons": "^8.0.13",
"jsonc-parser": "^3.0.0",
"tslib": "^2.3.0"
@@ -1398,12 +1398,12 @@
"dev": true
},
"node_modules/@ionic/core": {
- "version": "8.7.0",
- "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.0.tgz",
- "integrity": "sha512-l/43DXwv3WB2iXfdOQlu0fBY1CP70kek1y75HCwe4C9UlXcSnaLYnr3F/4VLvo1sIjNOmJHxJURpv/ZR7CP4AQ==",
+ "version": "8.7.1",
+ "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.1.tgz",
+ "integrity": "sha512-TSJDPWayn23Dw0gjwvbumo6piDrpZvyVccgMUGyKDrqduvBogzIsPrjPBYfTF4z4Sc/W0HMad17nBskC2+ybqw==",
"license": "MIT",
"dependencies": {
- "@stencil/core": "4.33.1",
+ "@stencil/core": "4.36.2",
"ionicons": "^8.0.13",
"tslib": "^2.1.0"
}
@@ -2308,9 +2308,9 @@
}
},
"node_modules/@stencil/core": {
- "version": "4.33.1",
- "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.33.1.tgz",
- "integrity": "sha512-12k9xhAJBkpg598it+NRmaYIdEe6TSnsL/v6/KRXDcUyTK11VYwZQej2eHnMWtqot+znJ+GNTqb5YbiXi+5Low==",
+ "version": "4.36.2",
+ "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.36.2.tgz",
+ "integrity": "sha512-PRFSpxNzX9Oi0Wfh02asztN9Sgev/MacfZwmd+VVyE6ZxW+a/kEpAYZhzGAmE+/aKVOGYuug7R9SulanYGxiDQ==",
"license": "MIT",
"bin": {
"stencil": "bin/stencil"
@@ -5344,29 +5344,6 @@
"@stencil/core": "^4.35.3"
}
},
- "node_modules/ionicons/node_modules/@stencil/core": {
- "version": "4.35.3",
- "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.35.3.tgz",
- "integrity": "sha512-RH5/I+amV31QI8TMXhXkAkjzs2eod6Y07jkUYTl9kMB+X7c5wUpv95Y/2LtcAx0Rqdhh4SHbJiwpr0ApBZmv0g==",
- "license": "MIT",
- "bin": {
- "stencil": "bin/stencil"
- },
- "engines": {
- "node": ">=16.0.0",
- "npm": ">=7.10.0"
- },
- "optionalDependencies": {
- "@rollup/rollup-darwin-arm64": "4.34.9",
- "@rollup/rollup-darwin-x64": "4.34.9",
- "@rollup/rollup-linux-arm64-gnu": "4.34.9",
- "@rollup/rollup-linux-arm64-musl": "4.34.9",
- "@rollup/rollup-linux-x64-gnu": "4.34.9",
- "@rollup/rollup-linux-x64-musl": "4.34.9",
- "@rollup/rollup-win32-arm64-msvc": "4.34.9",
- "@rollup/rollup-win32-x64-msvc": "4.34.9"
- }
- },
"node_modules/ip": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz",
diff --git a/packages/angular/package.json b/packages/angular/package.json
index 7739084adda..f0cecaef818 100644
--- a/packages/angular/package.json
+++ b/packages/angular/package.json
@@ -1,6 +1,6 @@
{
"name": "@ionic/angular",
- "version": "8.7.1",
+ "version": "8.7.2",
"description": "Angular specific wrappers for @ionic/core",
"keywords": [
"ionic",
@@ -47,7 +47,7 @@
}
},
"dependencies": {
- "@ionic/core": "^8.7.1",
+ "@ionic/core": "^8.7.2",
"ionicons": "^8.0.13",
"jsonc-parser": "^3.0.0",
"tslib": "^2.3.0"
diff --git a/packages/angular/test/apps/ng16/angular.json b/packages/angular/test/apps/ng16/angular.json
index 2d5b6774e3d..f3083c93fd1 100644
--- a/packages/angular/test/apps/ng16/angular.json
+++ b/packages/angular/test/apps/ng16/angular.json
@@ -71,6 +71,23 @@
"extractLicenses": false,
"sourceMap": true,
"namedChunks": true
+ },
+ "test": {
+ "fileReplacements": [
+ {
+ "replace": "src/environments/environment.ts",
+ "with": "src/environments/environment.prod.ts"
+ }
+ ],
+ "optimization": true,
+ "outputHashing": "none",
+ "sourceMap": false,
+ "namedChunks": false,
+ "aot": true,
+ "progress": false,
+ "extractLicenses": false,
+ "vendorChunk": false,
+ "buildOptimizer": true
}
},
"defaultConfiguration": "production"
@@ -86,6 +103,9 @@
},
"development": {
"browserTarget": "test-app:build:development"
+ },
+ "test": {
+ "browserTarget": "test-app:build:test"
}
},
"defaultConfiguration": "development"
diff --git a/packages/angular/test/apps/ng16/e2e/src/lazy/angular-version.spec.ts b/packages/angular/test/apps/ng16/e2e/src/lazy/angular-version.spec.ts
deleted file mode 100644
index 2c5e5f3d0fd..00000000000
--- a/packages/angular/test/apps/ng16/e2e/src/lazy/angular-version.spec.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-it("should be on Angular 16", () => {
- cy.visit('/lazy');
-
- cy.get('ion-title').contains('Angular 16');
-});
diff --git a/packages/angular/test/apps/ng16/e2e/tsconfig.json b/packages/angular/test/apps/ng16/e2e/tsconfig.json
deleted file mode 100644
index 60db7b9af7c..00000000000
--- a/packages/angular/test/apps/ng16/e2e/tsconfig.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "angularCompilerOptions": {
- "fullTemplateTypeCheck": true,
- "strictMetadataEmit" : true
- },
- "extends": "../tsconfig.json",
- "include": [
- "src/**spec.ts",
- "../cypress/support/index.d.ts"
- ],
- "compilerOptions": {
- "outDir": "../out-tsc/app",
- "module": "commonjs",
- "target": "es5",
- "types": [
- "cypress",
- "node"
- ]
- }
-}
diff --git a/packages/angular/test/apps/ng16/package-lock.json b/packages/angular/test/apps/ng16/package-lock.json
index 089f6f3ac8d..81de0eed7bc 100644
--- a/packages/angular/test/apps/ng16/package-lock.json
+++ b/packages/angular/test/apps/ng16/package-lock.json
@@ -39,12 +39,12 @@
"@angular/compiler-cli": "^16.0.0",
"@angular/language-service": "^16.0.0",
"@nguniversal/builders": "^16.0.0",
+ "@playwright/test": "^1.54.2",
"@types/express": "^4.17.7",
"@types/node": "^12.12.54",
"@typescript-eslint/eslint-plugin": "^5.62.0",
"@typescript-eslint/parser": "^5.62.0",
"concurrently": "^6.0.0",
- "cypress": "^13.2.0",
"eslint": "^8.57.1",
"ts-loader": "^6.2.2",
"ts-node": "^8.3.0",
@@ -2648,16 +2648,6 @@
"node": ">=6.9.0"
}
},
- "node_modules/@colors/colors": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
- "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
- "dev": true,
- "optional": true,
- "engines": {
- "node": ">=0.1.90"
- }
- },
"node_modules/@cspotcode/source-map-support": {
"version": "0.8.1",
"resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
@@ -2682,69 +2672,6 @@
"@jridgewell/sourcemap-codec": "^1.4.10"
}
},
- "node_modules/@cypress/request": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.1.tgz",
- "integrity": "sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ==",
- "dev": true,
- "dependencies": {
- "aws-sign2": "~0.7.0",
- "aws4": "^1.8.0",
- "caseless": "~0.12.0",
- "combined-stream": "~1.0.6",
- "extend": "~3.0.2",
- "forever-agent": "~0.6.1",
- "form-data": "~2.3.2",
- "http-signature": "~1.3.6",
- "is-typedarray": "~1.0.0",
- "isstream": "~0.1.2",
- "json-stringify-safe": "~5.0.1",
- "mime-types": "~2.1.19",
- "performance-now": "^2.1.0",
- "qs": "6.10.4",
- "safe-buffer": "^5.1.2",
- "tough-cookie": "^4.1.3",
- "tunnel-agent": "^0.6.0",
- "uuid": "^8.3.2"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/@cypress/request/node_modules/qs": {
- "version": "6.10.4",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz",
- "integrity": "sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==",
- "dev": true,
- "dependencies": {
- "side-channel": "^1.0.4"
- },
- "engines": {
- "node": ">=0.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/@cypress/xvfb": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz",
- "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==",
- "dev": true,
- "dependencies": {
- "debug": "^3.1.0",
- "lodash.once": "^4.1.1"
- }
- },
- "node_modules/@cypress/xvfb/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
"node_modules/@discoveryjs/json-ext": {
"version": "0.5.7",
"resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz",
@@ -4080,6 +4007,22 @@
"node": ">=14"
}
},
+ "node_modules/@playwright/test": {
+ "version": "1.54.2",
+ "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.54.2.tgz",
+ "integrity": "sha512-A+znathYxPf+72riFd1r1ovOLqsIIB0jKIoPjyK2kqEIe30/6jF6BC7QNluHuwUmsD2tv1XZVugN8GqfTMOxsA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "playwright": "1.54.2"
+ },
+ "bin": {
+ "playwright": "cli.js"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/@rollup/rollup-darwin-arm64": {
"version": "4.34.9",
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.9.tgz",
@@ -4517,18 +4460,6 @@
"@types/node": "*"
}
},
- "node_modules/@types/sinonjs__fake-timers": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz",
- "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==",
- "dev": true
- },
- "node_modules/@types/sizzle": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz",
- "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==",
- "dev": true
- },
"node_modules/@types/sockjs": {
"version": "0.3.33",
"resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz",
@@ -4547,16 +4478,6 @@
"@types/node": "*"
}
},
- "node_modules/@types/yauzl": {
- "version": "2.10.0",
- "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz",
- "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==",
- "dev": true,
- "optional": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
"node_modules/@typescript-eslint/eslint-plugin": {
"version": "5.62.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz",
@@ -5602,26 +5523,6 @@
"integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==",
"dev": true
},
- "node_modules/arch": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz",
- "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
"node_modules/are-we-there-yet": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz",
@@ -5688,33 +5589,6 @@
"node": ">=8"
}
},
- "node_modules/asn1": {
- "version": "0.2.6",
- "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
- "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
- "dev": true,
- "dependencies": {
- "safer-buffer": "~2.1.0"
- }
- },
- "node_modules/assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
- "dev": true,
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/astral-regex": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
- "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/async": {
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
@@ -5735,15 +5609,6 @@
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
},
- "node_modules/at-least-node": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
- "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
- "dev": true,
- "engines": {
- "node": ">= 4.0.0"
- }
- },
"node_modules/autoprefixer": {
"version": "10.4.14",
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz",
@@ -5777,21 +5642,6 @@
"postcss": "^8.1.0"
}
},
- "node_modules/aws-sign2": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
- "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
- "dev": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/aws4": {
- "version": "1.12.0",
- "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz",
- "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==",
- "dev": true
- },
"node_modules/axios": {
"version": "0.21.4",
"resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz",
@@ -5932,15 +5782,6 @@
"integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==",
"dev": true
},
- "node_modules/bcrypt-pbkdf": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
- "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
- "dev": true,
- "dependencies": {
- "tweetnacl": "^0.14.3"
- }
- },
"node_modules/big.js": {
"version": "5.2.2",
"resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
@@ -5984,18 +5825,6 @@
"node": ">= 6"
}
},
- "node_modules/blob-util": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz",
- "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==",
- "dev": true
- },
- "node_modules/bluebird": {
- "version": "3.7.2",
- "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
- "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
- "dev": true
- },
"node_modules/body-parser": {
"version": "1.20.1",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
@@ -6296,15 +6125,6 @@
"ieee754": "^1.1.13"
}
},
- "node_modules/buffer-crc32": {
- "version": "0.2.13",
- "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
- "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
- "dev": true,
- "engines": {
- "node": "*"
- }
- },
"node_modules/buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
@@ -6407,15 +6227,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/cachedir": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz",
- "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/call-bind": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
@@ -6478,12 +6289,6 @@
}
]
},
- "node_modules/caseless": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
- "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==",
- "dev": true
- },
"node_modules/chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
@@ -6504,15 +6309,6 @@
"integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
"dev": true
},
- "node_modules/check-more-types": {
- "version": "2.24.0",
- "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz",
- "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==",
- "dev": true,
- "engines": {
- "node": ">= 0.8.0"
- }
- },
"node_modules/chokidar": {
"version": "3.5.3",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
@@ -6558,12 +6354,6 @@
"node": ">=6.0"
}
},
- "node_modules/ci-info": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz",
- "integrity": "sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==",
- "dev": true
- },
"node_modules/clean-stack": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
@@ -6597,37 +6387,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/cli-table3": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.2.tgz",
- "integrity": "sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw==",
- "dev": true,
- "dependencies": {
- "string-width": "^4.2.0"
- },
- "engines": {
- "node": "10.* || >= 12.*"
- },
- "optionalDependencies": {
- "@colors/colors": "1.5.0"
- }
- },
- "node_modules/cli-truncate": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
- "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
- "dev": true,
- "dependencies": {
- "slice-ansi": "^3.0.0",
- "string-width": "^4.2.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/cli-width": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz",
@@ -6712,24 +6471,6 @@
"node": ">= 0.8"
}
},
- "node_modules/commander": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
- "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
- "dev": true,
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/common-tags": {
- "version": "1.8.2",
- "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz",
- "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==",
- "dev": true,
- "engines": {
- "node": ">=4.0.0"
- }
- },
"node_modules/commondir": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
@@ -7391,167 +7132,6 @@
"integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
"dev": true
},
- "node_modules/cypress": {
- "version": "13.2.0",
- "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.2.0.tgz",
- "integrity": "sha512-AvDQxBydE771GTq0TR4ZUBvv9m9ffXuB/ueEtpDF/6gOcvFR96amgwSJP16Yhqw6VhmwqspT5nAGzoxxB+D89g==",
- "dev": true,
- "hasInstallScript": true,
- "dependencies": {
- "@cypress/request": "^3.0.0",
- "@cypress/xvfb": "^1.2.4",
- "@types/node": "^18.17.5",
- "@types/sinonjs__fake-timers": "8.1.1",
- "@types/sizzle": "^2.3.2",
- "arch": "^2.2.0",
- "blob-util": "^2.0.2",
- "bluebird": "^3.7.2",
- "buffer": "^5.6.0",
- "cachedir": "^2.3.0",
- "chalk": "^4.1.0",
- "check-more-types": "^2.24.0",
- "cli-cursor": "^3.1.0",
- "cli-table3": "~0.6.1",
- "commander": "^6.2.1",
- "common-tags": "^1.8.0",
- "dayjs": "^1.10.4",
- "debug": "^4.3.4",
- "enquirer": "^2.3.6",
- "eventemitter2": "6.4.7",
- "execa": "4.1.0",
- "executable": "^4.1.1",
- "extract-zip": "2.0.1",
- "figures": "^3.2.0",
- "fs-extra": "^9.1.0",
- "getos": "^3.2.1",
- "is-ci": "^3.0.0",
- "is-installed-globally": "~0.4.0",
- "lazy-ass": "^1.6.0",
- "listr2": "^3.8.3",
- "lodash": "^4.17.21",
- "log-symbols": "^4.0.0",
- "minimist": "^1.2.8",
- "ospath": "^1.2.2",
- "pretty-bytes": "^5.6.0",
- "process": "^0.11.10",
- "proxy-from-env": "1.0.0",
- "request-progress": "^3.0.0",
- "semver": "^7.5.3",
- "supports-color": "^8.1.1",
- "tmp": "~0.2.1",
- "untildify": "^4.0.0",
- "yauzl": "^2.10.0"
- },
- "bin": {
- "cypress": "bin/cypress"
- },
- "engines": {
- "node": "^16.0.0 || ^18.0.0 || >=20.0.0"
- }
- },
- "node_modules/cypress/node_modules/@types/node": {
- "version": "18.17.18",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.18.tgz",
- "integrity": "sha512-/4QOuy3ZpV7Ya1GTRz5CYSz3DgkKpyUptXuQ5PPce7uuyJAOR7r9FhkmxJfvcNUXyklbC63a+YvB3jxy7s9ngw==",
- "dev": true
- },
- "node_modules/cypress/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/cypress/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/cypress/node_modules/chalk/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/cypress/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/cypress/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/cypress/node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/cypress/node_modules/supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/supports-color?sponsor=1"
- }
- },
- "node_modules/dashdash": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
- "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
- "dev": true,
- "dependencies": {
- "assert-plus": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
"node_modules/data-urls": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/data-urls/-/data-urls-4.0.0.tgz",
@@ -7578,12 +7158,6 @@
"url": "https://opencollective.com/date-fns"
}
},
- "node_modules/dayjs": {
- "version": "1.11.3",
- "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.3.tgz",
- "integrity": "sha512-xxwlswWOlGhzgQ4TKzASQkUhqERI3egRNqgV4ScR8wlANA/A9tZ7miXa44vTTKEq5l7vWoL5G57bG3zA+Kow0A==",
- "dev": true
- },
"node_modules/debug": {
"version": "4.3.4",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
@@ -7921,16 +7495,6 @@
"node": ">= 0.8.0"
}
},
- "node_modules/ecc-jsbn": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
- "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
- "dev": true,
- "dependencies": {
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.1.0"
- }
- },
"node_modules/ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
@@ -8809,12 +8373,6 @@
"integrity": "sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ==",
"dev": true
},
- "node_modules/eventemitter2": {
- "version": "6.4.7",
- "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz",
- "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==",
- "dev": true
- },
"node_modules/eventemitter3": {
"version": "4.0.7",
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
@@ -8830,41 +8388,6 @@
"node": ">=0.8.x"
}
},
- "node_modules/execa": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz",
- "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==",
- "dev": true,
- "dependencies": {
- "cross-spawn": "^7.0.0",
- "get-stream": "^5.0.0",
- "human-signals": "^1.1.1",
- "is-stream": "^2.0.0",
- "merge-stream": "^2.0.0",
- "npm-run-path": "^4.0.0",
- "onetime": "^5.1.0",
- "signal-exit": "^3.0.2",
- "strip-final-newline": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/execa?sponsor=1"
- }
- },
- "node_modules/executable": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz",
- "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==",
- "dev": true,
- "dependencies": {
- "pify": "^2.2.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/express": {
"version": "4.18.2",
"resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
@@ -9011,12 +8534,6 @@
"node": ">= 0.8.0"
}
},
- "node_modules/extend": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
- "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
- "dev": true
- },
"node_modules/external-editor": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
@@ -9043,35 +8560,6 @@
"node": ">=0.6.0"
}
},
- "node_modules/extract-zip": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
- "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
- "dev": true,
- "dependencies": {
- "debug": "^4.1.1",
- "get-stream": "^5.1.0",
- "yauzl": "^2.10.0"
- },
- "bin": {
- "extract-zip": "cli.js"
- },
- "engines": {
- "node": ">= 10.17.0"
- },
- "optionalDependencies": {
- "@types/yauzl": "^2.9.1"
- }
- },
- "node_modules/extsprintf": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
- "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
- "dev": true,
- "engines": [
- "node >=0.6.0"
- ]
- },
"node_modules/fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@@ -9128,15 +8616,6 @@
"node": ">=0.8.0"
}
},
- "node_modules/fd-slicer": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
- "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
- "dev": true,
- "dependencies": {
- "pend": "~1.2.0"
- }
- },
"node_modules/figures": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
@@ -9367,29 +8846,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/forever-agent": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
- "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
- "dev": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/form-data": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
- "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
- "dev": true,
- "dependencies": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.6",
- "mime-types": "^2.1.12"
- },
- "engines": {
- "node": ">= 0.12"
- }
- },
"node_modules/forwarded": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
@@ -9426,21 +8882,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/fs-extra": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
- "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
- "dev": true,
- "dependencies": {
- "at-least-node": "^1.0.0",
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/fs-minipass": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.2.tgz",
@@ -9557,50 +8998,17 @@
"node": ">=8.0.0"
}
},
- "node_modules/get-proto": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
- "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
- "license": "MIT",
- "dependencies": {
- "dunder-proto": "^1.0.1",
- "es-object-atoms": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/get-stream": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
- "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
- "dev": true,
- "dependencies": {
- "pump": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/getos": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz",
- "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==",
- "dev": true,
- "dependencies": {
- "async": "^3.2.0"
- }
- },
- "node_modules/getpass": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
- "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
- "dev": true,
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "license": "MIT",
"dependencies": {
- "assert-plus": "^1.0.0"
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
}
},
"node_modules/glob": {
@@ -9639,21 +9047,6 @@
"integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
"dev": true
},
- "node_modules/global-dirs": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz",
- "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==",
- "dev": true,
- "dependencies": {
- "ini": "2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/globals": {
"version": "11.12.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
@@ -9964,20 +9357,6 @@
}
}
},
- "node_modules/http-signature": {
- "version": "1.3.6",
- "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz",
- "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==",
- "dev": true,
- "dependencies": {
- "assert-plus": "^1.0.0",
- "jsprim": "^2.0.2",
- "sshpk": "^1.14.1"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
"node_modules/https-proxy-agent": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
@@ -9990,15 +9369,6 @@
"node": ">= 6"
}
},
- "node_modules/human-signals": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
- "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
- "dev": true,
- "engines": {
- "node": ">=8.12.0"
- }
- },
"node_modules/humanize-ms": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz",
@@ -10187,15 +9557,6 @@
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
- "node_modules/ini": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
- "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/inquirer": {
"version": "8.2.4",
"resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz",
@@ -10342,18 +9703,6 @@
"node": ">=8"
}
},
- "node_modules/is-ci": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz",
- "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==",
- "dev": true,
- "dependencies": {
- "ci-info": "^3.2.0"
- },
- "bin": {
- "is-ci": "bin.js"
- }
- },
"node_modules/is-core-module": {
"version": "2.12.0",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz",
@@ -10409,22 +9758,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/is-installed-globally": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz",
- "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==",
- "dev": true,
- "dependencies": {
- "global-dirs": "^3.0.0",
- "is-path-inside": "^3.0.2"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/is-interactive": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
@@ -10506,12 +9839,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
- "dev": true
- },
"node_modules/is-unicode-supported": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
@@ -10562,12 +9889,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/isstream": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
- "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==",
- "dev": true
- },
"node_modules/istanbul-lib-coverage": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz",
@@ -10798,12 +10119,6 @@
"js-yaml": "bin/js-yaml.js"
}
},
- "node_modules/jsbn": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
- "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
- "dev": true
- },
"node_modules/jsdom": {
"version": "21.1.1",
"resolved": "https://registry.npmjs.org/jsdom/-/jsdom-21.1.1.tgz",
@@ -10940,12 +10255,6 @@
"integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
"dev": true
},
- "node_modules/json-schema": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
- "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
- "dev": true
- },
"node_modules/json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
@@ -10956,12 +10265,6 @@
"resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
"integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="
},
- "node_modules/json-stringify-safe": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
- "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
- "dev": true
- },
"node_modules/json5": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
@@ -11000,21 +10303,6 @@
"node >= 0.2.0"
]
},
- "node_modules/jsprim": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz",
- "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==",
- "dev": true,
- "engines": [
- "node >=0.6.0"
- ],
- "dependencies": {
- "assert-plus": "1.0.0",
- "extsprintf": "1.3.0",
- "json-schema": "0.4.0",
- "verror": "1.10.0"
- }
- },
"node_modules/karma-source-map-support": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz",
@@ -11052,15 +10340,6 @@
"shell-quote": "^1.7.3"
}
},
- "node_modules/lazy-ass": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz",
- "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==",
- "dev": true,
- "engines": {
- "node": "> 0.8"
- }
- },
"node_modules/less": {
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz",
@@ -11193,33 +10472,6 @@
"integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
"dev": true
},
- "node_modules/listr2": {
- "version": "3.14.0",
- "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz",
- "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==",
- "dev": true,
- "dependencies": {
- "cli-truncate": "^2.1.0",
- "colorette": "^2.0.16",
- "log-update": "^4.0.0",
- "p-map": "^4.0.0",
- "rfdc": "^1.3.0",
- "rxjs": "^7.5.1",
- "through": "^2.3.8",
- "wrap-ansi": "^7.0.0"
- },
- "engines": {
- "node": ">=10.0.0"
- },
- "peerDependencies": {
- "enquirer": ">= 2.3.0 < 3"
- },
- "peerDependenciesMeta": {
- "enquirer": {
- "optional": true
- }
- }
- },
"node_modules/loader-runner": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
@@ -11335,12 +10587,6 @@
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="
},
- "node_modules/lodash.once": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
- "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==",
- "dev": true
- },
"node_modules/log-symbols": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
@@ -11427,88 +10673,6 @@
"node": ">=8"
}
},
- "node_modules/log-update": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz",
- "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==",
- "dev": true,
- "dependencies": {
- "ansi-escapes": "^4.3.0",
- "cli-cursor": "^3.1.0",
- "slice-ansi": "^4.0.0",
- "wrap-ansi": "^6.2.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/log-update/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/log-update/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/log-update/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/log-update/node_modules/slice-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
- "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "astral-regex": "^2.0.0",
- "is-fullwidth-code-point": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/slice-ansi?sponsor=1"
- }
- },
- "node_modules/log-update/node_modules/wrap-ansi": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
- "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/lru-cache": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
@@ -13045,12 +12209,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/ospath": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz",
- "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==",
- "dev": true
- },
"node_modules/p-limit": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
@@ -13363,18 +12521,6 @@
"node": ">=8"
}
},
- "node_modules/pend": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
- "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
- "dev": true
- },
- "node_modules/performance-now": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
- "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
- "dev": true
- },
"node_modules/picocolors": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
@@ -13391,15 +12537,6 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
- "node_modules/pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/piscina": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/piscina/-/piscina-3.2.0.tgz",
@@ -13426,6 +12563,38 @@
"node": ">=8"
}
},
+ "node_modules/playwright": {
+ "version": "1.54.2",
+ "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.54.2.tgz",
+ "integrity": "sha512-Hu/BMoA1NAdRUuulyvQC0pEqZ4vQbGfn8f7wPXcnqQmM+zct9UliKxsIkLNmz/ku7LElUNqmaiv1TG/aL5ACsw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "playwright-core": "1.54.2"
+ },
+ "bin": {
+ "playwright": "cli.js"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "fsevents": "2.3.2"
+ }
+ },
+ "node_modules/playwright-core": {
+ "version": "1.54.2",
+ "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.54.2.tgz",
+ "integrity": "sha512-n5r4HFbMmWsB4twG7tJLDN9gmBUeSPcsBZiWSE4DnYz9mJMAFqr2ID7+eGC9kpEnxExJ1epttwR59LEWCk8mtA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "playwright-core": "cli.js"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/portscanner": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz",
@@ -13583,15 +12752,6 @@
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
- "node_modules/process": {
- "version": "0.11.10",
- "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
- "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
- "dev": true,
- "engines": {
- "node": ">= 0.6.0"
- }
- },
"node_modules/process-nextick-args": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
@@ -13629,12 +12789,6 @@
"node": ">= 0.10"
}
},
- "node_modules/proxy-from-env": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz",
- "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==",
- "dev": true
- },
"node_modules/prr": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
@@ -13646,16 +12800,6 @@
"resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
"integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
},
- "node_modules/pump": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
- "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
- "dev": true,
- "dependencies": {
- "end-of-stream": "^1.1.0",
- "once": "^1.3.1"
- }
- },
"node_modules/punycode": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
@@ -13942,15 +13086,6 @@
"jsesc": "bin/jsesc"
}
},
- "node_modules/request-progress": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz",
- "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==",
- "dev": true,
- "dependencies": {
- "throttleit": "^1.0.0"
- }
- },
"node_modules/require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
@@ -14110,12 +13245,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/rfdc": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz",
- "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==",
- "dev": true
- },
"node_modules/rimraf": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
@@ -14739,53 +13868,6 @@
"node": ">=8"
}
},
- "node_modules/slice-ansi": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
- "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "astral-regex": "^2.0.0",
- "is-fullwidth-code-point": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/slice-ansi/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/slice-ansi/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/slice-ansi/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/smart-buffer": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
@@ -15057,31 +14139,6 @@
"integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
"dev": true
},
- "node_modules/sshpk": {
- "version": "1.17.0",
- "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
- "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==",
- "dev": true,
- "dependencies": {
- "asn1": "~0.2.3",
- "assert-plus": "^1.0.0",
- "bcrypt-pbkdf": "^1.0.0",
- "dashdash": "^1.12.0",
- "ecc-jsbn": "~0.1.1",
- "getpass": "^0.1.1",
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.0.2",
- "tweetnacl": "~0.14.0"
- },
- "bin": {
- "sshpk-conv": "bin/sshpk-conv",
- "sshpk-sign": "bin/sshpk-sign",
- "sshpk-verify": "bin/sshpk-verify"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/ssri": {
"version": "10.0.4",
"resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.4.tgz",
@@ -15514,12 +14571,6 @@
"node": ">=0.8.0"
}
},
- "node_modules/throttleit": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz",
- "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=",
- "dev": true
- },
"node_modules/through": {
"version": "2.3.8",
"resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
@@ -15797,24 +14848,6 @@
"encoding": "^0.1.13"
}
},
- "node_modules/tunnel-agent": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
- "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
- "dev": true,
- "dependencies": {
- "safe-buffer": "^5.0.1"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/tweetnacl": {
- "version": "0.14.5",
- "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
- "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==",
- "dev": true
- },
"node_modules/type-check": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
@@ -15979,15 +15012,6 @@
"node": ">= 0.8"
}
},
- "node_modules/untildify": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
- "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/update-browserslist-db": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz",
@@ -16098,26 +15122,6 @@
"node": ">= 0.8"
}
},
- "node_modules/verror": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
- "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
- "dev": true,
- "engines": [
- "node >=0.6.0"
- ],
- "dependencies": {
- "assert-plus": "^1.0.0",
- "core-util-is": "1.0.2",
- "extsprintf": "^1.2.0"
- }
- },
- "node_modules/verror/node_modules/core-util-is": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==",
- "dev": true
- },
"node_modules/w3c-hr-time": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
@@ -16882,16 +15886,6 @@
"node": ">=12"
}
},
- "node_modules/yauzl": {
- "version": "2.10.0",
- "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
- "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
- "dev": true,
- "dependencies": {
- "buffer-crc32": "~0.2.3",
- "fd-slicer": "~1.1.0"
- }
- },
"node_modules/yn": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
@@ -18669,13 +17663,6 @@
"to-fast-properties": "^2.0.0"
}
},
- "@colors/colors": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
- "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
- "dev": true,
- "optional": true
- },
"@cspotcode/source-map-support": {
"version": "0.8.1",
"resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
@@ -18699,64 +17686,6 @@
}
}
},
- "@cypress/request": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.1.tgz",
- "integrity": "sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ==",
- "dev": true,
- "requires": {
- "aws-sign2": "~0.7.0",
- "aws4": "^1.8.0",
- "caseless": "~0.12.0",
- "combined-stream": "~1.0.6",
- "extend": "~3.0.2",
- "forever-agent": "~0.6.1",
- "form-data": "~2.3.2",
- "http-signature": "~1.3.6",
- "is-typedarray": "~1.0.0",
- "isstream": "~0.1.2",
- "json-stringify-safe": "~5.0.1",
- "mime-types": "~2.1.19",
- "performance-now": "^2.1.0",
- "qs": "6.10.4",
- "safe-buffer": "^5.1.2",
- "tough-cookie": "^4.1.3",
- "tunnel-agent": "^0.6.0",
- "uuid": "^8.3.2"
- },
- "dependencies": {
- "qs": {
- "version": "6.10.4",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz",
- "integrity": "sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==",
- "dev": true,
- "requires": {
- "side-channel": "^1.0.4"
- }
- }
- }
- },
- "@cypress/xvfb": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz",
- "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==",
- "dev": true,
- "requires": {
- "debug": "^3.1.0",
- "lodash.once": "^4.1.1"
- },
- "dependencies": {
- "debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
- "requires": {
- "ms": "^2.1.1"
- }
- }
- }
- },
"@discoveryjs/json-ext": {
"version": "0.5.7",
"resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz",
@@ -19557,6 +18486,15 @@
"dev": true,
"optional": true
},
+ "@playwright/test": {
+ "version": "1.54.2",
+ "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.54.2.tgz",
+ "integrity": "sha512-A+znathYxPf+72riFd1r1ovOLqsIIB0jKIoPjyK2kqEIe30/6jF6BC7QNluHuwUmsD2tv1XZVugN8GqfTMOxsA==",
+ "dev": true,
+ "requires": {
+ "playwright": "1.54.2"
+ }
+ },
"@rollup/rollup-darwin-arm64": {
"version": "4.34.9",
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.9.tgz",
@@ -19908,18 +18846,6 @@
"@types/node": "*"
}
},
- "@types/sinonjs__fake-timers": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz",
- "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==",
- "dev": true
- },
- "@types/sizzle": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz",
- "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==",
- "dev": true
- },
"@types/sockjs": {
"version": "0.3.33",
"resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz",
@@ -19938,16 +18864,6 @@
"@types/node": "*"
}
},
- "@types/yauzl": {
- "version": "2.10.0",
- "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz",
- "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==",
- "dev": true,
- "optional": true,
- "requires": {
- "@types/node": "*"
- }
- },
"@typescript-eslint/eslint-plugin": {
"version": "5.62.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz",
@@ -20713,12 +19629,6 @@
"integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==",
"dev": true
},
- "arch": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz",
- "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==",
- "dev": true
- },
"are-we-there-yet": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz",
@@ -20776,27 +19686,6 @@
"resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
"integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="
},
- "asn1": {
- "version": "0.2.6",
- "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
- "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
- "dev": true,
- "requires": {
- "safer-buffer": "~2.1.0"
- }
- },
- "assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
- "dev": true
- },
- "astral-regex": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
- "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
- "dev": true
- },
"async": {
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
@@ -20814,12 +19703,6 @@
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
},
- "at-least-node": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
- "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
- "dev": true
- },
"autoprefixer": {
"version": "10.4.14",
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz",
@@ -20834,18 +19717,6 @@
"postcss-value-parser": "^4.2.0"
}
},
- "aws-sign2": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
- "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
- "dev": true
- },
- "aws4": {
- "version": "1.12.0",
- "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz",
- "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==",
- "dev": true
- },
"axios": {
"version": "0.21.4",
"resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz",
@@ -20948,15 +19819,6 @@
"integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==",
"dev": true
},
- "bcrypt-pbkdf": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
- "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
- "dev": true,
- "requires": {
- "tweetnacl": "^0.14.3"
- }
- },
"big.js": {
"version": "5.2.2",
"resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
@@ -20993,18 +19855,6 @@
}
}
},
- "blob-util": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz",
- "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==",
- "dev": true
- },
- "bluebird": {
- "version": "3.7.2",
- "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
- "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
- "dev": true
- },
"body-parser": {
"version": "1.20.1",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
@@ -21245,12 +20095,6 @@
"ieee754": "^1.1.13"
}
},
- "buffer-crc32": {
- "version": "0.2.13",
- "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
- "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
- "dev": true
- },
"buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
@@ -21331,12 +20175,6 @@
}
}
},
- "cachedir": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz",
- "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==",
- "dev": true
- },
"call-bind": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
@@ -21372,12 +20210,6 @@
"integrity": "sha512-gMhDyXGItTHipJj2ApIvR+iVB5hd0KP3svMWWXDvZOmjzJJassGLMfxRkQCSYgGd2gtdL/ReeiyvMSFD1Ss6Mw==",
"dev": true
},
- "caseless": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
- "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==",
- "dev": true
- },
"chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
@@ -21395,12 +20227,6 @@
"integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
"dev": true
},
- "check-more-types": {
- "version": "2.24.0",
- "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz",
- "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==",
- "dev": true
- },
"chokidar": {
"version": "3.5.3",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
@@ -21429,12 +20255,6 @@
"integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==",
"dev": true
},
- "ci-info": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz",
- "integrity": "sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==",
- "dev": true
- },
"clean-stack": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
@@ -21456,26 +20276,6 @@
"integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==",
"dev": true
},
- "cli-table3": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.2.tgz",
- "integrity": "sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw==",
- "dev": true,
- "requires": {
- "@colors/colors": "1.5.0",
- "string-width": "^4.2.0"
- }
- },
- "cli-truncate": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
- "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
- "dev": true,
- "requires": {
- "slice-ansi": "^3.0.0",
- "string-width": "^4.2.0"
- }
- },
"cli-width": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz",
@@ -21545,18 +20345,6 @@
"delayed-stream": "~1.0.0"
}
},
- "commander": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
- "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
- "dev": true
- },
- "common-tags": {
- "version": "1.8.2",
- "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz",
- "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==",
- "dev": true
- },
"commondir": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
@@ -22058,134 +20846,6 @@
}
}
},
- "cypress": {
- "version": "13.2.0",
- "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.2.0.tgz",
- "integrity": "sha512-AvDQxBydE771GTq0TR4ZUBvv9m9ffXuB/ueEtpDF/6gOcvFR96amgwSJP16Yhqw6VhmwqspT5nAGzoxxB+D89g==",
- "dev": true,
- "requires": {
- "@cypress/request": "^3.0.0",
- "@cypress/xvfb": "^1.2.4",
- "@types/node": "^18.17.5",
- "@types/sinonjs__fake-timers": "8.1.1",
- "@types/sizzle": "^2.3.2",
- "arch": "^2.2.0",
- "blob-util": "^2.0.2",
- "bluebird": "^3.7.2",
- "buffer": "^5.6.0",
- "cachedir": "^2.3.0",
- "chalk": "^4.1.0",
- "check-more-types": "^2.24.0",
- "cli-cursor": "^3.1.0",
- "cli-table3": "~0.6.1",
- "commander": "^6.2.1",
- "common-tags": "^1.8.0",
- "dayjs": "^1.10.4",
- "debug": "^4.3.4",
- "enquirer": "^2.3.6",
- "eventemitter2": "6.4.7",
- "execa": "4.1.0",
- "executable": "^4.1.1",
- "extract-zip": "2.0.1",
- "figures": "^3.2.0",
- "fs-extra": "^9.1.0",
- "getos": "^3.2.1",
- "is-ci": "^3.0.0",
- "is-installed-globally": "~0.4.0",
- "lazy-ass": "^1.6.0",
- "listr2": "^3.8.3",
- "lodash": "^4.17.21",
- "log-symbols": "^4.0.0",
- "minimist": "^1.2.8",
- "ospath": "^1.2.2",
- "pretty-bytes": "^5.6.0",
- "process": "^0.11.10",
- "proxy-from-env": "1.0.0",
- "request-progress": "^3.0.0",
- "semver": "^7.5.3",
- "supports-color": "^8.1.1",
- "tmp": "~0.2.1",
- "untildify": "^4.0.0",
- "yauzl": "^2.10.0"
- },
- "dependencies": {
- "@types/node": {
- "version": "18.17.18",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.18.tgz",
- "integrity": "sha512-/4QOuy3ZpV7Ya1GTRz5CYSz3DgkKpyUptXuQ5PPce7uuyJAOR7r9FhkmxJfvcNUXyklbC63a+YvB3jxy7s9ngw==",
- "dev": true
- },
- "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"
- },
- "dependencies": {
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true
- },
- "supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
- "dashdash": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
- "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
- "dev": true,
- "requires": {
- "assert-plus": "^1.0.0"
- }
- },
"data-urls": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/data-urls/-/data-urls-4.0.0.tgz",
@@ -22202,12 +20862,6 @@
"integrity": "sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==",
"dev": true
},
- "dayjs": {
- "version": "1.11.3",
- "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.3.tgz",
- "integrity": "sha512-xxwlswWOlGhzgQ4TKzASQkUhqERI3egRNqgV4ScR8wlANA/A9tZ7miXa44vTTKEq5l7vWoL5G57bG3zA+Kow0A==",
- "dev": true
- },
"debug": {
"version": "4.3.4",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
@@ -22450,16 +21104,6 @@
"tfunk": "^4.0.0"
}
},
- "ecc-jsbn": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
- "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
- "dev": true,
- "requires": {
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.1.0"
- }
- },
"ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
@@ -23065,49 +21709,17 @@
"integrity": "sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ==",
"dev": true
},
- "eventemitter2": {
- "version": "6.4.7",
- "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz",
- "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==",
- "dev": true
- },
"eventemitter3": {
"version": "4.0.7",
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
"integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
- "dev": true
- },
- "events": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
- "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
- "dev": true
- },
- "execa": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz",
- "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==",
- "dev": true,
- "requires": {
- "cross-spawn": "^7.0.0",
- "get-stream": "^5.0.0",
- "human-signals": "^1.1.1",
- "is-stream": "^2.0.0",
- "merge-stream": "^2.0.0",
- "npm-run-path": "^4.0.0",
- "onetime": "^5.1.0",
- "signal-exit": "^3.0.2",
- "strip-final-newline": "^2.0.0"
- }
+ "dev": true
},
- "executable": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz",
- "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==",
- "dev": true,
- "requires": {
- "pify": "^2.2.0"
- }
+ "events": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+ "dev": true
},
"express": {
"version": "4.18.2",
@@ -23227,12 +21839,6 @@
}
}
},
- "extend": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
- "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
- "dev": true
- },
"external-editor": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
@@ -23255,24 +21861,6 @@
}
}
},
- "extract-zip": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
- "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
- "dev": true,
- "requires": {
- "@types/yauzl": "^2.9.1",
- "debug": "^4.1.1",
- "get-stream": "^5.1.0",
- "yauzl": "^2.10.0"
- }
- },
- "extsprintf": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
- "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
- "dev": true
- },
"fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@@ -23323,15 +21911,6 @@
"websocket-driver": ">=0.5.1"
}
},
- "fd-slicer": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
- "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
- "dev": true,
- "requires": {
- "pend": "~1.2.0"
- }
- },
"figures": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
@@ -23498,23 +22077,6 @@
}
}
},
- "forever-agent": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
- "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
- "dev": true
- },
- "form-data": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
- "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
- "dev": true,
- "requires": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.6",
- "mime-types": "^2.1.12"
- }
- },
"forwarded": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
@@ -23537,18 +22099,6 @@
"integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
"dev": true
},
- "fs-extra": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
- "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
- "dev": true,
- "requires": {
- "at-least-node": "^1.0.0",
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- }
- },
"fs-minipass": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.2.tgz",
@@ -23641,33 +22191,6 @@
"es-object-atoms": "^1.0.0"
}
},
- "get-stream": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
- "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
- "dev": true,
- "requires": {
- "pump": "^3.0.0"
- }
- },
- "getos": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz",
- "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==",
- "dev": true,
- "requires": {
- "async": "^3.2.0"
- }
- },
- "getpass": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
- "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
- "dev": true,
- "requires": {
- "assert-plus": "^1.0.0"
- }
- },
"glob": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
@@ -23695,15 +22218,6 @@
"integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
"dev": true
},
- "global-dirs": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz",
- "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==",
- "dev": true,
- "requires": {
- "ini": "2.0.0"
- }
- },
"globals": {
"version": "11.12.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
@@ -23938,17 +22452,6 @@
"micromatch": "^4.0.2"
}
},
- "http-signature": {
- "version": "1.3.6",
- "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz",
- "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==",
- "dev": true,
- "requires": {
- "assert-plus": "^1.0.0",
- "jsprim": "^2.0.2",
- "sshpk": "^1.14.1"
- }
- },
"https-proxy-agent": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
@@ -23958,12 +22461,6 @@
"debug": "4"
}
},
- "human-signals": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
- "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
- "dev": true
- },
"humanize-ms": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz",
@@ -24092,12 +22589,6 @@
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
- "ini": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
- "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
- "dev": true
- },
"inquirer": {
"version": "8.2.4",
"resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz",
@@ -24212,15 +22703,6 @@
"binary-extensions": "^2.0.0"
}
},
- "is-ci": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz",
- "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==",
- "dev": true,
- "requires": {
- "ci-info": "^3.2.0"
- }
- },
"is-core-module": {
"version": "2.12.0",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz",
@@ -24255,16 +22737,6 @@
"is-extglob": "^2.1.1"
}
},
- "is-installed-globally": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz",
- "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==",
- "dev": true,
- "requires": {
- "global-dirs": "^3.0.0",
- "is-path-inside": "^3.0.2"
- }
- },
"is-interactive": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
@@ -24322,12 +22794,6 @@
"integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
"dev": true
},
- "is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
- "dev": true
- },
"is-unicode-supported": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
@@ -24366,12 +22832,6 @@
"integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
"dev": true
},
- "isstream": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
- "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==",
- "dev": true
- },
"istanbul-lib-coverage": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz",
@@ -24538,12 +22998,6 @@
"esprima": "^4.0.0"
}
},
- "jsbn": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
- "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
- "dev": true
- },
"jsdom": {
"version": "21.1.1",
"resolved": "https://registry.npmjs.org/jsdom/-/jsdom-21.1.1.tgz",
@@ -24644,12 +23098,6 @@
"integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
"dev": true
},
- "json-schema": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
- "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
- "dev": true
- },
"json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
@@ -24660,12 +23108,6 @@
"resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
"integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="
},
- "json-stringify-safe": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
- "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
- "dev": true
- },
"json5": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
@@ -24693,18 +23135,6 @@
"integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==",
"dev": true
},
- "jsprim": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz",
- "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==",
- "dev": true,
- "requires": {
- "assert-plus": "1.0.0",
- "extsprintf": "1.3.0",
- "json-schema": "0.4.0",
- "verror": "1.10.0"
- }
- },
"karma-source-map-support": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz",
@@ -24736,12 +23166,6 @@
"shell-quote": "^1.7.3"
}
},
- "lazy-ass": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz",
- "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==",
- "dev": true
- },
"less": {
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz",
@@ -24833,22 +23257,6 @@
"integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
"dev": true
},
- "listr2": {
- "version": "3.14.0",
- "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz",
- "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==",
- "dev": true,
- "requires": {
- "cli-truncate": "^2.1.0",
- "colorette": "^2.0.16",
- "log-update": "^4.0.0",
- "p-map": "^4.0.0",
- "rfdc": "^1.3.0",
- "rxjs": "^7.5.1",
- "through": "^2.3.8",
- "wrap-ansi": "^7.0.0"
- }
- },
"loader-runner": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
@@ -24937,12 +23345,6 @@
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="
},
- "lodash.once": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
- "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==",
- "dev": true
- },
"log-symbols": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
@@ -25004,66 +23406,6 @@
}
}
},
- "log-update": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz",
- "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==",
- "dev": true,
- "requires": {
- "ansi-escapes": "^4.3.0",
- "cli-cursor": "^3.1.0",
- "slice-ansi": "^4.0.0",
- "wrap-ansi": "^6.2.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
- },
- "slice-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
- "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.0.0",
- "astral-regex": "^2.0.0",
- "is-fullwidth-code-point": "^3.0.0"
- }
- },
- "wrap-ansi": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
- "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- }
- }
- }
- },
"lru-cache": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
@@ -26221,12 +24563,6 @@
"integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==",
"dev": true
},
- "ospath": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz",
- "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==",
- "dev": true
- },
"p-limit": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
@@ -26457,18 +24793,6 @@
"resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
"integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="
},
- "pend": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
- "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
- "dev": true
- },
- "performance-now": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
- "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
- "dev": true
- },
"picocolors": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
@@ -26479,12 +24803,6 @@
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="
},
- "pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
- "dev": true
- },
"piscina": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/piscina/-/piscina-3.2.0.tgz",
@@ -26506,6 +24824,22 @@
"find-up": "^4.0.0"
}
},
+ "playwright": {
+ "version": "1.54.2",
+ "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.54.2.tgz",
+ "integrity": "sha512-Hu/BMoA1NAdRUuulyvQC0pEqZ4vQbGfn8f7wPXcnqQmM+zct9UliKxsIkLNmz/ku7LElUNqmaiv1TG/aL5ACsw==",
+ "dev": true,
+ "requires": {
+ "fsevents": "2.3.2",
+ "playwright-core": "1.54.2"
+ }
+ },
+ "playwright-core": {
+ "version": "1.54.2",
+ "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.54.2.tgz",
+ "integrity": "sha512-n5r4HFbMmWsB4twG7tJLDN9gmBUeSPcsBZiWSE4DnYz9mJMAFqr2ID7+eGC9kpEnxExJ1epttwR59LEWCk8mtA==",
+ "dev": true
+ },
"portscanner": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz",
@@ -26605,12 +24939,6 @@
"integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==",
"dev": true
},
- "process": {
- "version": "0.11.10",
- "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
- "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
- "dev": true
- },
"process-nextick-args": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
@@ -26642,12 +24970,6 @@
"ipaddr.js": "1.9.1"
}
},
- "proxy-from-env": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz",
- "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==",
- "dev": true
- },
"prr": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
@@ -26659,16 +24981,6 @@
"resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
"integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
},
- "pump": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
- "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
- "dev": true,
- "requires": {
- "end-of-stream": "^1.1.0",
- "once": "^1.3.1"
- }
- },
"punycode": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
@@ -26890,15 +25202,6 @@
}
}
},
- "request-progress": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz",
- "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==",
- "dev": true,
- "requires": {
- "throttleit": "^1.0.0"
- }
- },
"require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
@@ -27022,12 +25325,6 @@
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
"integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="
},
- "rfdc": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz",
- "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==",
- "dev": true
- },
"rimraf": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
@@ -27502,43 +25799,6 @@
"resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
"integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="
},
- "slice-ansi": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
- "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.0.0",
- "astral-regex": "^2.0.0",
- "is-fullwidth-code-point": "^3.0.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
- }
- }
- },
"smart-buffer": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
@@ -27767,23 +26027,6 @@
"integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
"dev": true
},
- "sshpk": {
- "version": "1.17.0",
- "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
- "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==",
- "dev": true,
- "requires": {
- "asn1": "~0.2.3",
- "assert-plus": "^1.0.0",
- "bcrypt-pbkdf": "^1.0.0",
- "dashdash": "^1.12.0",
- "ecc-jsbn": "~0.1.1",
- "getpass": "^0.1.1",
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.0.2",
- "tweetnacl": "~0.14.0"
- }
- },
"ssri": {
"version": "10.0.4",
"resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.4.tgz",
@@ -28100,12 +26343,6 @@
}
}
},
- "throttleit": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz",
- "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=",
- "dev": true
- },
"through": {
"version": "2.3.8",
"resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
@@ -28316,21 +26553,6 @@
}
}
},
- "tunnel-agent": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
- "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
- "dev": true,
- "requires": {
- "safe-buffer": "^5.0.1"
- }
- },
- "tweetnacl": {
- "version": "0.14.5",
- "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
- "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==",
- "dev": true
- },
"type-check": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
@@ -28434,12 +26656,6 @@
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
"integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
},
- "untildify": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
- "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==",
- "dev": true
- },
"update-browserslist-db": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz",
@@ -28521,25 +26737,6 @@
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
"integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
},
- "verror": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
- "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
- "dev": true,
- "requires": {
- "assert-plus": "^1.0.0",
- "core-util-is": "1.0.2",
- "extsprintf": "^1.2.0"
- },
- "dependencies": {
- "core-util-is": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==",
- "dev": true
- }
- }
- },
"w3c-hr-time": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
@@ -29069,16 +27266,6 @@
"integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
"dev": true
},
- "yauzl": {
- "version": "2.10.0",
- "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
- "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
- "dev": true,
- "requires": {
- "buffer-crc32": "~0.2.3",
- "fd-slicer": "~1.1.0"
- }
- },
"yn": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
diff --git a/packages/angular/test/apps/ng16/package.json b/packages/angular/test/apps/ng16/package.json
index 6cea0818612..0db2ad89e49 100644
--- a/packages/angular/test/apps/ng16/package.json
+++ b/packages/angular/test/apps/ng16/package.json
@@ -13,10 +13,7 @@
"build:ssr": "ng build --prod && ng run test-app:server:production",
"dev:ssr": "ng run test-app:serve-ssr",
"prerender": "ng run test-app:prerender",
- "cy.open": "cypress open",
- "cy.run": "cypress run",
- "test": "concurrently \"npm run start -- --configuration production\" \"wait-on http-get://localhost:4200 && npm run cy.run\" --kill-others --success first",
- "test.watch": "concurrently \"npm run start\" \"wait-on http-get://localhost:4200 && npm run cy.open\" --kill-others --success first"
+ "test": "npx playwright test"
},
"dependencies": {
"@angular/animations": "^16.0.0",
@@ -50,12 +47,12 @@
"@angular/compiler-cli": "^16.0.0",
"@angular/language-service": "^16.0.0",
"@nguniversal/builders": "^16.0.0",
+ "@playwright/test": "^1.54.2",
"@types/express": "^4.17.7",
"@types/node": "^12.12.54",
"@typescript-eslint/eslint-plugin": "^5.62.0",
"@typescript-eslint/parser": "^5.62.0",
"concurrently": "^6.0.0",
- "cypress": "^13.2.0",
"eslint": "^8.57.1",
"ts-loader": "^6.2.2",
"ts-node": "^8.3.0",
diff --git a/packages/angular/test/apps/ng17/angular.json b/packages/angular/test/apps/ng17/angular.json
index 6fc18fbac80..14033575d4f 100644
--- a/packages/angular/test/apps/ng17/angular.json
+++ b/packages/angular/test/apps/ng17/angular.json
@@ -71,6 +71,23 @@
"extractLicenses": false,
"sourceMap": true,
"namedChunks": true
+ },
+ "test": {
+ "fileReplacements": [
+ {
+ "replace": "src/environments/environment.ts",
+ "with": "src/environments/environment.prod.ts"
+ }
+ ],
+ "optimization": true,
+ "outputHashing": "none",
+ "sourceMap": false,
+ "namedChunks": false,
+ "aot": true,
+ "progress": false,
+ "extractLicenses": false,
+ "vendorChunk": false,
+ "buildOptimizer": true
}
},
"defaultConfiguration": "production"
@@ -86,6 +103,9 @@
},
"development": {
"buildTarget": "test-app:build:development"
+ },
+ "test": {
+ "buildTarget": "test-app:build:test"
}
},
"defaultConfiguration": "development"
diff --git a/packages/angular/test/apps/ng17/e2e/src/lazy/angular-version.spec.ts b/packages/angular/test/apps/ng17/e2e/src/lazy/angular-version.spec.ts
deleted file mode 100644
index f8352127408..00000000000
--- a/packages/angular/test/apps/ng17/e2e/src/lazy/angular-version.spec.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-it("should be on Angular 17", () => {
- cy.visit('/lazy');
-
- cy.get('ion-title').contains('Angular 17');
-});
diff --git a/packages/angular/test/apps/ng17/e2e/tsconfig.json b/packages/angular/test/apps/ng17/e2e/tsconfig.json
deleted file mode 100644
index 60db7b9af7c..00000000000
--- a/packages/angular/test/apps/ng17/e2e/tsconfig.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "angularCompilerOptions": {
- "fullTemplateTypeCheck": true,
- "strictMetadataEmit" : true
- },
- "extends": "../tsconfig.json",
- "include": [
- "src/**spec.ts",
- "../cypress/support/index.d.ts"
- ],
- "compilerOptions": {
- "outDir": "../out-tsc/app",
- "module": "commonjs",
- "target": "es5",
- "types": [
- "cypress",
- "node"
- ]
- }
-}
diff --git a/packages/angular/test/apps/ng17/package-lock.json b/packages/angular/test/apps/ng17/package-lock.json
index 154d04d0d7a..10d9ab64a99 100644
--- a/packages/angular/test/apps/ng17/package-lock.json
+++ b/packages/angular/test/apps/ng17/package-lock.json
@@ -38,12 +38,12 @@
"@angular/cli": "^17.0.0",
"@angular/compiler-cli": "^17.0.2",
"@angular/language-service": "^17.0.2",
+ "@playwright/test": "^1.54.2",
"@types/express": "^4.17.7",
"@types/ws": "8.5.3",
"@typescript-eslint/eslint-plugin": "^6.0.0",
"@typescript-eslint/parser": "^6.0.0",
"concurrently": "^6.0.0",
- "cypress": "^13.2.0",
"eslint": "^7.26.0",
"ts-loader": "^6.2.2",
"ts-node": "^8.3.0",
@@ -2819,64 +2819,6 @@
"node": ">=6.9.0"
}
},
- "node_modules/@colors/colors": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
- "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
- "dev": true,
- "optional": true,
- "engines": {
- "node": ">=0.1.90"
- }
- },
- "node_modules/@cypress/request": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.1.tgz",
- "integrity": "sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ==",
- "dev": true,
- "dependencies": {
- "aws-sign2": "~0.7.0",
- "aws4": "^1.8.0",
- "caseless": "~0.12.0",
- "combined-stream": "~1.0.6",
- "extend": "~3.0.2",
- "forever-agent": "~0.6.1",
- "form-data": "~2.3.2",
- "http-signature": "~1.3.6",
- "is-typedarray": "~1.0.0",
- "isstream": "~0.1.2",
- "json-stringify-safe": "~5.0.1",
- "mime-types": "~2.1.19",
- "performance-now": "^2.1.0",
- "qs": "6.10.4",
- "safe-buffer": "^5.1.2",
- "tough-cookie": "^4.1.3",
- "tunnel-agent": "^0.6.0",
- "uuid": "^8.3.2"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/@cypress/xvfb": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz",
- "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==",
- "dev": true,
- "dependencies": {
- "debug": "^3.1.0",
- "lodash.once": "^4.1.1"
- }
- },
- "node_modules/@cypress/xvfb/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
"node_modules/@discoveryjs/json-ext": {
"version": "0.5.7",
"resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz",
@@ -4133,6 +4075,22 @@
"node": ">=14"
}
},
+ "node_modules/@playwright/test": {
+ "version": "1.54.2",
+ "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.54.2.tgz",
+ "integrity": "sha512-A+znathYxPf+72riFd1r1ovOLqsIIB0jKIoPjyK2kqEIe30/6jF6BC7QNluHuwUmsD2tv1XZVugN8GqfTMOxsA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "playwright": "1.54.2"
+ },
+ "bin": {
+ "playwright": "cli.js"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/@rollup/rollup-darwin-arm64": {
"version": "4.34.9",
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.9.tgz",
@@ -4602,18 +4560,6 @@
"@types/node": "*"
}
},
- "node_modules/@types/sinonjs__fake-timers": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz",
- "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==",
- "dev": true
- },
- "node_modules/@types/sizzle": {
- "version": "2.3.6",
- "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.6.tgz",
- "integrity": "sha512-m04Om5Gz6kbjUwAQ7XJJQ30OdEFsSmAVsvn4NYwcTRyMVpKKa1aPuESw1n2CxS5fYkOQv3nHgDKeNa8e76fUkw==",
- "dev": true
- },
"node_modules/@types/sockjs": {
"version": "0.3.36",
"resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz",
@@ -4632,16 +4578,6 @@
"@types/node": "*"
}
},
- "node_modules/@types/yauzl": {
- "version": "2.10.3",
- "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz",
- "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==",
- "dev": true,
- "optional": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
"node_modules/@typescript-eslint/eslint-plugin": {
"version": "6.10.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.10.0.tgz",
@@ -5278,26 +5214,6 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
- "node_modules/arch": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz",
- "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
"node_modules/arg": {
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
@@ -5334,24 +5250,6 @@
"node": ">=8"
}
},
- "node_modules/asn1": {
- "version": "0.2.6",
- "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
- "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
- "dev": true,
- "dependencies": {
- "safer-buffer": "~2.1.0"
- }
- },
- "node_modules/assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
- "dev": true,
- "engines": {
- "node": ">=0.8"
- }
- },
"node_modules/astral-regex": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
@@ -5381,15 +5279,6 @@
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
"dev": true
},
- "node_modules/at-least-node": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
- "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
- "dev": true,
- "engines": {
- "node": ">= 4.0.0"
- }
- },
"node_modules/autoprefixer": {
"version": "10.4.16",
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz",
@@ -5427,21 +5316,6 @@
"postcss": "^8.1.0"
}
},
- "node_modules/aws-sign2": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
- "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
- "dev": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/aws4": {
- "version": "1.12.0",
- "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz",
- "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==",
- "dev": true
- },
"node_modules/axios": {
"version": "0.21.4",
"resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz",
@@ -5581,15 +5455,6 @@
"integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==",
"dev": true
},
- "node_modules/bcrypt-pbkdf": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
- "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
- "dev": true,
- "dependencies": {
- "tweetnacl": "^0.14.3"
- }
- },
"node_modules/big.js": {
"version": "5.2.2",
"resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
@@ -5619,18 +5484,6 @@
"readable-stream": "^3.4.0"
}
},
- "node_modules/blob-util": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz",
- "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==",
- "dev": true
- },
- "node_modules/bluebird": {
- "version": "3.7.2",
- "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
- "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
- "dev": true
- },
"node_modules/body-parser": {
"version": "1.20.1",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
@@ -6012,15 +5865,6 @@
"ieee754": "^1.1.13"
}
},
- "node_modules/buffer-crc32": {
- "version": "0.2.13",
- "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
- "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
- "dev": true,
- "engines": {
- "node": "*"
- }
- },
"node_modules/buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
@@ -6125,15 +5969,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/cachedir": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz",
- "integrity": "sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/call-bind": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz",
@@ -6184,12 +6019,6 @@
}
]
},
- "node_modules/caseless": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
- "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==",
- "dev": true
- },
"node_modules/chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
@@ -6209,15 +6038,6 @@
"integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
"dev": true
},
- "node_modules/check-more-types": {
- "version": "2.24.0",
- "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz",
- "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==",
- "dev": true,
- "engines": {
- "node": ">= 0.8.0"
- }
- },
"node_modules/chokidar": {
"version": "3.5.3",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
@@ -6263,21 +6083,6 @@
"node": ">=6.0"
}
},
- "node_modules/ci-info": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
- "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/sibiraj-s"
- }
- ],
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/clean-stack": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
@@ -6311,37 +6116,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/cli-table3": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz",
- "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==",
- "dev": true,
- "dependencies": {
- "string-width": "^4.2.0"
- },
- "engines": {
- "node": "10.* || >= 12.*"
- },
- "optionalDependencies": {
- "@colors/colors": "1.5.0"
- }
- },
- "node_modules/cli-truncate": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
- "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
- "dev": true,
- "dependencies": {
- "slice-ansi": "^3.0.0",
- "string-width": "^4.2.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/cli-width": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz",
@@ -6469,30 +6243,12 @@
"node": ">= 0.8"
}
},
- "node_modules/commander": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
- "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
- "dev": true,
- "engines": {
- "node": ">= 6"
- }
- },
"node_modules/common-path-prefix": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz",
"integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==",
"dev": true
},
- "node_modules/common-tags": {
- "version": "1.8.2",
- "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz",
- "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==",
- "dev": true,
- "engines": {
- "node": ">=4.0.0"
- }
- },
"node_modules/compressible": {
"version": "2.0.18",
"resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
@@ -7135,303 +6891,97 @@
"node": ">=4"
}
},
- "node_modules/cypress": {
- "version": "13.5.0",
- "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.5.0.tgz",
- "integrity": "sha512-oh6U7h9w8wwHfzNDJQ6wVcAeXu31DlIYlNOBvfd6U4CcB8oe4akawQmH+QJVOMZlM42eBoCne015+svVqdwdRQ==",
+ "node_modules/date-fns": {
+ "version": "2.30.0",
+ "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz",
+ "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==",
"dev": true,
- "hasInstallScript": true,
"dependencies": {
- "@cypress/request": "^3.0.0",
- "@cypress/xvfb": "^1.2.4",
- "@types/node": "^18.17.5",
- "@types/sinonjs__fake-timers": "8.1.1",
- "@types/sizzle": "^2.3.2",
- "arch": "^2.2.0",
- "blob-util": "^2.0.2",
- "bluebird": "^3.7.2",
- "buffer": "^5.6.0",
- "cachedir": "^2.3.0",
- "chalk": "^4.1.0",
- "check-more-types": "^2.24.0",
- "cli-cursor": "^3.1.0",
- "cli-table3": "~0.6.1",
- "commander": "^6.2.1",
- "common-tags": "^1.8.0",
- "dayjs": "^1.10.4",
- "debug": "^4.3.4",
- "enquirer": "^2.3.6",
- "eventemitter2": "6.4.7",
- "execa": "4.1.0",
- "executable": "^4.1.1",
- "extract-zip": "2.0.1",
- "figures": "^3.2.0",
- "fs-extra": "^9.1.0",
- "getos": "^3.2.1",
- "is-ci": "^3.0.0",
- "is-installed-globally": "~0.4.0",
- "lazy-ass": "^1.6.0",
- "listr2": "^3.8.3",
- "lodash": "^4.17.21",
- "log-symbols": "^4.0.0",
- "minimist": "^1.2.8",
- "ospath": "^1.2.2",
- "pretty-bytes": "^5.6.0",
- "process": "^0.11.10",
- "proxy-from-env": "1.0.0",
- "request-progress": "^3.0.0",
- "semver": "^7.5.3",
- "supports-color": "^8.1.1",
- "tmp": "~0.2.1",
- "untildify": "^4.0.0",
- "yauzl": "^2.10.0"
- },
- "bin": {
- "cypress": "bin/cypress"
+ "@babel/runtime": "^7.21.0"
},
"engines": {
- "node": "^16.0.0 || ^18.0.0 || >=20.0.0"
+ "node": ">=0.11"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/date-fns"
}
},
- "node_modules/cypress/node_modules/@types/node": {
- "version": "18.18.9",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.9.tgz",
- "integrity": "sha512-0f5klcuImLnG4Qreu9hPj/rEfFq6YRc5n2mAjSsH+ec/mJL+3voBH0+8T7o8RpFjH7ovc+TRsL/c7OYIQsPTfQ==",
- "dev": true,
+ "node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
"dependencies": {
- "undici-types": "~5.26.4"
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
}
},
- "node_modules/cypress/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="
+ },
+ "node_modules/default-gateway": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz",
+ "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==",
"dev": true,
"dependencies": {
- "color-convert": "^2.0.1"
+ "execa": "^5.0.0"
},
"engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "node": ">= 10"
}
},
- "node_modules/cypress/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "node_modules/default-gateway/node_modules/execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
"dev": true,
"dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
}
},
- "node_modules/cypress/node_modules/chalk/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "node_modules/default-gateway/node_modules/get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
"dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
"engines": {
- "node": ">=8"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/cypress/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "node_modules/default-gateway/node_modules/human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
"dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
"engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/cypress/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/cypress/node_modules/fs-extra": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
- "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
- "dev": true,
- "dependencies": {
- "at-least-node": "^1.0.0",
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/cypress/node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/cypress/node_modules/jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
- "dev": true,
- "dependencies": {
- "universalify": "^2.0.0"
- },
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
- "node_modules/cypress/node_modules/supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/supports-color?sponsor=1"
- }
- },
- "node_modules/cypress/node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
- "dev": true,
- "engines": {
- "node": ">= 10.0.0"
- }
- },
- "node_modules/dashdash": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
- "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
- "dev": true,
- "dependencies": {
- "assert-plus": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/date-fns": {
- "version": "2.30.0",
- "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz",
- "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==",
- "dev": true,
- "dependencies": {
- "@babel/runtime": "^7.21.0"
- },
- "engines": {
- "node": ">=0.11"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/date-fns"
- }
- },
- "node_modules/dayjs": {
- "version": "1.11.10",
- "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz",
- "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==",
- "dev": true
- },
- "node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "dependencies": {
- "ms": "2.1.2"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/deep-is": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
- "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="
- },
- "node_modules/default-gateway": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz",
- "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==",
- "dev": true,
- "dependencies": {
- "execa": "^5.0.0"
- },
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/default-gateway/node_modules/execa": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
- "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
- "dev": true,
- "dependencies": {
- "cross-spawn": "^7.0.3",
- "get-stream": "^6.0.0",
- "human-signals": "^2.1.0",
- "is-stream": "^2.0.0",
- "merge-stream": "^2.0.0",
- "npm-run-path": "^4.0.1",
- "onetime": "^5.1.2",
- "signal-exit": "^3.0.3",
- "strip-final-newline": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/execa?sponsor=1"
- }
- },
- "node_modules/default-gateway/node_modules/get-stream": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
- "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/default-gateway/node_modules/human-signals": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
- "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
- "dev": true,
- "engines": {
- "node": ">=10.17.0"
+ "node": ">=10.17.0"
}
},
"node_modules/defaults": {
@@ -7757,16 +7307,6 @@
"node": ">=8"
}
},
- "node_modules/ecc-jsbn": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
- "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
- "dev": true,
- "dependencies": {
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.1.0"
- }
- },
"node_modules/ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
@@ -8415,12 +7955,6 @@
"integrity": "sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ==",
"dev": true
},
- "node_modules/eventemitter2": {
- "version": "6.4.7",
- "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz",
- "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==",
- "dev": true
- },
"node_modules/eventemitter3": {
"version": "4.0.7",
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
@@ -8436,41 +7970,6 @@
"node": ">=0.8.x"
}
},
- "node_modules/execa": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz",
- "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==",
- "dev": true,
- "dependencies": {
- "cross-spawn": "^7.0.0",
- "get-stream": "^5.0.0",
- "human-signals": "^1.1.1",
- "is-stream": "^2.0.0",
- "merge-stream": "^2.0.0",
- "npm-run-path": "^4.0.0",
- "onetime": "^5.1.0",
- "signal-exit": "^3.0.2",
- "strip-final-newline": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/execa?sponsor=1"
- }
- },
- "node_modules/executable": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz",
- "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==",
- "dev": true,
- "dependencies": {
- "pify": "^2.2.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/exponential-backoff": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz",
@@ -8604,12 +8103,6 @@
"node": ">= 0.8.0"
}
},
- "node_modules/extend": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
- "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
- "dev": true
- },
"node_modules/external-editor": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
@@ -8636,35 +8129,6 @@
"node": ">=0.6.0"
}
},
- "node_modules/extract-zip": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
- "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
- "dev": true,
- "dependencies": {
- "debug": "^4.1.1",
- "get-stream": "^5.1.0",
- "yauzl": "^2.10.0"
- },
- "bin": {
- "extract-zip": "cli.js"
- },
- "engines": {
- "node": ">= 10.17.0"
- },
- "optionalDependencies": {
- "@types/yauzl": "^2.9.1"
- }
- },
- "node_modules/extsprintf": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
- "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
- "dev": true,
- "engines": [
- "node >=0.6.0"
- ]
- },
"node_modules/fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@@ -8724,15 +8188,6 @@
"node": ">=0.8.0"
}
},
- "node_modules/fd-slicer": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
- "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
- "dev": true,
- "dependencies": {
- "pend": "~1.2.0"
- }
- },
"node_modules/figures": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
@@ -8958,29 +8413,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/forever-agent": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
- "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
- "dev": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/form-data": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
- "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
- "dev": true,
- "dependencies": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.6",
- "mime-types": "^2.1.12"
- },
- "engines": {
- "node": ">= 0.12"
- }
- },
"node_modules/forwarded": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
@@ -9118,39 +8550,6 @@
"node": ">=8.0.0"
}
},
- "node_modules/get-stream": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
- "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
- "dev": true,
- "dependencies": {
- "pump": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/getos": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz",
- "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==",
- "dev": true,
- "dependencies": {
- "async": "^3.2.0"
- }
- },
- "node_modules/getpass": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
- "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
- "dev": true,
- "dependencies": {
- "assert-plus": "^1.0.0"
- }
- },
"node_modules/glob": {
"version": "7.1.4",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
@@ -9184,30 +8583,6 @@
"integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
"dev": true
},
- "node_modules/global-dirs": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz",
- "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==",
- "dev": true,
- "dependencies": {
- "ini": "2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/global-dirs/node_modules/ini": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
- "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/globals": {
"version": "11.12.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
@@ -9518,20 +8893,6 @@
}
}
},
- "node_modules/http-signature": {
- "version": "1.3.6",
- "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz",
- "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==",
- "dev": true,
- "dependencies": {
- "assert-plus": "^1.0.0",
- "jsprim": "^2.0.2",
- "sshpk": "^1.14.1"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
"node_modules/https-proxy-agent": {
"version": "7.0.2",
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz",
@@ -9545,15 +8906,6 @@
"node": ">= 14"
}
},
- "node_modules/human-signals": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
- "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
- "dev": true,
- "engines": {
- "node": ">=8.12.0"
- }
- },
"node_modules/iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
@@ -9885,18 +9237,6 @@
"node": ">=8"
}
},
- "node_modules/is-ci": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz",
- "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==",
- "dev": true,
- "dependencies": {
- "ci-info": "^3.2.0"
- },
- "bin": {
- "is-ci": "bin.js"
- }
- },
"node_modules/is-core-module": {
"version": "2.13.1",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
@@ -9951,22 +9291,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/is-installed-globally": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz",
- "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==",
- "dev": true,
- "dependencies": {
- "global-dirs": "^3.0.0",
- "is-path-inside": "^3.0.2"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/is-interactive": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
@@ -9999,15 +9323,6 @@
"lodash.isfinite": "^3.3.2"
}
},
- "node_modules/is-path-inside": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
- "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/is-plain-obj": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
@@ -10044,12 +9359,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
- "dev": true
- },
"node_modules/is-unicode-supported": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
@@ -10100,12 +9409,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/isstream": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
- "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==",
- "dev": true
- },
"node_modules/istanbul-lib-coverage": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
@@ -10417,12 +9720,6 @@
"js-yaml": "bin/js-yaml.js"
}
},
- "node_modules/jsbn": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
- "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
- "dev": true
- },
"node_modules/jsesc": {
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
@@ -10446,12 +9743,6 @@
"integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
"dev": true
},
- "node_modules/json-schema": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
- "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
- "dev": true
- },
"node_modules/json-schema-traverse": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
@@ -10462,12 +9753,6 @@
"resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
"integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="
},
- "node_modules/json-stringify-safe": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
- "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
- "dev": true
- },
"node_modules/json5": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
@@ -10503,21 +9788,6 @@
"node >= 0.2.0"
]
},
- "node_modules/jsprim": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz",
- "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==",
- "dev": true,
- "engines": [
- "node >=0.6.0"
- ],
- "dependencies": {
- "assert-plus": "1.0.0",
- "extsprintf": "1.3.0",
- "json-schema": "0.4.0",
- "verror": "1.10.0"
- }
- },
"node_modules/karma-source-map-support": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz",
@@ -10563,15 +9833,6 @@
"shell-quote": "^1.8.1"
}
},
- "node_modules/lazy-ass": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz",
- "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==",
- "dev": true,
- "engines": {
- "node": "> 0.8"
- }
- },
"node_modules/less": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz",
@@ -10663,90 +9924,13 @@
"integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==",
"dev": true
},
- "node_modules/lines-and-columns": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz",
- "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==",
- "dev": true,
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- }
- },
- "node_modules/listr2": {
- "version": "3.14.0",
- "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz",
- "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==",
- "dev": true,
- "dependencies": {
- "cli-truncate": "^2.1.0",
- "colorette": "^2.0.16",
- "log-update": "^4.0.0",
- "p-map": "^4.0.0",
- "rfdc": "^1.3.0",
- "rxjs": "^7.5.1",
- "through": "^2.3.8",
- "wrap-ansi": "^7.0.0"
- },
- "engines": {
- "node": ">=10.0.0"
- },
- "peerDependencies": {
- "enquirer": ">= 2.3.0 < 3"
- },
- "peerDependenciesMeta": {
- "enquirer": {
- "optional": true
- }
- }
- },
- "node_modules/listr2/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/listr2/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/listr2/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/listr2/node_modules/wrap-ansi": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
- "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "node_modules/lines-and-columns": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz",
+ "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==",
"dev": true,
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- },
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
}
},
"node_modules/loader-runner": {
@@ -10925,12 +10109,6 @@
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="
},
- "node_modules/lodash.once": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
- "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==",
- "dev": true
- },
"node_modules/lodash.truncate": {
"version": "4.4.2",
"resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
@@ -11022,74 +10200,6 @@
"node": ">=8"
}
},
- "node_modules/log-update": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz",
- "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==",
- "dev": true,
- "dependencies": {
- "ansi-escapes": "^4.3.0",
- "cli-cursor": "^3.1.0",
- "slice-ansi": "^4.0.0",
- "wrap-ansi": "^6.2.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/log-update/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/log-update/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/log-update/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/log-update/node_modules/slice-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
- "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "astral-regex": "^2.0.0",
- "is-fullwidth-code-point": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/slice-ansi?sponsor=1"
- }
- },
"node_modules/lru-cache": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
@@ -12524,12 +11634,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/ospath": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz",
- "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==",
- "dev": true
- },
"node_modules/p-limit": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
@@ -12803,18 +11907,6 @@
"node": ">=8"
}
},
- "node_modules/pend": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
- "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
- "dev": true
- },
- "node_modules/performance-now": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
- "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
- "dev": true
- },
"node_modules/picocolors": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
@@ -12832,15 +11924,6 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
- "node_modules/pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/piscina": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/piscina/-/piscina-4.1.0.tgz",
@@ -12940,6 +12023,53 @@
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
}
},
+ "node_modules/playwright": {
+ "version": "1.54.2",
+ "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.54.2.tgz",
+ "integrity": "sha512-Hu/BMoA1NAdRUuulyvQC0pEqZ4vQbGfn8f7wPXcnqQmM+zct9UliKxsIkLNmz/ku7LElUNqmaiv1TG/aL5ACsw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "playwright-core": "1.54.2"
+ },
+ "bin": {
+ "playwright": "cli.js"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "fsevents": "2.3.2"
+ }
+ },
+ "node_modules/playwright-core": {
+ "version": "1.54.2",
+ "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.54.2.tgz",
+ "integrity": "sha512-n5r4HFbMmWsB4twG7tJLDN9gmBUeSPcsBZiWSE4DnYz9mJMAFqr2ID7+eGC9kpEnxExJ1epttwR59LEWCk8mtA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "playwright-core": "cli.js"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/playwright/node_modules/fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
"node_modules/portscanner": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz",
@@ -13144,15 +12274,6 @@
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
- "node_modules/process": {
- "version": "0.11.10",
- "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
- "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
- "dev": true,
- "engines": {
- "node": ">= 0.6.0"
- }
- },
"node_modules/process-nextick-args": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
@@ -13198,34 +12319,12 @@
"node": ">= 0.10"
}
},
- "node_modules/proxy-from-env": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz",
- "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==",
- "dev": true
- },
"node_modules/prr": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
"integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==",
"dev": true
},
- "node_modules/psl": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
- "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==",
- "dev": true
- },
- "node_modules/pump": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
- "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
- "dev": true,
- "dependencies": {
- "end-of-stream": "^1.1.0",
- "once": "^1.3.1"
- }
- },
"node_modules/punycode": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
@@ -13234,27 +12333,6 @@
"node": ">=6"
}
},
- "node_modules/qs": {
- "version": "6.10.4",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz",
- "integrity": "sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==",
- "dev": true,
- "dependencies": {
- "side-channel": "^1.0.4"
- },
- "engines": {
- "node": ">=0.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/querystringify": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
- "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
- "dev": true
- },
"node_modules/queue-microtask": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
@@ -13548,15 +12626,6 @@
"jsesc": "bin/jsesc"
}
},
- "node_modules/request-progress": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz",
- "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==",
- "dev": true,
- "dependencies": {
- "throttleit": "^1.0.0"
- }
- },
"node_modules/require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
@@ -13716,12 +12785,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/rfdc": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz",
- "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==",
- "dev": true
- },
"node_modules/rimraf": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
@@ -14276,53 +13339,6 @@
"node": ">=8"
}
},
- "node_modules/slice-ansi": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
- "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "astral-regex": "^2.0.0",
- "is-fullwidth-code-point": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/slice-ansi/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/slice-ansi/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/slice-ansi/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/smart-buffer": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
@@ -14569,31 +13585,6 @@
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
"integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="
},
- "node_modules/sshpk": {
- "version": "1.18.0",
- "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz",
- "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==",
- "dev": true,
- "dependencies": {
- "asn1": "~0.2.3",
- "assert-plus": "^1.0.0",
- "bcrypt-pbkdf": "^1.0.0",
- "dashdash": "^1.12.0",
- "ecc-jsbn": "~0.1.1",
- "getpass": "^0.1.1",
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.0.2",
- "tweetnacl": "~0.14.0"
- },
- "bin": {
- "sshpk-conv": "bin/sshpk-conv",
- "sshpk-sign": "bin/sshpk-sign",
- "sshpk-verify": "bin/sshpk-verify"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/ssri": {
"version": "10.0.5",
"resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz",
@@ -15055,12 +14046,6 @@
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
"integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw=="
},
- "node_modules/throttleit": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz",
- "integrity": "sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==",
- "dev": true
- },
"node_modules/through": {
"version": "2.3.8",
"resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
@@ -15113,30 +14098,6 @@
"node": ">=0.6"
}
},
- "node_modules/tough-cookie": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz",
- "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==",
- "dev": true,
- "dependencies": {
- "psl": "^1.1.33",
- "punycode": "^2.1.1",
- "universalify": "^0.2.0",
- "url-parse": "^1.5.3"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/tough-cookie/node_modules/universalify": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
- "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
- "dev": true,
- "engines": {
- "node": ">= 4.0.0"
- }
- },
"node_modules/tree-kill": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
@@ -15269,24 +14230,6 @@
"node": "^16.14.0 || >=18.0.0"
}
},
- "node_modules/tunnel-agent": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
- "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
- "dev": true,
- "dependencies": {
- "safe-buffer": "^5.0.1"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/tweetnacl": {
- "version": "0.14.5",
- "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
- "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==",
- "dev": true
- },
"node_modules/type-check": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
@@ -15389,7 +14332,9 @@
"version": "5.26.5",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
"integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
- "dev": true
+ "dev": true,
+ "optional": true,
+ "peer": true
},
"node_modules/unicode-canonical-property-names-ecmascript": {
"version": "2.0.0",
@@ -15472,15 +14417,6 @@
"node": ">= 0.8"
}
},
- "node_modules/untildify": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
- "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/update-browserslist-db": {
"version": "1.0.13",
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
@@ -15519,16 +14455,6 @@
"punycode": "^2.1.0"
}
},
- "node_modules/url-parse": {
- "version": "1.5.10",
- "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
- "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
- "dev": true,
- "dependencies": {
- "querystringify": "^2.1.1",
- "requires-port": "^1.0.0"
- }
- },
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
@@ -15587,20 +14513,6 @@
"node": ">= 0.8"
}
},
- "node_modules/verror": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
- "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
- "dev": true,
- "engines": [
- "node >=0.6.0"
- ],
- "dependencies": {
- "assert-plus": "^1.0.0",
- "core-util-is": "1.0.2",
- "extsprintf": "^1.2.0"
- }
- },
"node_modules/wait-on": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/wait-on/-/wait-on-5.3.0.tgz",
@@ -16314,16 +15226,6 @@
"node": ">=12"
}
},
- "node_modules/yauzl": {
- "version": "2.10.0",
- "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
- "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
- "dev": true,
- "dependencies": {
- "buffer-crc32": "~0.2.3",
- "fd-slicer": "~1.1.0"
- }
- },
"node_modules/yn": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
diff --git a/packages/angular/test/apps/ng17/package.json b/packages/angular/test/apps/ng17/package.json
index 3a104538819..63e0a1892ec 100644
--- a/packages/angular/test/apps/ng17/package.json
+++ b/packages/angular/test/apps/ng17/package.json
@@ -13,10 +13,7 @@
"build:ssr": "ng build --prod && ng run test-app:server:production",
"dev:ssr": "ng run test-app:serve-ssr",
"prerender": "ng run test-app:prerender",
- "cy.open": "cypress open",
- "cy.run": "cypress run",
- "test": "concurrently \"npm run start -- --configuration production\" \"wait-on http-get://localhost:4200 && npm run cy.run\" --kill-others --success first",
- "test.watch": "concurrently \"npm run start\" \"wait-on http-get://localhost:4200 && npm run cy.open\" --kill-others --success first"
+ "test": "npx playwright test"
},
"dependencies": {
"@angular/animations": "^17.0.2",
@@ -49,12 +46,12 @@
"@angular/cli": "^17.0.0",
"@angular/compiler-cli": "^17.0.2",
"@angular/language-service": "^17.0.2",
+ "@playwright/test": "^1.54.2",
"@types/express": "^4.17.7",
"@types/ws": "8.5.3",
"@typescript-eslint/eslint-plugin": "^6.0.0",
"@typescript-eslint/parser": "^6.0.0",
"concurrently": "^6.0.0",
- "cypress": "^13.2.0",
"eslint": "^7.26.0",
"ts-loader": "^6.2.2",
"ts-node": "^8.3.0",
diff --git a/packages/angular/test/apps/ng18/angular.json b/packages/angular/test/apps/ng18/angular.json
index 6fc18fbac80..14033575d4f 100644
--- a/packages/angular/test/apps/ng18/angular.json
+++ b/packages/angular/test/apps/ng18/angular.json
@@ -71,6 +71,23 @@
"extractLicenses": false,
"sourceMap": true,
"namedChunks": true
+ },
+ "test": {
+ "fileReplacements": [
+ {
+ "replace": "src/environments/environment.ts",
+ "with": "src/environments/environment.prod.ts"
+ }
+ ],
+ "optimization": true,
+ "outputHashing": "none",
+ "sourceMap": false,
+ "namedChunks": false,
+ "aot": true,
+ "progress": false,
+ "extractLicenses": false,
+ "vendorChunk": false,
+ "buildOptimizer": true
}
},
"defaultConfiguration": "production"
@@ -86,6 +103,9 @@
},
"development": {
"buildTarget": "test-app:build:development"
+ },
+ "test": {
+ "buildTarget": "test-app:build:test"
}
},
"defaultConfiguration": "development"
diff --git a/packages/angular/test/apps/ng18/e2e/src/lazy/angular-version.spec.ts b/packages/angular/test/apps/ng18/e2e/src/lazy/angular-version.spec.ts
deleted file mode 100644
index 40b41a65be1..00000000000
--- a/packages/angular/test/apps/ng18/e2e/src/lazy/angular-version.spec.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-it("should be on Angular 18", () => {
- cy.visit('/lazy');
-
- cy.get('ion-title').contains('Angular 18');
-});
diff --git a/packages/angular/test/apps/ng18/e2e/tsconfig.json b/packages/angular/test/apps/ng18/e2e/tsconfig.json
deleted file mode 100644
index 60db7b9af7c..00000000000
--- a/packages/angular/test/apps/ng18/e2e/tsconfig.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "angularCompilerOptions": {
- "fullTemplateTypeCheck": true,
- "strictMetadataEmit" : true
- },
- "extends": "../tsconfig.json",
- "include": [
- "src/**spec.ts",
- "../cypress/support/index.d.ts"
- ],
- "compilerOptions": {
- "outDir": "../out-tsc/app",
- "module": "commonjs",
- "target": "es5",
- "types": [
- "cypress",
- "node"
- ]
- }
-}
diff --git a/packages/angular/test/apps/ng18/package-lock.json b/packages/angular/test/apps/ng18/package-lock.json
index 3e6d682cf6b..9df2127063f 100644
--- a/packages/angular/test/apps/ng18/package-lock.json
+++ b/packages/angular/test/apps/ng18/package-lock.json
@@ -38,12 +38,12 @@
"@angular/cli": "^18.0.0",
"@angular/compiler-cli": "^18.0.0",
"@angular/language-service": "^18.0.0",
+ "@playwright/test": "^1.54.2",
"@types/express": "^4.17.7",
"@types/ws": "8.5.3",
"@typescript-eslint/eslint-plugin": "^6.0.0",
"@typescript-eslint/parser": "^6.0.0",
"concurrently": "^6.0.0",
- "cypress": "^13.2.0",
"eslint": "^8.57.0",
"ts-loader": "^6.2.2",
"ts-node": "^8.3.0",
@@ -2600,64 +2600,6 @@
"node": ">=6.9.0"
}
},
- "node_modules/@colors/colors": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
- "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
- "dev": true,
- "optional": true,
- "engines": {
- "node": ">=0.1.90"
- }
- },
- "node_modules/@cypress/request": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.1.tgz",
- "integrity": "sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ==",
- "dev": true,
- "dependencies": {
- "aws-sign2": "~0.7.0",
- "aws4": "^1.8.0",
- "caseless": "~0.12.0",
- "combined-stream": "~1.0.6",
- "extend": "~3.0.2",
- "forever-agent": "~0.6.1",
- "form-data": "~2.3.2",
- "http-signature": "~1.3.6",
- "is-typedarray": "~1.0.0",
- "isstream": "~0.1.2",
- "json-stringify-safe": "~5.0.1",
- "mime-types": "~2.1.19",
- "performance-now": "^2.1.0",
- "qs": "6.10.4",
- "safe-buffer": "^5.1.2",
- "tough-cookie": "^4.1.3",
- "tunnel-agent": "^0.6.0",
- "uuid": "^8.3.2"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/@cypress/xvfb": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz",
- "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==",
- "dev": true,
- "dependencies": {
- "debug": "^3.1.0",
- "lodash.once": "^4.1.1"
- }
- },
- "node_modules/@cypress/xvfb/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
"node_modules/@discoveryjs/json-ext": {
"version": "0.5.7",
"resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz",
@@ -4330,6 +4272,22 @@
"node": ">=14"
}
},
+ "node_modules/@playwright/test": {
+ "version": "1.54.2",
+ "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.54.2.tgz",
+ "integrity": "sha512-A+znathYxPf+72riFd1r1ovOLqsIIB0jKIoPjyK2kqEIe30/6jF6BC7QNluHuwUmsD2tv1XZVugN8GqfTMOxsA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "playwright": "1.54.2"
+ },
+ "bin": {
+ "playwright": "cli.js"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/@rollup/rollup-android-arm-eabi": {
"version": "4.18.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz",
@@ -5006,18 +4964,6 @@
"@types/send": "*"
}
},
- "node_modules/@types/sinonjs__fake-timers": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz",
- "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==",
- "dev": true
- },
- "node_modules/@types/sizzle": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.8.tgz",
- "integrity": "sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg==",
- "dev": true
- },
"node_modules/@types/sockjs": {
"version": "0.3.36",
"resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz",
@@ -5036,16 +4982,6 @@
"@types/node": "*"
}
},
- "node_modules/@types/yauzl": {
- "version": "2.10.3",
- "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz",
- "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==",
- "dev": true,
- "optional": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
"node_modules/@typescript-eslint/eslint-plugin": {
"version": "6.21.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz",
@@ -5849,26 +5785,6 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
- "node_modules/arch": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz",
- "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
"node_modules/arg": {
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
@@ -5906,33 +5822,6 @@
"node": ">=8"
}
},
- "node_modules/asn1": {
- "version": "0.2.6",
- "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
- "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
- "dev": true,
- "dependencies": {
- "safer-buffer": "~2.1.0"
- }
- },
- "node_modules/assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
- "dev": true,
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/astral-regex": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
- "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/async": {
"version": "3.2.5",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz",
@@ -5945,15 +5834,6 @@
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
"dev": true
},
- "node_modules/at-least-node": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
- "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
- "dev": true,
- "engines": {
- "node": ">= 4.0.0"
- }
- },
"node_modules/autoprefixer": {
"version": "10.4.19",
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz",
@@ -5991,21 +5871,6 @@
"postcss": "^8.1.0"
}
},
- "node_modules/aws-sign2": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
- "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
- "dev": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/aws4": {
- "version": "1.13.0",
- "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.0.tgz",
- "integrity": "sha512-3AungXC4I8kKsS9PuS4JH2nc+0bVY/mjgrephHTIi8fpEeGsTHBUJeosp0Wc1myYMElmD0B3Oc4XL/HVJ4PV2g==",
- "dev": true
- },
"node_modules/axios": {
"version": "1.7.2",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz",
@@ -6158,15 +6023,6 @@
"integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==",
"dev": true
},
- "node_modules/bcrypt-pbkdf": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
- "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
- "dev": true,
- "dependencies": {
- "tweetnacl": "^0.14.3"
- }
- },
"node_modules/big.js": {
"version": "5.2.2",
"resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
@@ -6199,18 +6055,6 @@
"readable-stream": "^3.4.0"
}
},
- "node_modules/blob-util": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz",
- "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==",
- "dev": true
- },
- "node_modules/bluebird": {
- "version": "3.7.2",
- "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
- "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
- "dev": true
- },
"node_modules/body-parser": {
"version": "1.20.2",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz",
@@ -6351,15 +6195,6 @@
"ieee754": "^1.1.13"
}
},
- "node_modules/buffer-crc32": {
- "version": "0.2.13",
- "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
- "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
- "dev": true,
- "engines": {
- "node": "*"
- }
- },
"node_modules/buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
@@ -6421,15 +6256,6 @@
"node": "14 || >=16.14"
}
},
- "node_modules/cachedir": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz",
- "integrity": "sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/call-bind": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
@@ -6485,12 +6311,6 @@
}
]
},
- "node_modules/caseless": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
- "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==",
- "dev": true
- },
"node_modules/chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
@@ -6511,15 +6331,6 @@
"integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
"dev": true
},
- "node_modules/check-more-types": {
- "version": "2.24.0",
- "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz",
- "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==",
- "dev": true,
- "engines": {
- "node": ">= 0.8.0"
- }
- },
"node_modules/chokidar": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
@@ -6562,21 +6373,6 @@
"node": ">=6.0"
}
},
- "node_modules/ci-info": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
- "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/sibiraj-s"
- }
- ],
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/clean-stack": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
@@ -6610,37 +6406,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/cli-table3": {
- "version": "0.6.5",
- "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz",
- "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==",
- "dev": true,
- "dependencies": {
- "string-width": "^4.2.0"
- },
- "engines": {
- "node": "10.* || >= 12.*"
- },
- "optionalDependencies": {
- "@colors/colors": "1.5.0"
- }
- },
- "node_modules/cli-truncate": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
- "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
- "dev": true,
- "dependencies": {
- "slice-ansi": "^3.0.0",
- "string-width": "^4.2.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/cli-width": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz",
@@ -6770,30 +6535,12 @@
"node": ">= 0.8"
}
},
- "node_modules/commander": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
- "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
- "dev": true,
- "engines": {
- "node": ">= 6"
- }
- },
"node_modules/common-path-prefix": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz",
"integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==",
"dev": true
},
- "node_modules/common-tags": {
- "version": "1.8.2",
- "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz",
- "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==",
- "dev": true,
- "engines": {
- "node": ">=4.0.0"
- }
- },
"node_modules/compressible": {
"version": "2.0.18",
"resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
@@ -7402,160 +7149,6 @@
"node": ">=4"
}
},
- "node_modules/cypress": {
- "version": "13.10.0",
- "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.10.0.tgz",
- "integrity": "sha512-tOhwRlurVOQbMduX+KonoMeQILs2cwR3yHGGENoFvvSoLUBHmJ8b9/n21gFSDqjlOJ+SRVcwuh+fG/JDsHsT6Q==",
- "dev": true,
- "hasInstallScript": true,
- "dependencies": {
- "@cypress/request": "^3.0.0",
- "@cypress/xvfb": "^1.2.4",
- "@types/sinonjs__fake-timers": "8.1.1",
- "@types/sizzle": "^2.3.2",
- "arch": "^2.2.0",
- "blob-util": "^2.0.2",
- "bluebird": "^3.7.2",
- "buffer": "^5.7.1",
- "cachedir": "^2.3.0",
- "chalk": "^4.1.0",
- "check-more-types": "^2.24.0",
- "cli-cursor": "^3.1.0",
- "cli-table3": "~0.6.1",
- "commander": "^6.2.1",
- "common-tags": "^1.8.0",
- "dayjs": "^1.10.4",
- "debug": "^4.3.4",
- "enquirer": "^2.3.6",
- "eventemitter2": "6.4.7",
- "execa": "4.1.0",
- "executable": "^4.1.1",
- "extract-zip": "2.0.1",
- "figures": "^3.2.0",
- "fs-extra": "^9.1.0",
- "getos": "^3.2.1",
- "is-ci": "^3.0.1",
- "is-installed-globally": "~0.4.0",
- "lazy-ass": "^1.6.0",
- "listr2": "^3.8.3",
- "lodash": "^4.17.21",
- "log-symbols": "^4.0.0",
- "minimist": "^1.2.8",
- "ospath": "^1.2.2",
- "pretty-bytes": "^5.6.0",
- "process": "^0.11.10",
- "proxy-from-env": "1.0.0",
- "request-progress": "^3.0.0",
- "semver": "^7.5.3",
- "supports-color": "^8.1.1",
- "tmp": "~0.2.1",
- "untildify": "^4.0.0",
- "yauzl": "^2.10.0"
- },
- "bin": {
- "cypress": "bin/cypress"
- },
- "engines": {
- "node": "^16.0.0 || ^18.0.0 || >=20.0.0"
- }
- },
- "node_modules/cypress/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/cypress/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/cypress/node_modules/chalk/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/cypress/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/cypress/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/cypress/node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/cypress/node_modules/supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/supports-color?sponsor=1"
- }
- },
- "node_modules/dashdash": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
- "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
- "dev": true,
- "dependencies": {
- "assert-plus": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
"node_modules/date-fns": {
"version": "2.30.0",
"resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz",
@@ -7572,12 +7165,6 @@
"url": "https://opencollective.com/date-fns"
}
},
- "node_modules/dayjs": {
- "version": "1.11.11",
- "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.11.tgz",
- "integrity": "sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==",
- "dev": true
- },
"node_modules/debug": {
"version": "4.3.4",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
@@ -7906,22 +7493,6 @@
"integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
"dev": true
},
- "node_modules/ecc-jsbn": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
- "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
- "dev": true,
- "dependencies": {
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.1.0"
- }
- },
- "node_modules/ecc-jsbn/node_modules/jsbn": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
- "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
- "dev": true
- },
"node_modules/ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
@@ -8590,12 +8161,6 @@
"node": ">= 0.6"
}
},
- "node_modules/eventemitter2": {
- "version": "6.4.7",
- "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz",
- "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==",
- "dev": true
- },
"node_modules/eventemitter3": {
"version": "4.0.7",
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
@@ -8611,41 +8176,6 @@
"node": ">=0.8.x"
}
},
- "node_modules/execa": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz",
- "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==",
- "dev": true,
- "dependencies": {
- "cross-spawn": "^7.0.0",
- "get-stream": "^5.0.0",
- "human-signals": "^1.1.1",
- "is-stream": "^2.0.0",
- "merge-stream": "^2.0.0",
- "npm-run-path": "^4.0.0",
- "onetime": "^5.1.0",
- "signal-exit": "^3.0.2",
- "strip-final-newline": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/execa?sponsor=1"
- }
- },
- "node_modules/executable": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz",
- "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==",
- "dev": true,
- "dependencies": {
- "pify": "^2.2.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/exponential-backoff": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz",
@@ -8720,12 +8250,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/extend": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
- "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
- "dev": true
- },
"node_modules/external-editor": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
@@ -8752,35 +8276,6 @@
"node": ">=0.6.0"
}
},
- "node_modules/extract-zip": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
- "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
- "dev": true,
- "dependencies": {
- "debug": "^4.1.1",
- "get-stream": "^5.1.0",
- "yauzl": "^2.10.0"
- },
- "bin": {
- "extract-zip": "cli.js"
- },
- "engines": {
- "node": ">= 10.17.0"
- },
- "optionalDependencies": {
- "@types/yauzl": "^2.9.1"
- }
- },
- "node_modules/extsprintf": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
- "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
- "dev": true,
- "engines": [
- "node >=0.6.0"
- ]
- },
"node_modules/fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@@ -8840,15 +8335,6 @@
"node": ">=0.8.0"
}
},
- "node_modules/fd-slicer": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
- "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
- "dev": true,
- "dependencies": {
- "pend": "~1.2.0"
- }
- },
"node_modules/figures": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
@@ -9041,29 +8527,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/forever-agent": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
- "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
- "dev": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/form-data": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
- "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
- "dev": true,
- "dependencies": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.6",
- "mime-types": "^2.1.12"
- },
- "engines": {
- "node": ">= 0.12"
- }
- },
"node_modules/forwarded": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
@@ -9099,21 +8562,6 @@
"integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
"dev": true
},
- "node_modules/fs-extra": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
- "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
- "dev": true,
- "dependencies": {
- "at-least-node": "^1.0.0",
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/fs-minipass": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz",
@@ -9198,39 +8646,6 @@
"node": ">=8.0.0"
}
},
- "node_modules/get-stream": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
- "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
- "dev": true,
- "dependencies": {
- "pump": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/getos": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz",
- "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==",
- "dev": true,
- "dependencies": {
- "async": "^3.2.0"
- }
- },
- "node_modules/getpass": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
- "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
- "dev": true,
- "dependencies": {
- "assert-plus": "^1.0.0"
- }
- },
"node_modules/glob": {
"version": "10.4.1",
"resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz",
@@ -9285,30 +8700,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/global-dirs": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz",
- "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==",
- "dev": true,
- "dependencies": {
- "ini": "2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/global-dirs/node_modules/ini": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
- "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/globals": {
"version": "11.12.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
@@ -9592,20 +8983,6 @@
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/http-signature": {
- "version": "1.3.6",
- "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz",
- "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==",
- "dev": true,
- "dependencies": {
- "assert-plus": "^1.0.0",
- "jsprim": "^2.0.2",
- "sshpk": "^1.14.1"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
"node_modules/https-proxy-agent": {
"version": "7.0.4",
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz",
@@ -9619,15 +8996,6 @@
"node": ">= 14"
}
},
- "node_modules/human-signals": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
- "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
- "dev": true,
- "engines": {
- "node": ">=8.12.0"
- }
- },
"node_modules/hyperdyperid": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz",
@@ -9915,18 +9283,6 @@
"node": ">=8"
}
},
- "node_modules/is-ci": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz",
- "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==",
- "dev": true,
- "dependencies": {
- "ci-info": "^3.2.0"
- },
- "bin": {
- "is-ci": "bin.js"
- }
- },
"node_modules/is-core-module": {
"version": "2.13.1",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
@@ -10015,22 +9371,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/is-installed-globally": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz",
- "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==",
- "dev": true,
- "dependencies": {
- "global-dirs": "^3.0.0",
- "is-path-inside": "^3.0.2"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/is-interactive": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
@@ -10110,12 +9450,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
- "dev": true
- },
"node_modules/is-unicode-supported": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
@@ -10166,12 +9500,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/isstream": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
- "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==",
- "dev": true
- },
"node_modules/istanbul-lib-coverage": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
@@ -10539,12 +9867,6 @@
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
- "node_modules/json-schema": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
- "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
- "dev": true
- },
"node_modules/json-schema-traverse": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
@@ -10556,12 +9878,6 @@
"resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
"integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="
},
- "node_modules/json-stringify-safe": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
- "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
- "dev": true
- },
"node_modules/json5": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
@@ -10600,21 +9916,6 @@
"node >= 0.2.0"
]
},
- "node_modules/jsprim": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz",
- "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==",
- "dev": true,
- "engines": [
- "node >=0.6.0"
- ],
- "dependencies": {
- "assert-plus": "1.0.0",
- "extsprintf": "1.3.0",
- "json-schema": "0.4.0",
- "verror": "1.10.0"
- }
- },
"node_modules/karma-source-map-support": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz",
@@ -10651,15 +9952,6 @@
"shell-quote": "^1.8.1"
}
},
- "node_modules/lazy-ass": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz",
- "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==",
- "dev": true,
- "engines": {
- "node": "> 0.8"
- }
- },
"node_modules/less": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz",
@@ -10752,89 +10044,12 @@
}
},
"node_modules/lines-and-columns": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz",
- "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==",
- "dev": true,
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- }
- },
- "node_modules/listr2": {
- "version": "3.14.0",
- "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz",
- "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==",
- "dev": true,
- "dependencies": {
- "cli-truncate": "^2.1.0",
- "colorette": "^2.0.16",
- "log-update": "^4.0.0",
- "p-map": "^4.0.0",
- "rfdc": "^1.3.0",
- "rxjs": "^7.5.1",
- "through": "^2.3.8",
- "wrap-ansi": "^7.0.0"
- },
- "engines": {
- "node": ">=10.0.0"
- },
- "peerDependencies": {
- "enquirer": ">= 2.3.0 < 3"
- },
- "peerDependenciesMeta": {
- "enquirer": {
- "optional": true
- }
- }
- },
- "node_modules/listr2/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/listr2/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/listr2/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/listr2/node_modules/wrap-ansi": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
- "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- },
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz",
+ "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==",
+ "dev": true,
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
}
},
"node_modules/lmdb": {
@@ -10909,12 +10124,6 @@
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="
},
- "node_modules/lodash.once": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
- "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==",
- "dev": true
- },
"node_modules/log-symbols": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
@@ -11001,74 +10210,6 @@
"node": ">=8"
}
},
- "node_modules/log-update": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz",
- "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==",
- "dev": true,
- "dependencies": {
- "ansi-escapes": "^4.3.0",
- "cli-cursor": "^3.1.0",
- "slice-ansi": "^4.0.0",
- "wrap-ansi": "^6.2.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/log-update/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/log-update/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/log-update/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/log-update/node_modules/slice-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
- "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "astral-regex": "^2.0.0",
- "is-fullwidth-code-point": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/slice-ansi?sponsor=1"
- }
- },
"node_modules/lru-cache": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
@@ -12379,12 +11520,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/ospath": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz",
- "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==",
- "dev": true
- },
"node_modules/p-limit": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
@@ -12657,18 +11792,6 @@
"node": ">=8"
}
},
- "node_modules/pend": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
- "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
- "dev": true
- },
- "node_modules/performance-now": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
- "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
- "dev": true
- },
"node_modules/picocolors": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
@@ -12686,15 +11809,6 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
- "node_modules/pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/piscina": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/piscina/-/piscina-4.5.0.tgz",
@@ -12801,6 +11915,53 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/playwright": {
+ "version": "1.54.2",
+ "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.54.2.tgz",
+ "integrity": "sha512-Hu/BMoA1NAdRUuulyvQC0pEqZ4vQbGfn8f7wPXcnqQmM+zct9UliKxsIkLNmz/ku7LElUNqmaiv1TG/aL5ACsw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "playwright-core": "1.54.2"
+ },
+ "bin": {
+ "playwright": "cli.js"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "fsevents": "2.3.2"
+ }
+ },
+ "node_modules/playwright-core": {
+ "version": "1.54.2",
+ "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.54.2.tgz",
+ "integrity": "sha512-n5r4HFbMmWsB4twG7tJLDN9gmBUeSPcsBZiWSE4DnYz9mJMAFqr2ID7+eGC9kpEnxExJ1epttwR59LEWCk8mtA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "playwright-core": "cli.js"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/playwright/node_modules/fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
"node_modules/postcss": {
"version": "8.4.38",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz",
@@ -12950,18 +12111,6 @@
"node": ">= 0.8.0"
}
},
- "node_modules/pretty-bytes": {
- "version": "5.6.0",
- "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
- "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==",
- "dev": true,
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/pretty-format": {
"version": "29.7.0",
"resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
@@ -12997,15 +12146,6 @@
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
- "node_modules/process": {
- "version": "0.11.10",
- "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
- "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
- "dev": true,
- "engines": {
- "node": ">= 0.6.0"
- }
- },
"node_modules/process-nextick-args": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
@@ -13043,34 +12183,12 @@
"node": ">= 0.10"
}
},
- "node_modules/proxy-from-env": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz",
- "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==",
- "dev": true
- },
"node_modules/prr": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
"integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==",
"dev": true
},
- "node_modules/psl": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
- "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==",
- "dev": true
- },
- "node_modules/pump": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
- "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
- "dev": true,
- "dependencies": {
- "end-of-stream": "^1.1.0",
- "once": "^1.3.1"
- }
- },
"node_modules/punycode": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
@@ -13079,27 +12197,6 @@
"node": ">=6"
}
},
- "node_modules/qs": {
- "version": "6.10.4",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz",
- "integrity": "sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==",
- "dev": true,
- "dependencies": {
- "side-channel": "^1.0.4"
- },
- "engines": {
- "node": ">=0.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/querystringify": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
- "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
- "dev": true
- },
"node_modules/queue-microtask": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
@@ -13289,15 +12386,6 @@
"jsesc": "bin/jsesc"
}
},
- "node_modules/request-progress": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz",
- "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==",
- "dev": true,
- "dependencies": {
- "throttleit": "^1.0.0"
- }
- },
"node_modules/require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
@@ -13430,12 +12518,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/rfdc": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz",
- "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==",
- "dev": true
- },
"node_modules/rimraf": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
@@ -13982,53 +13064,6 @@
"node": ">=8"
}
},
- "node_modules/slice-ansi": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
- "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "astral-regex": "^2.0.0",
- "is-fullwidth-code-point": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/slice-ansi/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/slice-ansi/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/slice-ansi/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/smart-buffer": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
@@ -14239,37 +13274,6 @@
"integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
"dev": true
},
- "node_modules/sshpk": {
- "version": "1.18.0",
- "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz",
- "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==",
- "dev": true,
- "dependencies": {
- "asn1": "~0.2.3",
- "assert-plus": "^1.0.0",
- "bcrypt-pbkdf": "^1.0.0",
- "dashdash": "^1.12.0",
- "ecc-jsbn": "~0.1.1",
- "getpass": "^0.1.1",
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.0.2",
- "tweetnacl": "~0.14.0"
- },
- "bin": {
- "sshpk-conv": "bin/sshpk-conv",
- "sshpk-sign": "bin/sshpk-sign",
- "sshpk-verify": "bin/sshpk-verify"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/sshpk/node_modules/jsbn": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
- "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
- "dev": true
- },
"node_modules/ssri": {
"version": "10.0.6",
"resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz",
@@ -14693,15 +13697,6 @@
"tslib": "^2"
}
},
- "node_modules/throttleit": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.1.tgz",
- "integrity": "sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==",
- "dev": true,
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/through": {
"version": "2.3.8",
"resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
@@ -14751,30 +13746,6 @@
"node": ">=0.6"
}
},
- "node_modules/tough-cookie": {
- "version": "4.1.4",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz",
- "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==",
- "dev": true,
- "dependencies": {
- "psl": "^1.1.33",
- "punycode": "^2.1.1",
- "universalify": "^0.2.0",
- "url-parse": "^1.5.3"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/tough-cookie/node_modules/universalify": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
- "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
- "dev": true,
- "engines": {
- "node": ">= 4.0.0"
- }
- },
"node_modules/tree-dump": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.1.tgz",
@@ -14923,24 +13894,6 @@
"node": "^16.14.0 || >=18.0.0"
}
},
- "node_modules/tunnel-agent": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
- "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
- "dev": true,
- "dependencies": {
- "safe-buffer": "^5.0.1"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/tweetnacl": {
- "version": "0.14.5",
- "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
- "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==",
- "dev": true
- },
"node_modules/type-check": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
@@ -15100,15 +14053,6 @@
"node": ">= 0.8"
}
},
- "node_modules/untildify": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
- "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/update-browserslist-db": {
"version": "1.0.16",
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz",
@@ -15147,16 +14091,6 @@
"punycode": "^2.1.0"
}
},
- "node_modules/url-parse": {
- "version": "1.5.10",
- "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
- "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
- "dev": true,
- "dependencies": {
- "querystringify": "^2.1.1",
- "requires-port": "^1.0.0"
- }
- },
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
@@ -15207,20 +14141,6 @@
"node": ">= 0.8"
}
},
- "node_modules/verror": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
- "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
- "dev": true,
- "engines": [
- "node >=0.6.0"
- ],
- "dependencies": {
- "assert-plus": "^1.0.0",
- "core-util-is": "1.0.2",
- "extsprintf": "^1.2.0"
- }
- },
"node_modules/vite": {
"version": "5.2.11",
"resolved": "https://registry.npmjs.org/vite/-/vite-5.2.11.tgz",
@@ -16420,16 +15340,6 @@
"node": ">=12"
}
},
- "node_modules/yauzl": {
- "version": "2.10.0",
- "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
- "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
- "dev": true,
- "dependencies": {
- "buffer-crc32": "~0.2.3",
- "fd-slicer": "~1.1.0"
- }
- },
"node_modules/yn": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
diff --git a/packages/angular/test/apps/ng18/package.json b/packages/angular/test/apps/ng18/package.json
index a2e155e6b30..26807574812 100644
--- a/packages/angular/test/apps/ng18/package.json
+++ b/packages/angular/test/apps/ng18/package.json
@@ -13,10 +13,7 @@
"build:ssr": "ng build --prod && ng run test-app:server:production",
"dev:ssr": "ng run test-app:serve-ssr",
"prerender": "ng run test-app:prerender",
- "cy.open": "cypress open",
- "cy.run": "cypress run",
- "test": "concurrently \"npm run start -- --configuration production\" \"wait-on http-get://localhost:4200 && npm run cy.run\" --kill-others --success first",
- "test.watch": "concurrently \"npm run start\" \"wait-on http-get://localhost:4200 && npm run cy.open\" --kill-others --success first"
+ "test": "npx playwright test"
},
"dependencies": {
"@angular/animations": "^18.0.0",
@@ -49,12 +46,12 @@
"@angular/cli": "^18.0.0",
"@angular/compiler-cli": "^18.0.0",
"@angular/language-service": "^18.0.0",
+ "@playwright/test": "^1.54.2",
"@types/express": "^4.17.7",
"@types/ws": "8.5.3",
"@typescript-eslint/eslint-plugin": "^6.0.0",
"@typescript-eslint/parser": "^6.0.0",
"concurrently": "^6.0.0",
- "cypress": "^13.2.0",
"eslint": "^8.57.0",
"ts-loader": "^6.2.2",
"ts-node": "^8.3.0",
diff --git a/packages/angular/test/apps/ng19/e2e/src/lazy/angular-version.spec.ts b/packages/angular/test/apps/ng19/e2e/src/lazy/angular-version.spec.ts
deleted file mode 100644
index 45c156c45fc..00000000000
--- a/packages/angular/test/apps/ng19/e2e/src/lazy/angular-version.spec.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-it("should be on Angular 19", () => {
- cy.visit('/lazy');
-
- cy.get('ion-title').contains('Angular 19');
-});
diff --git a/packages/angular/test/apps/ng19/package-lock.json b/packages/angular/test/apps/ng19/package-lock.json
index ff89740387b..0a7124b4b46 100644
--- a/packages/angular/test/apps/ng19/package-lock.json
+++ b/packages/angular/test/apps/ng19/package-lock.json
@@ -39,13 +39,13 @@
"@angular/cli": "^19.0.1",
"@angular/compiler-cli": "^19.0.0",
"@angular/language-service": "^19.0.0",
+ "@playwright/test": "^1.54.2",
"@types/express": "^4.17.21",
"@types/node": "^22.9.3",
"@types/ws": "8.5.3",
"@typescript-eslint/eslint-plugin": "^6.0.0",
"@typescript-eslint/parser": "^6.0.0",
"concurrently": "^6.0.0",
- "cypress": "^13.16.0",
"eslint": "^8.57.0",
"ts-loader": "^6.2.2",
"ts-node": "^8.3.0",
@@ -3068,68 +3068,6 @@
"node": ">=6.9.0"
}
},
- "node_modules/@colors/colors": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
- "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">=0.1.90"
- }
- },
- "node_modules/@cypress/request": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.6.tgz",
- "integrity": "sha512-fi0eVdCOtKu5Ed6+E8mYxUF6ZTFJDZvHogCBelM0xVXmrDEkyM22gRArQzq1YcHPm1V47Vf/iAD+WgVdUlJCGg==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "aws-sign2": "~0.7.0",
- "aws4": "^1.8.0",
- "caseless": "~0.12.0",
- "combined-stream": "~1.0.6",
- "extend": "~3.0.2",
- "forever-agent": "~0.6.1",
- "form-data": "~4.0.0",
- "http-signature": "~1.4.0",
- "is-typedarray": "~1.0.0",
- "isstream": "~0.1.2",
- "json-stringify-safe": "~5.0.1",
- "mime-types": "~2.1.19",
- "performance-now": "^2.1.0",
- "qs": "6.13.0",
- "safe-buffer": "^5.1.2",
- "tough-cookie": "^5.0.0",
- "tunnel-agent": "^0.6.0",
- "uuid": "^8.3.2"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/@cypress/xvfb": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz",
- "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "debug": "^3.1.0",
- "lodash.once": "^4.1.1"
- }
- },
- "node_modules/@cypress/xvfb/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
"node_modules/@discoveryjs/json-ext": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz",
@@ -5594,6 +5532,22 @@
"node": ">=14"
}
},
+ "node_modules/@playwright/test": {
+ "version": "1.54.2",
+ "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.54.2.tgz",
+ "integrity": "sha512-A+znathYxPf+72riFd1r1ovOLqsIIB0jKIoPjyK2kqEIe30/6jF6BC7QNluHuwUmsD2tv1XZVugN8GqfTMOxsA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "playwright": "1.54.2"
+ },
+ "bin": {
+ "playwright": "cli.js"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/@rollup/rollup-android-arm-eabi": {
"version": "4.26.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.26.0.tgz",
@@ -6530,20 +6484,6 @@
"@types/send": "*"
}
},
- "node_modules/@types/sinonjs__fake-timers": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz",
- "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/sizzle": {
- "version": "2.3.9",
- "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.9.tgz",
- "integrity": "sha512-xzLEyKB50yqCUPUJkIsrVvoWNfFUbIZI+RspLWt8u+tIW/BetMBZtgV2LY/2o+tYH8dRvQ+eoPf3NdhQCcLE2w==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/@types/sockjs": {
"version": "0.3.36",
"resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz",
@@ -6564,17 +6504,6 @@
"@types/node": "*"
}
},
- "node_modules/@types/yauzl": {
- "version": "2.10.3",
- "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz",
- "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
"node_modules/@typescript-eslint/eslint-plugin": {
"version": "6.21.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz",
@@ -7503,27 +7432,6 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
- "node_modules/arch": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz",
- "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "MIT"
- },
"node_modules/arg": {
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
@@ -7562,43 +7470,6 @@
"node": ">=8"
}
},
- "node_modules/asn1": {
- "version": "0.2.6",
- "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
- "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "safer-buffer": "~2.1.0"
- }
- },
- "node_modules/assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/astral-regex": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
- "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/async": {
- "version": "3.2.6",
- "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
- "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
@@ -7606,16 +7477,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/at-least-node": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
- "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": ">= 4.0.0"
- }
- },
"node_modules/autoprefixer": {
"version": "10.4.20",
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz",
@@ -7654,23 +7515,6 @@
"postcss": "^8.1.0"
}
},
- "node_modules/aws-sign2": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
- "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "*"
- }
- },
- "node_modules/aws4": {
- "version": "1.13.2",
- "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz",
- "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/axios": {
"version": "1.7.8",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.7.8.tgz",
@@ -7804,16 +7648,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/bcrypt-pbkdf": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
- "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
- "dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "tweetnacl": "^0.14.3"
- }
- },
"node_modules/beasties": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/beasties/-/beasties-0.1.0.tgz",
@@ -7866,20 +7700,6 @@
"readable-stream": "^3.4.0"
}
},
- "node_modules/blob-util": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz",
- "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==",
- "dev": true,
- "license": "Apache-2.0"
- },
- "node_modules/bluebird": {
- "version": "3.7.2",
- "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
- "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/body-parser": {
"version": "1.20.1",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
@@ -8031,16 +7851,6 @@
"ieee754": "^1.1.13"
}
},
- "node_modules/buffer-crc32": {
- "version": "0.2.13",
- "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
- "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "*"
- }
- },
"node_modules/buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
@@ -8188,16 +7998,6 @@
"node": ">=18"
}
},
- "node_modules/cachedir": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz",
- "integrity": "sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/call-bind": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
@@ -8247,13 +8047,6 @@
],
"license": "CC-BY-4.0"
},
- "node_modules/caseless": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
- "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==",
- "dev": true,
- "license": "Apache-2.0"
- },
"node_modules/chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
@@ -8289,16 +8082,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/check-more-types": {
- "version": "2.24.0",
- "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz",
- "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.8.0"
- }
- },
"node_modules/chokidar": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
@@ -8357,22 +8140,6 @@
"node": ">=6.0"
}
},
- "node_modules/ci-info": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.1.0.tgz",
- "integrity": "sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/sibiraj-s"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/clean-stack": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
@@ -8409,22 +8176,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/cli-table3": {
- "version": "0.6.5",
- "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz",
- "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "string-width": "^4.2.0"
- },
- "engines": {
- "node": "10.* || >= 12.*"
- },
- "optionalDependencies": {
- "@colors/colors": "1.5.0"
- }
- },
"node_modules/cli-truncate": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz",
@@ -8615,16 +8366,6 @@
"node": ">= 0.8"
}
},
- "node_modules/commander": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
- "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 6"
- }
- },
"node_modules/common-path-prefix": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz",
@@ -8632,16 +8373,6 @@
"dev": true,
"license": "ISC"
},
- "node_modules/common-tags": {
- "version": "1.8.2",
- "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz",
- "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4.0.0"
- }
- },
"node_modules/compressible": {
"version": "2.0.18",
"resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
@@ -9110,219 +8841,6 @@
"node": ">=4"
}
},
- "node_modules/cypress": {
- "version": "13.16.0",
- "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.16.0.tgz",
- "integrity": "sha512-g6XcwqnvzXrqiBQR/5gN+QsyRmKRhls1y5E42fyOvsmU7JuY+wM6uHJWj4ZPttjabzbnRvxcik2WemR8+xT6FA==",
- "dev": true,
- "hasInstallScript": true,
- "license": "MIT",
- "dependencies": {
- "@cypress/request": "^3.0.6",
- "@cypress/xvfb": "^1.2.4",
- "@types/sinonjs__fake-timers": "8.1.1",
- "@types/sizzle": "^2.3.2",
- "arch": "^2.2.0",
- "blob-util": "^2.0.2",
- "bluebird": "^3.7.2",
- "buffer": "^5.7.1",
- "cachedir": "^2.3.0",
- "chalk": "^4.1.0",
- "check-more-types": "^2.24.0",
- "ci-info": "^4.0.0",
- "cli-cursor": "^3.1.0",
- "cli-table3": "~0.6.1",
- "commander": "^6.2.1",
- "common-tags": "^1.8.0",
- "dayjs": "^1.10.4",
- "debug": "^4.3.4",
- "enquirer": "^2.3.6",
- "eventemitter2": "6.4.7",
- "execa": "4.1.0",
- "executable": "^4.1.1",
- "extract-zip": "2.0.1",
- "figures": "^3.2.0",
- "fs-extra": "^9.1.0",
- "getos": "^3.2.1",
- "is-installed-globally": "~0.4.0",
- "lazy-ass": "^1.6.0",
- "listr2": "^3.8.3",
- "lodash": "^4.17.21",
- "log-symbols": "^4.0.0",
- "minimist": "^1.2.8",
- "ospath": "^1.2.2",
- "pretty-bytes": "^5.6.0",
- "process": "^0.11.10",
- "proxy-from-env": "1.0.0",
- "request-progress": "^3.0.0",
- "semver": "^7.5.3",
- "supports-color": "^8.1.1",
- "tmp": "~0.2.3",
- "tree-kill": "1.2.2",
- "untildify": "^4.0.0",
- "yauzl": "^2.10.0"
- },
- "bin": {
- "cypress": "bin/cypress"
- },
- "engines": {
- "node": "^16.0.0 || ^18.0.0 || >=20.0.0"
- }
- },
- "node_modules/cypress/node_modules/cli-truncate": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
- "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "slice-ansi": "^3.0.0",
- "string-width": "^4.2.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/cypress/node_modules/is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/cypress/node_modules/listr2": {
- "version": "3.14.0",
- "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz",
- "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "cli-truncate": "^2.1.0",
- "colorette": "^2.0.16",
- "log-update": "^4.0.0",
- "p-map": "^4.0.0",
- "rfdc": "^1.3.0",
- "rxjs": "^7.5.1",
- "through": "^2.3.8",
- "wrap-ansi": "^7.0.0"
- },
- "engines": {
- "node": ">=10.0.0"
- },
- "peerDependencies": {
- "enquirer": ">= 2.3.0 < 3"
- },
- "peerDependenciesMeta": {
- "enquirer": {
- "optional": true
- }
- }
- },
- "node_modules/cypress/node_modules/listr2/node_modules/wrap-ansi": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
- "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
- }
- },
- "node_modules/cypress/node_modules/log-update": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz",
- "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-escapes": "^4.3.0",
- "cli-cursor": "^3.1.0",
- "slice-ansi": "^4.0.0",
- "wrap-ansi": "^6.2.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/cypress/node_modules/log-update/node_modules/slice-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
- "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "astral-regex": "^2.0.0",
- "is-fullwidth-code-point": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/slice-ansi?sponsor=1"
- }
- },
- "node_modules/cypress/node_modules/p-map": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
- "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "aggregate-error": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/cypress/node_modules/slice-ansi": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
- "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "astral-regex": "^2.0.0",
- "is-fullwidth-code-point": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/dashdash": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
- "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "assert-plus": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
"node_modules/date-fns": {
"version": "2.30.0",
"resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz",
@@ -9340,13 +8858,6 @@
"url": "https://opencollective.com/date-fns"
}
},
- "node_modules/dayjs": {
- "version": "1.11.13",
- "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz",
- "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/debug": {
"version": "4.3.7",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
@@ -9603,24 +9114,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/ecc-jsbn": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
- "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.1.0"
- }
- },
- "node_modules/ecc-jsbn/node_modules/jsbn": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
- "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
@@ -9685,16 +9178,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/end-of-stream": {
- "version": "1.4.4",
- "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
- "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "once": "^1.4.0"
- }
- },
"node_modules/enhanced-resolve": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz",
@@ -9719,20 +9202,6 @@
"node": ">=6"
}
},
- "node_modules/enquirer": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz",
- "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-colors": "^4.1.1",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8.6"
- }
- },
"node_modules/entities": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
@@ -10170,13 +9639,6 @@
"node": ">= 0.6"
}
},
- "node_modules/eventemitter2": {
- "version": "6.4.7",
- "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz",
- "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/eventemitter3": {
"version": "4.0.7",
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
@@ -10194,50 +9656,6 @@
"node": ">=0.8.x"
}
},
- "node_modules/execa": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz",
- "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "cross-spawn": "^7.0.0",
- "get-stream": "^5.0.0",
- "human-signals": "^1.1.1",
- "is-stream": "^2.0.0",
- "merge-stream": "^2.0.0",
- "npm-run-path": "^4.0.0",
- "onetime": "^5.1.0",
- "signal-exit": "^3.0.2",
- "strip-final-newline": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/execa?sponsor=1"
- }
- },
- "node_modules/execa/node_modules/signal-exit": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
- "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/executable": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz",
- "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "pify": "^2.2.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/exponential-backoff": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz",
@@ -10317,13 +9735,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/extend": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
- "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/external-editor": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
@@ -10352,37 +9763,6 @@
"node": ">=0.6.0"
}
},
- "node_modules/extract-zip": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
- "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "debug": "^4.1.1",
- "get-stream": "^5.1.0",
- "yauzl": "^2.10.0"
- },
- "bin": {
- "extract-zip": "cli.js"
- },
- "engines": {
- "node": ">= 10.17.0"
- },
- "optionalDependencies": {
- "@types/yauzl": "^2.9.1"
- }
- },
- "node_modules/extsprintf": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
- "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
- "dev": true,
- "engines": [
- "node >=0.6.0"
- ],
- "license": "MIT"
- },
"node_modules/fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@@ -10468,42 +9848,6 @@
"node": ">=0.8.0"
}
},
- "node_modules/fd-slicer": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
- "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "pend": "~1.2.0"
- }
- },
- "node_modules/figures": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
- "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "escape-string-regexp": "^1.0.5"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/figures/node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.8.0"
- }
- },
"node_modules/file-entry-cache": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
@@ -10662,16 +10006,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/forever-agent": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
- "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "*"
- }
- },
"node_modules/form-data": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz",
@@ -10719,22 +10053,6 @@
"node": ">= 0.6"
}
},
- "node_modules/fs-extra": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
- "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "at-least-node": "^1.0.0",
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/fs-minipass": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz",
@@ -10825,45 +10143,9 @@
},
"engines": {
"node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/get-stream": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
- "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "pump": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/getos": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz",
- "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "async": "^3.2.0"
- }
- },
- "node_modules/getpass": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
- "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "assert-plus": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/glob": {
@@ -10922,32 +10204,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/global-dirs": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz",
- "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ini": "2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/global-dirs/node_modules/ini": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
- "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/globals": {
"version": "11.12.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
@@ -11263,21 +10519,6 @@
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/http-signature": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.4.0.tgz",
- "integrity": "sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "assert-plus": "^1.0.0",
- "jsprim": "^2.0.2",
- "sshpk": "^1.18.0"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
"node_modules/https-proxy-agent": {
"version": "7.0.5",
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz",
@@ -11292,16 +10533,6 @@
"node": ">= 14"
}
},
- "node_modules/human-signals": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
- "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=8.12.0"
- }
- },
"node_modules/hyperdyperid": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz",
@@ -11700,23 +10931,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/is-installed-globally": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz",
- "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "global-dirs": "^3.0.0",
- "is-path-inside": "^3.0.2"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/is-interactive": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
@@ -11801,13 +11015,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/is-unicode-supported": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
@@ -11867,13 +11074,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/isstream": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
- "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/istanbul-lib-coverage": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
@@ -12018,13 +11218,6 @@
"node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/json-schema": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
- "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
- "dev": true,
- "license": "(AFL-2.1 OR BSD-3-Clause)"
- },
"node_modules/json-schema-traverse": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
@@ -12038,13 +11231,6 @@
"integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
"license": "MIT"
},
- "node_modules/json-stringify-safe": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
- "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
- "dev": true,
- "license": "ISC"
- },
"node_modules/json5": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
@@ -12064,19 +11250,6 @@
"integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==",
"license": "MIT"
},
- "node_modules/jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "universalify": "^2.0.0"
- },
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
"node_modules/jsonparse": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
@@ -12087,22 +11260,6 @@
],
"license": "MIT"
},
- "node_modules/jsprim": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz",
- "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==",
- "dev": true,
- "engines": [
- "node >=0.6.0"
- ],
- "license": "MIT",
- "dependencies": {
- "assert-plus": "1.0.0",
- "extsprintf": "1.3.0",
- "json-schema": "0.4.0",
- "verror": "1.10.0"
- }
- },
"node_modules/karma-source-map-support": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz",
@@ -12143,16 +11300,6 @@
"shell-quote": "^1.8.1"
}
},
- "node_modules/lazy-ass": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz",
- "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "> 0.8"
- }
- },
"node_modules/less": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz",
@@ -12448,13 +11595,6 @@
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
"license": "MIT"
},
- "node_modules/lodash.once": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
- "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/log-symbols": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
@@ -13976,13 +13116,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/ospath": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz",
- "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/p-limit": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
@@ -14274,20 +13407,6 @@
"node": ">=8"
}
},
- "node_modules/pend": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
- "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/performance-now": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
- "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/picocolors": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
@@ -14308,16 +13427,6 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
- "node_modules/pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/piscina": {
"version": "4.7.0",
"resolved": "https://registry.npmjs.org/piscina/-/piscina-4.7.0.tgz",
@@ -14432,6 +13541,53 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/playwright": {
+ "version": "1.54.2",
+ "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.54.2.tgz",
+ "integrity": "sha512-Hu/BMoA1NAdRUuulyvQC0pEqZ4vQbGfn8f7wPXcnqQmM+zct9UliKxsIkLNmz/ku7LElUNqmaiv1TG/aL5ACsw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "playwright-core": "1.54.2"
+ },
+ "bin": {
+ "playwright": "cli.js"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "fsevents": "2.3.2"
+ }
+ },
+ "node_modules/playwright-core": {
+ "version": "1.54.2",
+ "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.54.2.tgz",
+ "integrity": "sha512-n5r4HFbMmWsB4twG7tJLDN9gmBUeSPcsBZiWSE4DnYz9mJMAFqr2ID7+eGC9kpEnxExJ1epttwR59LEWCk8mtA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "playwright-core": "cli.js"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/playwright/node_modules/fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
"node_modules/postcss": {
"version": "8.4.49",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz",
@@ -14593,19 +13749,6 @@
"node": ">= 0.8.0"
}
},
- "node_modules/pretty-bytes": {
- "version": "5.6.0",
- "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
- "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/proc-log": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz",
@@ -14616,16 +13759,6 @@
"node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/process": {
- "version": "0.11.10",
- "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
- "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.6.0"
- }
- },
"node_modules/process-nextick-args": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
@@ -14667,13 +13800,6 @@
"node": ">= 0.10"
}
},
- "node_modules/proxy-from-env": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz",
- "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/prr": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
@@ -14681,17 +13807,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/pump": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz",
- "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "end-of-stream": "^1.1.0",
- "once": "^1.3.1"
- }
- },
"node_modules/punycode": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
@@ -14970,16 +14085,6 @@
"regjsparser": "bin/parser"
}
},
- "node_modules/request-progress": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz",
- "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "throttleit": "^1.0.0"
- }
- },
"node_modules/require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
@@ -15966,39 +15071,6 @@
"dev": true,
"license": "BSD-3-Clause"
},
- "node_modules/sshpk": {
- "version": "1.18.0",
- "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz",
- "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "asn1": "~0.2.3",
- "assert-plus": "^1.0.0",
- "bcrypt-pbkdf": "^1.0.0",
- "dashdash": "^1.12.0",
- "ecc-jsbn": "~0.1.1",
- "getpass": "^0.1.1",
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.0.2",
- "tweetnacl": "~0.14.0"
- },
- "bin": {
- "sshpk-conv": "bin/sshpk-conv",
- "sshpk-sign": "bin/sshpk-sign",
- "sshpk-verify": "bin/sshpk-verify"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/sshpk/node_modules/jsbn": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
- "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/ssri": {
"version": "12.0.0",
"resolved": "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz",
@@ -16373,23 +15445,6 @@
"tslib": "^2"
}
},
- "node_modules/throttleit": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.1.tgz",
- "integrity": "sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/through": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
- "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/thunky": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
@@ -16397,36 +15452,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/tldts": {
- "version": "6.1.64",
- "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.64.tgz",
- "integrity": "sha512-ph4AE5BXWIOsSy9stpoeo7bYe/Cy7VfpciIH4RhVZUPItCJmhqWCN0EVzxd8BOHiyNb42vuJc6NWTjJkg91Tuw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "tldts-core": "^6.1.64"
- },
- "bin": {
- "tldts": "bin/cli.js"
- }
- },
- "node_modules/tldts-core": {
- "version": "6.1.64",
- "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.64.tgz",
- "integrity": "sha512-uqnl8vGV16KsyflHOzqrYjjArjfXaU6rMPXYy2/ZWoRKCkXtghgB4VwTDXUG+t0OTGeSewNAG31/x1gCTfLt+Q==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/tmp": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz",
- "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=14.14"
- }
- },
"node_modules/to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -16448,19 +15473,6 @@
"node": ">=0.6"
}
},
- "node_modules/tough-cookie": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.0.0.tgz",
- "integrity": "sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==",
- "dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "tldts": "^6.1.32"
- },
- "engines": {
- "node": ">=16"
- }
- },
"node_modules/tree-dump": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.2.tgz",
@@ -16788,26 +15800,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/tunnel-agent": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
- "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "safe-buffer": "^5.0.1"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/tweetnacl": {
- "version": "0.14.5",
- "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
- "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==",
- "dev": true,
- "license": "Unlicense"
- },
"node_modules/type-check": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
@@ -16967,16 +15959,6 @@
"node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 10.0.0"
- }
- },
"node_modules/unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
@@ -16986,16 +15968,6 @@
"node": ">= 0.8"
}
},
- "node_modules/untildify": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
- "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/update-browserslist-db": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz",
@@ -17092,21 +16064,6 @@
"node": ">= 0.8"
}
},
- "node_modules/verror": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
- "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
- "dev": true,
- "engines": [
- "node >=0.6.0"
- ],
- "license": "MIT",
- "dependencies": {
- "assert-plus": "^1.0.0",
- "core-util-is": "1.0.2",
- "extsprintf": "^1.2.0"
- }
- },
"node_modules/vite": {
"version": "5.4.11",
"resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz",
@@ -18499,17 +17456,6 @@
"node": ">=12"
}
},
- "node_modules/yauzl": {
- "version": "2.10.0",
- "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
- "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "buffer-crc32": "~0.2.3",
- "fd-slicer": "~1.1.0"
- }
- },
"node_modules/yn": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
diff --git a/packages/angular/test/apps/ng19/package.json b/packages/angular/test/apps/ng19/package.json
index 27c70b8650c..3d8a669e3e1 100644
--- a/packages/angular/test/apps/ng19/package.json
+++ b/packages/angular/test/apps/ng19/package.json
@@ -13,10 +13,7 @@
"build:ssr": "ng build --prod && ng run test-app:server:production",
"dev:ssr": "ng run test-app:serve-ssr",
"prerender": "ng run test-app:prerender",
- "cy.open": "cypress open",
- "cy.run": "cypress run",
- "test": "concurrently \"npm run start -- --configuration production\" \"wait-on http-get://localhost:4200 && npm run cy.run\" --kill-others --success first",
- "test.watch": "concurrently \"npm run start\" \"wait-on http-get://localhost:4200 && npm run cy.open\" --kill-others --success first"
+ "test": "npx playwright test"
},
"dependencies": {
"@angular/animations": "^19.0.0",
@@ -50,13 +47,13 @@
"@angular/cli": "^19.0.1",
"@angular/compiler-cli": "^19.0.0",
"@angular/language-service": "^19.0.0",
+ "@playwright/test": "^1.54.2",
"@types/express": "^4.17.21",
"@types/node": "^22.9.3",
"@types/ws": "8.5.3",
"@typescript-eslint/eslint-plugin": "^6.0.0",
"@typescript-eslint/parser": "^6.0.0",
"concurrently": "^6.0.0",
- "cypress": "^13.16.0",
"eslint": "^8.57.0",
"ts-loader": "^6.2.2",
"ts-node": "^8.3.0",
diff --git a/packages/angular/test/apps/ng20/e2e/src/lazy/angular-version.spec.ts b/packages/angular/test/apps/ng20/e2e/src/lazy/angular-version.spec.ts
deleted file mode 100644
index 9d28d86d776..00000000000
--- a/packages/angular/test/apps/ng20/e2e/src/lazy/angular-version.spec.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-it("should be on Angular 20", () => {
- cy.visit('/lazy');
-
- cy.get('ion-title').contains('Angular 20');
-});
diff --git a/packages/angular/test/apps/ng20/package-lock.json b/packages/angular/test/apps/ng20/package-lock.json
index f6fb33b913d..736a354c978 100644
--- a/packages/angular/test/apps/ng20/package-lock.json
+++ b/packages/angular/test/apps/ng20/package-lock.json
@@ -39,13 +39,13 @@
"@angular/cli": "^20.0.0",
"@angular/compiler-cli": "^20.0.0",
"@angular/language-service": "^20.0.0",
+ "@playwright/test": "^1.54.2",
"@types/express": "^4.17.21",
"@types/node": "^22.9.3",
"@types/ws": "8.5.3",
"@typescript-eslint/eslint-plugin": "^6.0.0",
"@typescript-eslint/parser": "^6.0.0",
"concurrently": "^6.0.0",
- "cypress": "^13.16.0",
"eslint": "^8.57.0",
"ts-loader": "^6.2.2",
"ts-node": "^8.3.0",
@@ -2652,68 +2652,6 @@
"node": ">=6.9.0"
}
},
- "node_modules/@colors/colors": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
- "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">=0.1.90"
- }
- },
- "node_modules/@cypress/request": {
- "version": "3.0.8",
- "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.8.tgz",
- "integrity": "sha512-h0NFgh1mJmm1nr4jCwkGHwKneVYKghUyWe6TMNrk0B9zsjAJxpg8C4/+BAcmLgCPa1vj1V8rNUaILl+zYRUWBQ==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "aws-sign2": "~0.7.0",
- "aws4": "^1.8.0",
- "caseless": "~0.12.0",
- "combined-stream": "~1.0.6",
- "extend": "~3.0.2",
- "forever-agent": "~0.6.1",
- "form-data": "~4.0.0",
- "http-signature": "~1.4.0",
- "is-typedarray": "~1.0.0",
- "isstream": "~0.1.2",
- "json-stringify-safe": "~5.0.1",
- "mime-types": "~2.1.19",
- "performance-now": "^2.1.0",
- "qs": "6.14.0",
- "safe-buffer": "^5.1.2",
- "tough-cookie": "^5.0.0",
- "tunnel-agent": "^0.6.0",
- "uuid": "^8.3.2"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/@cypress/xvfb": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz",
- "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "debug": "^3.1.0",
- "lodash.once": "^4.1.1"
- }
- },
- "node_modules/@cypress/xvfb/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
"node_modules/@discoveryjs/json-ext": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz",
@@ -5148,6 +5086,22 @@
"node": ">=14"
}
},
+ "node_modules/@playwright/test": {
+ "version": "1.54.2",
+ "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.54.2.tgz",
+ "integrity": "sha512-A+znathYxPf+72riFd1r1ovOLqsIIB0jKIoPjyK2kqEIe30/6jF6BC7QNluHuwUmsD2tv1XZVugN8GqfTMOxsA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "playwright": "1.54.2"
+ },
+ "bin": {
+ "playwright": "cli.js"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/@rollup/rollup-android-arm-eabi": {
"version": "4.40.2",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.2.tgz",
@@ -5813,20 +5767,6 @@
"@types/send": "*"
}
},
- "node_modules/@types/sinonjs__fake-timers": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz",
- "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/sizzle": {
- "version": "2.3.9",
- "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.9.tgz",
- "integrity": "sha512-xzLEyKB50yqCUPUJkIsrVvoWNfFUbIZI+RspLWt8u+tIW/BetMBZtgV2LY/2o+tYH8dRvQ+eoPf3NdhQCcLE2w==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/@types/sockjs": {
"version": "0.3.36",
"resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz",
@@ -5847,17 +5787,6 @@
"@types/node": "*"
}
},
- "node_modules/@types/yauzl": {
- "version": "2.10.3",
- "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz",
- "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
"node_modules/@typescript-eslint/eslint-plugin": {
"version": "6.21.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz",
@@ -6695,20 +6624,6 @@
"node": ">= 14"
}
},
- "node_modules/aggregate-error": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
- "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "clean-stack": "^2.0.0",
- "indent-string": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/ajv": {
"version": "8.17.1",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
@@ -6847,27 +6762,6 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
- "node_modules/arch": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz",
- "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "MIT"
- },
"node_modules/arg": {
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
@@ -6906,43 +6800,6 @@
"node": ">=8"
}
},
- "node_modules/asn1": {
- "version": "0.2.6",
- "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
- "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "safer-buffer": "~2.1.0"
- }
- },
- "node_modules/assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/astral-regex": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
- "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/async": {
- "version": "3.2.6",
- "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
- "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
@@ -6950,16 +6807,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/at-least-node": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
- "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": ">= 4.0.0"
- }
- },
"node_modules/autoprefixer": {
"version": "10.4.21",
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz",
@@ -6998,23 +6845,6 @@
"postcss": "^8.1.0"
}
},
- "node_modules/aws-sign2": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
- "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "*"
- }
- },
- "node_modules/aws4": {
- "version": "1.13.2",
- "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz",
- "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/axios": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz",
@@ -7119,27 +6949,6 @@
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"license": "MIT"
},
- "node_modules/base64-js": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
- "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "MIT"
- },
"node_modules/batch": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
@@ -7147,16 +6956,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/bcrypt-pbkdf": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
- "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
- "dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "tweetnacl": "^0.14.3"
- }
- },
"node_modules/beasties": {
"version": "0.3.4",
"resolved": "https://registry.npmjs.org/beasties/-/beasties-0.3.4.tgz",
@@ -7200,20 +6999,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/blob-util": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz",
- "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==",
- "dev": true,
- "license": "Apache-2.0"
- },
- "node_modules/bluebird": {
- "version": "3.7.2",
- "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
- "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/body-parser": {
"version": "1.20.3",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
@@ -7340,41 +7125,6 @@
"node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
}
},
- "node_modules/buffer": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
- "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.1.13"
- }
- },
- "node_modules/buffer-crc32": {
- "version": "0.2.13",
- "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
- "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "*"
- }
- },
"node_modules/buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
@@ -7492,16 +7242,6 @@
"node": ">=18"
}
},
- "node_modules/cachedir": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz",
- "integrity": "sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/call-bind-apply-helpers": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
@@ -7561,13 +7301,6 @@
],
"license": "CC-BY-4.0"
},
- "node_modules/caseless": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
- "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==",
- "dev": true,
- "license": "Apache-2.0"
- },
"node_modules/chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
@@ -7603,16 +7336,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/check-more-types": {
- "version": "2.24.0",
- "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz",
- "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.8.0"
- }
- },
"node_modules/chokidar": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
@@ -7649,45 +7372,6 @@
"node": ">=6.0"
}
},
- "node_modules/ci-info": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.2.0.tgz",
- "integrity": "sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/sibiraj-s"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/clean-stack": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
- "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/cli-cursor": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
- "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "restore-cursor": "^3.1.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/cli-spinners": {
"version": "2.9.2",
"resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz",
@@ -7701,22 +7385,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/cli-table3": {
- "version": "0.6.5",
- "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz",
- "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "string-width": "^4.2.0"
- },
- "engines": {
- "node": "10.* || >= 12.*"
- },
- "optionalDependencies": {
- "@colors/colors": "1.5.0"
- }
- },
"node_modules/cli-truncate": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz",
@@ -7897,26 +7565,6 @@
"node": ">= 0.8"
}
},
- "node_modules/commander": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
- "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/common-tags": {
- "version": "1.8.2",
- "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz",
- "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4.0.0"
- }
- },
"node_modules/compressible": {
"version": "2.0.18",
"resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
@@ -8326,227 +7974,14 @@
"node": ">=4"
}
},
- "node_modules/cypress": {
- "version": "13.17.0",
- "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.17.0.tgz",
- "integrity": "sha512-5xWkaPurwkIljojFidhw8lFScyxhtiFHl/i/3zov+1Z5CmY4t9tjIdvSXfu82Y3w7wt0uR9KkucbhkVvJZLQSA==",
+ "node_modules/date-fns": {
+ "version": "2.30.0",
+ "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz",
+ "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==",
"dev": true,
- "hasInstallScript": true,
"license": "MIT",
"dependencies": {
- "@cypress/request": "^3.0.6",
- "@cypress/xvfb": "^1.2.4",
- "@types/sinonjs__fake-timers": "8.1.1",
- "@types/sizzle": "^2.3.2",
- "arch": "^2.2.0",
- "blob-util": "^2.0.2",
- "bluebird": "^3.7.2",
- "buffer": "^5.7.1",
- "cachedir": "^2.3.0",
- "chalk": "^4.1.0",
- "check-more-types": "^2.24.0",
- "ci-info": "^4.0.0",
- "cli-cursor": "^3.1.0",
- "cli-table3": "~0.6.1",
- "commander": "^6.2.1",
- "common-tags": "^1.8.0",
- "dayjs": "^1.10.4",
- "debug": "^4.3.4",
- "enquirer": "^2.3.6",
- "eventemitter2": "6.4.7",
- "execa": "4.1.0",
- "executable": "^4.1.1",
- "extract-zip": "2.0.1",
- "figures": "^3.2.0",
- "fs-extra": "^9.1.0",
- "getos": "^3.2.1",
- "is-installed-globally": "~0.4.0",
- "lazy-ass": "^1.6.0",
- "listr2": "^3.8.3",
- "lodash": "^4.17.21",
- "log-symbols": "^4.0.0",
- "minimist": "^1.2.8",
- "ospath": "^1.2.2",
- "pretty-bytes": "^5.6.0",
- "process": "^0.11.10",
- "proxy-from-env": "1.0.0",
- "request-progress": "^3.0.0",
- "semver": "^7.5.3",
- "supports-color": "^8.1.1",
- "tmp": "~0.2.3",
- "tree-kill": "1.2.2",
- "untildify": "^4.0.0",
- "yauzl": "^2.10.0"
- },
- "bin": {
- "cypress": "bin/cypress"
- },
- "engines": {
- "node": "^16.0.0 || ^18.0.0 || >=20.0.0"
- }
- },
- "node_modules/cypress/node_modules/cli-truncate": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
- "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "slice-ansi": "^3.0.0",
- "string-width": "^4.2.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/cypress/node_modules/is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/cypress/node_modules/listr2": {
- "version": "3.14.0",
- "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz",
- "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "cli-truncate": "^2.1.0",
- "colorette": "^2.0.16",
- "log-update": "^4.0.0",
- "p-map": "^4.0.0",
- "rfdc": "^1.3.0",
- "rxjs": "^7.5.1",
- "through": "^2.3.8",
- "wrap-ansi": "^7.0.0"
- },
- "engines": {
- "node": ">=10.0.0"
- },
- "peerDependencies": {
- "enquirer": ">= 2.3.0 < 3"
- },
- "peerDependenciesMeta": {
- "enquirer": {
- "optional": true
- }
- }
- },
- "node_modules/cypress/node_modules/listr2/node_modules/wrap-ansi": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
- "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
- }
- },
- "node_modules/cypress/node_modules/log-update": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz",
- "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-escapes": "^4.3.0",
- "cli-cursor": "^3.1.0",
- "slice-ansi": "^4.0.0",
- "wrap-ansi": "^6.2.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/cypress/node_modules/log-update/node_modules/slice-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
- "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "astral-regex": "^2.0.0",
- "is-fullwidth-code-point": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/slice-ansi?sponsor=1"
- }
- },
- "node_modules/cypress/node_modules/p-map": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
- "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "aggregate-error": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/cypress/node_modules/slice-ansi": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
- "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "astral-regex": "^2.0.0",
- "is-fullwidth-code-point": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/dashdash": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
- "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "assert-plus": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/date-fns": {
- "version": "2.30.0",
- "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz",
- "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.21.0"
+ "@babel/runtime": "^7.21.0"
},
"engines": {
"node": ">=0.11"
@@ -8556,13 +7991,6 @@
"url": "https://opencollective.com/date-fns"
}
},
- "node_modules/dayjs": {
- "version": "1.11.13",
- "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz",
- "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/debug": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
@@ -8803,24 +8231,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/ecc-jsbn": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
- "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.1.0"
- }
- },
- "node_modules/ecc-jsbn/node_modules/jsbn": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
- "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
@@ -8885,16 +8295,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/end-of-stream": {
- "version": "1.4.5",
- "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
- "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "once": "^1.4.0"
- }
- },
"node_modules/enhanced-resolve": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz",
@@ -8919,20 +8319,6 @@
"node": ">=6"
}
},
- "node_modules/enquirer": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz",
- "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-colors": "^4.1.1",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8.6"
- }
- },
"node_modules/entities": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
@@ -9396,13 +8782,6 @@
"node": ">= 0.6"
}
},
- "node_modules/eventemitter2": {
- "version": "6.4.7",
- "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz",
- "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/eventemitter3": {
"version": "4.0.7",
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
@@ -9420,50 +8799,6 @@
"node": ">=0.8.x"
}
},
- "node_modules/execa": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz",
- "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "cross-spawn": "^7.0.0",
- "get-stream": "^5.0.0",
- "human-signals": "^1.1.1",
- "is-stream": "^2.0.0",
- "merge-stream": "^2.0.0",
- "npm-run-path": "^4.0.0",
- "onetime": "^5.1.0",
- "signal-exit": "^3.0.2",
- "strip-final-newline": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/execa?sponsor=1"
- }
- },
- "node_modules/execa/node_modules/signal-exit": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
- "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/executable": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz",
- "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "pify": "^2.2.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/exponential-backoff": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz",
@@ -9547,13 +8882,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/extend": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
- "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/external-editor": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
@@ -9582,37 +8910,6 @@
"node": ">=0.6.0"
}
},
- "node_modules/extract-zip": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
- "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "debug": "^4.1.1",
- "get-stream": "^5.1.0",
- "yauzl": "^2.10.0"
- },
- "bin": {
- "extract-zip": "cli.js"
- },
- "engines": {
- "node": ">= 10.17.0"
- },
- "optionalDependencies": {
- "@types/yauzl": "^2.9.1"
- }
- },
- "node_modules/extsprintf": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
- "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
- "dev": true,
- "engines": [
- "node >=0.6.0"
- ],
- "license": "MIT"
- },
"node_modules/fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@@ -9708,16 +9005,6 @@
"node": ">=0.8.0"
}
},
- "node_modules/fd-slicer": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
- "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "pend": "~1.2.0"
- }
- },
"node_modules/fdir": {
"version": "6.4.6",
"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz",
@@ -9733,32 +9020,6 @@
}
}
},
- "node_modules/figures": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
- "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "escape-string-regexp": "^1.0.5"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/figures/node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.8.0"
- }
- },
"node_modules/file-entry-cache": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
@@ -9900,16 +9161,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/forever-agent": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
- "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "*"
- }
- },
"node_modules/form-data": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.3.tgz",
@@ -9959,22 +9210,6 @@
"node": ">= 0.6"
}
},
- "node_modules/fs-extra": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
- "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "at-least-node": "^1.0.0",
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/fs-minipass": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz",
@@ -10088,42 +9323,6 @@
"node": ">= 0.4"
}
},
- "node_modules/get-stream": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
- "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "pump": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/getos": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz",
- "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "async": "^3.2.0"
- }
- },
- "node_modules/getpass": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
- "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "assert-plus": "^1.0.0"
- }
- },
"node_modules/glob": {
"version": "10.4.5",
"resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
@@ -10180,32 +9379,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/global-dirs": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz",
- "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ini": "2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/global-dirs/node_modules/ini": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
- "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/globals": {
"version": "11.12.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
@@ -10476,21 +9649,6 @@
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/http-signature": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.4.0.tgz",
- "integrity": "sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "assert-plus": "^1.0.0",
- "jsprim": "^2.0.2",
- "sshpk": "^1.18.0"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
"node_modules/https-proxy-agent": {
"version": "7.0.6",
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
@@ -10505,16 +9663,6 @@
"node": ">= 14"
}
},
- "node_modules/human-signals": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
- "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=8.12.0"
- }
- },
"node_modules/hyperdyperid": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz",
@@ -10550,27 +9698,6 @@
"postcss": "^8.1.0"
}
},
- "node_modules/ieee754": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
- "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "BSD-3-Clause"
- },
"node_modules/ignore": {
"version": "7.0.5",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
@@ -10660,16 +9787,6 @@
"node": ">=0.8.19"
}
},
- "node_modules/indent-string": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
- "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
@@ -10867,23 +9984,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/is-installed-globally": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz",
- "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "global-dirs": "^3.0.0",
- "is-path-inside": "^3.0.2"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/is-interactive": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz",
@@ -10951,39 +10051,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/is-stream": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
- "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/is-unicode-supported": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
- "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/is-what": {
"version": "3.14.1",
"resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz",
@@ -11030,13 +10097,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/isstream": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
- "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/istanbul-lib-coverage": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
@@ -11174,13 +10234,6 @@
"node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/json-schema": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
- "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
- "dev": true,
- "license": "(AFL-2.1 OR BSD-3-Clause)"
- },
"node_modules/json-schema-traverse": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
@@ -11194,13 +10247,6 @@
"integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
"license": "MIT"
},
- "node_modules/json-stringify-safe": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
- "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
- "dev": true,
- "license": "ISC"
- },
"node_modules/json5": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
@@ -11220,44 +10266,15 @@
"integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==",
"license": "MIT"
},
- "node_modules/jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "universalify": "^2.0.0"
- },
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
"node_modules/jsonparse": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
"integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==",
"dev": true,
"engines": [
- "node >= 0.2.0"
- ],
- "license": "MIT"
- },
- "node_modules/jsprim": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz",
- "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==",
- "dev": true,
- "engines": [
- "node >=0.6.0"
- ],
- "license": "MIT",
- "dependencies": {
- "assert-plus": "1.0.0",
- "extsprintf": "1.3.0",
- "json-schema": "0.4.0",
- "verror": "1.10.0"
- }
+ "node >= 0.2.0"
+ ],
+ "license": "MIT"
},
"node_modules/karma-source-map-support": {
"version": "1.4.0",
@@ -11299,16 +10316,6 @@
"shell-quote": "^1.8.1"
}
},
- "node_modules/lazy-ass": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz",
- "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "> 0.8"
- }
- },
"node_modules/less": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/less/-/less-4.3.0.tgz",
@@ -11605,30 +10612,6 @@
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
"license": "MIT"
},
- "node_modules/lodash.once": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
- "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/log-symbols": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
- "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "chalk": "^4.1.0",
- "is-unicode-supported": "^0.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/log-update": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz",
@@ -12073,16 +11056,6 @@
"node": ">= 0.6"
}
},
- "node_modules/mimic-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
- "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/mimic-function": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz",
@@ -12745,19 +11718,6 @@
"node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/npm-run-path": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
- "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "path-key": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/nth-check": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
@@ -12821,22 +11781,6 @@
"wrappy": "1"
}
},
- "node_modules/onetime": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
- "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "mimic-fn": "^2.1.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/open": {
"version": "10.1.2",
"resolved": "https://registry.npmjs.org/open/-/open-10.1.2.tgz",
@@ -13074,13 +12018,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/ospath": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz",
- "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/p-limit": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
@@ -13398,20 +12335,6 @@
"node": ">=8"
}
},
- "node_modules/pend": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
- "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/performance-now": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
- "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/picocolors": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
@@ -13432,16 +12355,6 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
- "node_modules/pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/piscina": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/piscina/-/piscina-5.0.0.tgz",
@@ -13524,6 +12437,53 @@
"node": ">=8"
}
},
+ "node_modules/playwright": {
+ "version": "1.54.2",
+ "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.54.2.tgz",
+ "integrity": "sha512-Hu/BMoA1NAdRUuulyvQC0pEqZ4vQbGfn8f7wPXcnqQmM+zct9UliKxsIkLNmz/ku7LElUNqmaiv1TG/aL5ACsw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "playwright-core": "1.54.2"
+ },
+ "bin": {
+ "playwright": "cli.js"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "fsevents": "2.3.2"
+ }
+ },
+ "node_modules/playwright-core": {
+ "version": "1.54.2",
+ "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.54.2.tgz",
+ "integrity": "sha512-n5r4HFbMmWsB4twG7tJLDN9gmBUeSPcsBZiWSE4DnYz9mJMAFqr2ID7+eGC9kpEnxExJ1epttwR59LEWCk8mtA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "playwright-core": "cli.js"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/playwright/node_modules/fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
"node_modules/postcss": {
"version": "8.5.3",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz",
@@ -13685,19 +12645,6 @@
"node": ">= 0.8.0"
}
},
- "node_modules/pretty-bytes": {
- "version": "5.6.0",
- "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
- "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/proc-log": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz",
@@ -13708,16 +12655,6 @@
"node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/process": {
- "version": "0.11.10",
- "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
- "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.6.0"
- }
- },
"node_modules/process-nextick-args": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
@@ -13752,13 +12689,6 @@
"node": ">= 0.10"
}
},
- "node_modules/proxy-from-env": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz",
- "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/prr": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
@@ -13766,17 +12696,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/pump": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz",
- "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "end-of-stream": "^1.1.0",
- "once": "^1.3.1"
- }
- },
"node_modules/punycode": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
@@ -13786,22 +12705,6 @@
"node": ">=6"
}
},
- "node_modules/qs": {
- "version": "6.14.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
- "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
- "dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "side-channel": "^1.1.0"
- },
- "engines": {
- "node": ">=0.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/queue-microtask": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
@@ -13991,16 +12894,6 @@
"node": ">=6"
}
},
- "node_modules/request-progress": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz",
- "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "throttleit": "^1.0.0"
- }
- },
"node_modules/require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
@@ -14123,27 +13016,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/restore-cursor": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
- "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "onetime": "^5.1.0",
- "signal-exit": "^3.0.2"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/restore-cursor/node_modules/signal-exit": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
- "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
- "dev": true,
- "license": "ISC"
- },
"node_modules/retry": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
@@ -15172,39 +14044,6 @@
"dev": true,
"license": "BSD-3-Clause"
},
- "node_modules/sshpk": {
- "version": "1.18.0",
- "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz",
- "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "asn1": "~0.2.3",
- "assert-plus": "^1.0.0",
- "bcrypt-pbkdf": "^1.0.0",
- "dashdash": "^1.12.0",
- "ecc-jsbn": "~0.1.1",
- "getpass": "^0.1.1",
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.0.2",
- "tweetnacl": "~0.14.0"
- },
- "bin": {
- "sshpk-conv": "bin/sshpk-conv",
- "sshpk-sign": "bin/sshpk-sign",
- "sshpk-verify": "bin/sshpk-verify"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/sshpk/node_modules/jsbn": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
- "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/ssri": {
"version": "12.0.0",
"resolved": "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz",
@@ -15334,16 +14173,6 @@
"node": ">=8"
}
},
- "node_modules/strip-final-newline": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
- "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/strip-json-comments": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
@@ -15563,23 +14392,6 @@
"tslib": "^2"
}
},
- "node_modules/throttleit": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.1.tgz",
- "integrity": "sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/through": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
- "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/thunky": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
@@ -15604,36 +14416,6 @@
"url": "https://github.com/sponsors/SuperchupuDev"
}
},
- "node_modules/tldts": {
- "version": "6.1.86",
- "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz",
- "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "tldts-core": "^6.1.86"
- },
- "bin": {
- "tldts": "bin/cli.js"
- }
- },
- "node_modules/tldts-core": {
- "version": "6.1.86",
- "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz",
- "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/tmp": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz",
- "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=14.14"
- }
- },
"node_modules/to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -15655,19 +14437,6 @@
"node": ">=0.6"
}
},
- "node_modules/tough-cookie": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz",
- "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==",
- "dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "tldts": "^6.1.32"
- },
- "engines": {
- "node": ">=16"
- }
- },
"node_modules/tree-dump": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.3.tgz",
@@ -15891,26 +14660,6 @@
"node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/tunnel-agent": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
- "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "safe-buffer": "^5.0.1"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/tweetnacl": {
- "version": "0.14.5",
- "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
- "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==",
- "dev": true,
- "license": "Unlicense"
- },
"node_modules/type-check": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
@@ -16057,16 +14806,6 @@
"node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 10.0.0"
- }
- },
"node_modules/unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
@@ -16076,16 +14815,6 @@
"node": ">= 0.8"
}
},
- "node_modules/untildify": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
- "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/update-browserslist-db": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
@@ -16182,28 +14911,6 @@
"node": ">= 0.8"
}
},
- "node_modules/verror": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
- "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
- "dev": true,
- "engines": [
- "node >=0.6.0"
- ],
- "license": "MIT",
- "dependencies": {
- "assert-plus": "^1.0.0",
- "core-util-is": "1.0.2",
- "extsprintf": "^1.2.0"
- }
- },
- "node_modules/verror/node_modules/core-util-is": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/vite": {
"version": "6.3.5",
"resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz",
@@ -16924,17 +15631,6 @@
"node": ">=12"
}
},
- "node_modules/yauzl": {
- "version": "2.10.0",
- "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
- "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "buffer-crc32": "~0.2.3",
- "fd-slicer": "~1.1.0"
- }
- },
"node_modules/yn": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
diff --git a/packages/angular/test/apps/ng20/package.json b/packages/angular/test/apps/ng20/package.json
index 0506688def0..a56c470642d 100644
--- a/packages/angular/test/apps/ng20/package.json
+++ b/packages/angular/test/apps/ng20/package.json
@@ -13,10 +13,7 @@
"build:ssr": "ng build --prod && ng run test-app:server:production",
"dev:ssr": "ng run test-app:serve-ssr",
"prerender": "ng run test-app:prerender",
- "cy.open": "cypress open",
- "cy.run": "cypress run",
- "test": "concurrently \"npm run start -- --configuration production\" \"wait-on http-get://localhost:4200 && npm run cy.run\" --kill-others --success first",
- "test.watch": "concurrently \"npm run start\" \"wait-on http-get://localhost:4200 && npm run cy.open\" --kill-others --success first"
+ "test": "npx playwright test"
},
"dependencies": {
"@angular/animations": "^20.0.0",
@@ -50,13 +47,13 @@
"@angular/cli": "^20.0.0",
"@angular/compiler-cli": "^20.0.0",
"@angular/language-service": "^20.0.0",
+ "@playwright/test": "^1.54.2",
"@types/express": "^4.17.21",
"@types/node": "^22.9.3",
"@types/ws": "8.5.3",
"@typescript-eslint/eslint-plugin": "^6.0.0",
"@typescript-eslint/parser": "^6.0.0",
"concurrently": "^6.0.0",
- "cypress": "^13.16.0",
"eslint": "^8.57.0",
"ts-loader": "^6.2.2",
"ts-node": "^8.3.0",
diff --git a/packages/angular/test/base/.browserslistrc b/packages/angular/test/base/.browserslistrc
index b15c7fae51a..07e5683f648 100644
--- a/packages/angular/test/base/.browserslistrc
+++ b/packages/angular/test/base/.browserslistrc
@@ -5,8 +5,11 @@
# You can see what browsers were selected by your queries by running:
# npx browserslist
-> 0.5%
-last 2 versions
-Firefox ESR
+# Compatible with Angular 16-20 - Main browsers only
+chrome >= 120
+firefox >= 115
+safari >= 17
+edge >= 120
+ios_saf >= 17
not dead
not IE 9-11 # For IE 9-11 support, remove 'not'.
diff --git a/packages/angular/test/base/angular.json b/packages/angular/test/base/angular.json
index 6fc18fbac80..8de8ef8adea 100644
--- a/packages/angular/test/base/angular.json
+++ b/packages/angular/test/base/angular.json
@@ -71,6 +71,23 @@
"extractLicenses": false,
"sourceMap": true,
"namedChunks": true
+ },
+ "test": {
+ "fileReplacements": [
+ {
+ "replace": "src/environments/environment.ts",
+ "with": "src/environments/environment.prod.ts"
+ }
+ ],
+ "optimization": true,
+ "outputHashing": "none",
+ "sourceMap": false,
+ "namedChunks": false,
+ "aot": true,
+ "progress": false,
+ "extractLicenses": false,
+ "vendorChunk": false,
+ "buildOptimizer": true
}
},
"defaultConfiguration": "production"
@@ -86,6 +103,9 @@
},
"development": {
"buildTarget": "test-app:build:development"
+ },
+ "test": {
+ "buildTarget": "test-app:build:test"
}
},
"defaultConfiguration": "development"
@@ -128,6 +148,12 @@
"options": {
"browserTarget": "test-app:build",
"serverTarget": "test-app:server"
+ }
+ },
+ "prerender": {
+ "builder": "@angular-devkit/build-angular:prerender",
+ "options": {
+ "routesFile": "src/app/app.routes.ts"
},
"configurations": {
"production": {
@@ -135,14 +161,6 @@
"serverTarget": "test-app:server:production"
}
}
- },
- "prerender": {
- "builder": "@angular-devkit/build-angular:prerender",
- "options": {
- "browserTarget": "test-app:build:production",
- "serverTarget": "test-app:server:production",
- "routes": []
- }
}
}
}
diff --git a/packages/angular/test/base/cypress.config.ts b/packages/angular/test/base/cypress.config.ts
deleted file mode 100644
index 18225539823..00000000000
--- a/packages/angular/test/base/cypress.config.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import { defineConfig } from 'cypress'
-
-export default defineConfig({
- video: false,
- screenshotOnRunFailure: false,
- e2e: {
- // We've imported your old cypress plugins here.
- // You may want to clean this up later by importing these.
- setupNodeEvents(on, config) {
- return require('./cypress/plugins/index.js')(on, config)
- },
- specPattern: './e2e/**/*.spec.ts',
- baseUrl: 'http://localhost:4200/',
- excludeSpecPattern: '**/examples/*',
- },
-})
diff --git a/packages/angular/test/base/cypress/plugins/index.js b/packages/angular/test/base/cypress/plugins/index.js
deleted file mode 100644
index 59b2bab6e4e..00000000000
--- a/packages/angular/test/base/cypress/plugins/index.js
+++ /dev/null
@@ -1,22 +0,0 @@
-///
-// ***********************************************************
-// This example plugins/index.js can be used to load plugins
-//
-// You can change the location of this file or turn off loading
-// the plugins file with the 'pluginsFile' configuration option.
-//
-// You can read more here:
-// https://on.cypress.io/plugins-guide
-// ***********************************************************
-
-// This function is called when a project is opened or re-opened (e.g. due to
-// the project's config changing)
-
-/**
- * @type {Cypress.PluginConfig}
- */
-// eslint-disable-next-line no-unused-vars
-module.exports = (on, config) => {
- // `on` is used to hook into various events Cypress emits
- // `config` is the resolved Cypress config
-}
diff --git a/packages/angular/test/base/cypress/support/commands.js b/packages/angular/test/base/cypress/support/commands.js
deleted file mode 100644
index 65436721fcc..00000000000
--- a/packages/angular/test/base/cypress/support/commands.js
+++ /dev/null
@@ -1,89 +0,0 @@
-// ***********************************************
-// This example commands.js shows you how to
-// create various custom commands and overwrite
-// existing commands.
-//
-// For more comprehensive examples of custom
-// commands please read more here:
-// https://on.cypress.io/custom-commands
-// ***********************************************
-//
-//
-// -- This is a parent command --
-// Cypress.Commands.add('login', (email, password) => { ... })
-//
-//
-// -- This is a child command --
-// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
-//
-//
-// -- This is a dual command --
-// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
-//
-//
-// -- This will overwrite an existing command --
-// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
-
-Cypress.Commands.add('ionSwipeToGoBack', (complete = false, selector = 'ion-router-outlet') => {
- const increment = complete ? 60 : 25;
- cy.get(selector)
- .first()
- .trigger('mousedown', 0, 275, { which: 1, force: true })
- .trigger('mousemove', increment * 1, 275, { which: 1, force: true })
- .wait(50)
- .trigger('mousemove', increment * 2, 275, { which: 1, force: true })
- .wait(50)
- .trigger('mousemove', increment * 3, 275, { which: 1, force: true })
- .wait(50)
- .trigger('mousemove', increment * 4, 275, { which: 1, force: true })
- .wait(50)
- .trigger('mouseup', increment * 4, 275, { which: 1, force: true });
- cy.wait(150);
-});
-
-/**
- * getStack is a query because it has automatic
- * retries built in which will let us account for
- * async routing without having to use
- * arbitrary cy.wait calls.
- */
-Cypress.Commands.addQuery('getStack', (selector) => {
- return () => {
- const el = cy.$$(selector);
- return Array.from(el.children()).map((el) => el.tagName.toLowerCase());
- }
-});
-
-Cypress.Commands.add('testStack', (selector, expected) => {
- cy.getStack(selector).should('deep.equal', expected);
-});
-
-Cypress.Commands.add('testLifeCycle', (selector, expected) => {
- cy.get(`${selector} #ngOnInit`).invoke('text').should('equal', '1');
- cy.get(`${selector} #ionViewWillEnter`).invoke('text').should('equal', expected.ionViewWillEnter.toString());
- 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);
-});
-
-Cypress.Commands.add('ionPageHidden', (selector) => {
- 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');
-});
-
-Cypress.Commands.add('ionTabClick', (tabText) => {
- // TODO FW-2790: 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/packages/angular/test/base/cypress/support/e2e.js b/packages/angular/test/base/cypress/support/e2e.js
deleted file mode 100644
index d68db96df26..00000000000
--- a/packages/angular/test/base/cypress/support/e2e.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// ***********************************************************
-// This example support/index.js is processed and
-// loaded automatically before your test files.
-//
-// This is a great place to put global configuration and
-// behavior that modifies Cypress.
-//
-// You can change the location of this file or turn off
-// automatically serving support files with the
-// 'supportFile' configuration option.
-//
-// You can read more here:
-// https://on.cypress.io/configuration
-// ***********************************************************
-
-// Import commands.js using ES2015 syntax:
-import './commands'
-
-// Alternatively you can use CommonJS syntax:
-// require('./commands')
diff --git a/packages/angular/test/base/cypress/support/index.d.ts b/packages/angular/test/base/cypress/support/index.d.ts
deleted file mode 100644
index acf1649fc41..00000000000
--- a/packages/angular/test/base/cypress/support/index.d.ts
+++ /dev/null
@@ -1,74 +0,0 @@
-///
-
-declare namespace Cypress {
- interface Chainable {
- /**
- * Swipe to go back on the current selector or router outlet
- * @example
- * ```
- * cy.ionSwipeToGoBack();
- * cy.ionSwipeToGoBack(true);
- * ```
- */
- ionSwipeToGoBack(complete: boolean, selector: string): Chainable
- /**
- * Test that the proper pages are in the navigation stack
- * @example
- * ```
- * cy.testStack('ion-router-outlet', ['app-navigation-page2', 'app-navigation-page1']);
- * cy.testStack('ion-tabs ion-router-outlet', ['app-tabs-tab1', 'app-tabs-tab1-nested', 'app-tabs-tab2']);
- * ```
- */
- testStack(selector: string, expected: string[]): Chainable
- /**
- * Test whether or not the lifecycle events fired
- * @example
- * ```
- * cy.testLifeCycle('app-router-link-page', {
- * ionViewWillEnter: 1,
- * ionViewDidEnter: 1,
- * ionViewWillLeave: 0,
- * ionViewDidLeave: 0,
- * });
- * ```
- */
- testLifeCycle(selector: string, expected: any): Chainable
-
- /**
- * Test whether or not an .ion-page element is visible.
- * Use this to test a page after navigating to it.
- * @example
- * ```
- * cy.ionPageVisible('app-my-page');
- * ```
- */
- ionPageVisible(selector: string): Chainable
-
- /**
- * Test whether or not an .ion-page element is hidden
- * Use this to test a page after navigating away from it.
- * @example
- * ```
- * cy.ionPageHidden('app-my-page');
- * ```
- */
- ionPageHidden(selector: string): Chainable
-
- /**
- * Test whether or not an .ion-page element exists.
- * Use this to test a page after popping it off the stack.
- * @example
- * ```
- * cy.ionPageDoesNotExist('app-my-page');
- * ```
- */
- ionPageDoesNotExist(selector: string): Chainable
-
- /**
- * Clicks on a tab button with the given text.
- */
- ionTabClick(tabText: string): Chainable;
- }
-}
-
-
diff --git a/packages/angular/test/base/e2e/src/.gitkeep b/packages/angular/test/base/e2e/src/.gitkeep
deleted file mode 100644
index e69de29bb2d..00000000000
diff --git a/packages/angular/test/base/e2e/src/lazy/accordion.spec.ts b/packages/angular/test/base/e2e/src/lazy/accordion.spec.ts
index 7d57fe19d55..1355b0c8739 100644
--- a/packages/angular/test/base/e2e/src/lazy/accordion.spec.ts
+++ b/packages/angular/test/base/e2e/src/lazy/accordion.spec.ts
@@ -1,19 +1,21 @@
-describe('Accordion', () => {
- beforeEach(() => {
- cy.visit('/lazy/accordions');
+import { test, expect } from '@playwright/test';
+
+test.describe('Accordion', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/lazy/accordions');
});
- it('should correctly expand on multiple modal opens', () => {
- cy.get('#open-modal').click();
+ test('should correctly expand on multiple modal opens', async ({ page }) => {
+ await page.locator('#open-modal').click();
- cy.get('ion-accordion:first-of-type').should('have.class', 'accordion-expanded');
- cy.get('ion-accordion:last-of-type').should('not.have.class', 'accordion-expanded');
+ await expect(page.locator('ion-accordion:first-of-type')).toHaveClass(/accordion-expanded/);
+ await expect(page.locator('ion-accordion:last-of-type')).not.toHaveClass(/accordion-expanded/);
- cy.get('#dismiss').click();
+ await page.locator('#dismiss').click();
- cy.get('#open-modal').click();
+ await page.locator('#open-modal').click();
- cy.get('ion-accordion:first-of-type').should('have.class', 'accordion-expanded');
- cy.get('ion-accordion:last-of-type').should('not.have.class', 'accordion-expanded');
+ await expect(page.locator('ion-accordion:first-of-type')).toHaveClass(/accordion-expanded/);
+ await expect(page.locator('ion-accordion:last-of-type')).not.toHaveClass(/accordion-expanded/);
});
});
diff --git a/packages/angular/test/base/e2e/src/lazy/angular-version.spec.ts b/packages/angular/test/base/e2e/src/lazy/angular-version.spec.ts
new file mode 100644
index 00000000000..332bb985951
--- /dev/null
+++ b/packages/angular/test/base/e2e/src/lazy/angular-version.spec.ts
@@ -0,0 +1,11 @@
+import { test, expect } from '@playwright/test';
+import { VERSION } from '@angular/core';
+
+test('should be on the correct Angular version', async ({ page }) => {
+ await page.goto('/lazy');
+
+ // Get the major version from Angular core
+ const angularMajorVersion = VERSION.major;
+
+ await expect(page.locator('ion-title')).toContainText(`Angular ${angularMajorVersion}`);
+});
diff --git a/packages/angular/test/base/e2e/src/lazy/bind-component-inputs.spec.ts b/packages/angular/test/base/e2e/src/lazy/bind-component-inputs.spec.ts
index 651747730b3..31107a09695 100644
--- a/packages/angular/test/base/e2e/src/lazy/bind-component-inputs.spec.ts
+++ b/packages/angular/test/base/e2e/src/lazy/bind-component-inputs.spec.ts
@@ -1,8 +1,14 @@
-it("binding route data to inputs should work", () => {
- cy.visit('/lazy/version-test/bind-route/test?query=test');
+import { test, expect } from '@playwright/test';
- cy.get('#route-params').contains('test');
- cy.get('#query-params').contains('test');
- cy.get('#data').contains('data:bindToComponentInputs');
- cy.get('#resolve').contains('resolve:bindToComponentInputs');
+test.describe('Bind Component Inputs', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/lazy/version-test/bind-route/test?query=test');
+ });
+
+ test('binding route data to inputs should work', async ({ page }) => {
+ await expect(page.locator('#route-params')).toContainText('test');
+ await expect(page.locator('#query-params')).toContainText('test');
+ await expect(page.locator('#data')).toContainText('data:bindToComponentInputs');
+ await expect(page.locator('#resolve')).toContainText('resolve:bindToComponentInputs');
+ });
});
diff --git a/packages/angular/test/base/e2e/src/lazy/form-controls/range.spec.ts b/packages/angular/test/base/e2e/src/lazy/form-controls/range.spec.ts
deleted file mode 100644
index b06c918dccb..00000000000
--- a/packages/angular/test/base/e2e/src/lazy/form-controls/range.spec.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-describe('Form Controls: Range', () => {
-
- beforeEach(() => {
- cy.visit('/lazy/form-controls/range');
- });
-
- it('should have form control initial value', () => {
- // Cypress does not support checking numeric values of custom elements
- // see: https://github.com/cypress-io/cypress/blob/bf6560691436a5a953f7e03e0ea3de38f3d2a632/packages/driver/src/dom/elements/elementHelpers.ts#L7
- cy.get('ion-range').invoke('prop', 'value').should('eq', 5);
- });
-
- it('should reflect Ionic form control status classes', () => {
- // Control is initially invalid
- cy.get('ion-range').should('have.class', 'ion-invalid');
- cy.get('ion-range').should('have.class', 'ion-pristine');
- cy.get('ion-range').should('have.class', 'ion-untouched');
-
- // Cypress does not support typing unless the element is focusable.
- cy.get('ion-range').shadow()
- .find('.range-knob-handle')
- .click()
- .focus()
- .type('{rightarrow}'.repeat(5));
-
- cy.get('ion-range').should('have.class', 'ion-valid');
- cy.get('ion-range').should('have.class', 'ion-dirty');
- // TODO(FW-6226): Investigate why this regresses in Angular 18
- // cy.get('ion-range').should('have.class', 'ion-touched');
- cy.get('ion-range').invoke('prop', 'value').should('eq', 10);
- });
-
-});
diff --git a/packages/angular/test/base/e2e/src/lazy/form.spec.ts b/packages/angular/test/base/e2e/src/lazy/form.spec.ts
index 1897adc7522..a5cacabe5e2 100644
--- a/packages/angular/test/base/e2e/src/lazy/form.spec.ts
+++ b/packages/angular/test/base/e2e/src/lazy/form.spec.ts
@@ -1,32 +1,33 @@
-describe('Form', () => {
- beforeEach(() => {
- cy.visit('/lazy/form');
- })
-
- describe('status updates', () => {
- it('should update Ionic form classes when calling form methods programmatically', async () => {
- cy.get('#input-touched').click();
- cy.get('#touched-input-test').should('have.class', 'ion-touched');
- cy.get('#input-otp-touched').click();
- cy.get('#touched-input-otp-number-test').should('have.class', 'ion-touched');
- });
+import { test, expect } from '@playwright/test';
- describe('markAllAsTouched', () => {
- it('should apply .ion-touched to nearest ion-item', () => {
- cy.get('#mark-all-touched-button').click();
- cy.get('form ion-item').each(item => {
- cy.wrap(item).should('have.class', 'ion-touched');
- });
- });
+test.describe('Form', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/lazy/form');
+ });
+
+ test.describe('status updates', () => {
+ test('should update Ionic form classes when calling form methods programmatically', async ({ page }) => {
+ await page.locator('#input-touched').click();
+ await expect(page.locator('#touched-input-test')).toHaveClass(/ion-touched/);
+ await page.locator('#input-otp-touched').click();
+ await expect(page.locator('#touched-input-otp-number-test')).toHaveClass(/ion-touched/);
});
+ test('markAllAsTouched should apply .ion-touched to nearest ion-item', async ({ page }) => {
+ await page.locator('#mark-all-touched-button').click();
+ const items = page.locator('form ion-item');
+ const count = await items.count();
+ for (let i = 0; i < count; i++) {
+ await expect(items.nth(i)).toHaveClass(/ion-touched/);
+ }
+ });
});
- describe('change', () => {
- it('should have default values', () => {
- testStatus('INVALID');
- cy.get('#submit').should('have.text', 'false');
- testData({
+ test.describe('change', () => {
+ test('should have default values', async ({ page }) => {
+ await testStatus(page, 'INVALID');
+ await expect(page.locator('#submit')).toHaveText('false');
+ await testData(page, {
datetime: '2010-08-20',
select: null,
toggle: false,
@@ -42,31 +43,38 @@ describe('Form', () => {
});
});
- it('should become valid', () => {
- cy.get('ion-input.required').type('Some value');
- cy.get('ion-input.required input').blur();
+ test('should become valid', async ({ page }) => {
+ await page.locator('ion-input.required input').fill('Some value');
+ await page.locator('ion-input.required input').blur();
// Test number OTP input
- cy.get('#touched-input-otp-number-test input').first().type('5678');
- cy.get('#touched-input-otp-number-test input').last().focus().blur();
-
+ await page.locator('#touched-input-otp-number-test input').nth(0).fill('5');
+ await page.locator('#touched-input-otp-number-test input').nth(1).fill('6');
+ await page.locator('#touched-input-otp-number-test input').nth(2).fill('7');
+ await page.locator('#touched-input-otp-number-test input').nth(3).fill('8');
+ await page.locator('#touched-input-otp-number-test input').last().focus();
+ await page.locator('#touched-input-otp-number-test input').last().blur();
// Test text OTP input
- cy.get('#touched-input-otp-text-test input').first().type('ABCD');
- cy.get('#touched-input-otp-text-test input').last().focus().blur();
+ await page.locator('#touched-input-otp-text-test input').nth(0).fill('A');
+ await page.locator('#touched-input-otp-text-test input').nth(1).fill('B');
+ await page.locator('#touched-input-otp-text-test input').nth(2).fill('C');
+ await page.locator('#touched-input-otp-text-test input').nth(3).fill('D');
+ await page.locator('#touched-input-otp-text-test input').last().focus();
+ await page.locator('#touched-input-otp-text-test input').last().blur();
- testStatus('INVALID');
+ await testStatus(page, 'INVALID');
- cy.get('ion-select').click();
- cy.get('ion-alert').should('exist').should('be.visible');
+ await page.locator('ion-select').click();
+ await expect(page.locator('ion-alert')).toBeVisible();
// NES option
- cy.get('ion-alert .alert-radio-button:nth-of-type(2)').click();
+ await page.locator('ion-alert .alert-radio-button').nth(1).click();
// Click confirm button
- cy.get('ion-alert .alert-button:not(.alert-button-role-cancel)').click();
+ await page.locator('ion-alert .alert-button:not(.alert-button-role-cancel)').click();
- testStatus('VALID');
+ await testStatus(page, 'VALID');
- testData({
+ await testData(page, {
datetime: '2010-08-20',
select: 'nes',
toggle: false,
@@ -82,9 +90,9 @@ describe('Form', () => {
});
});
- it('ion-toggle should change', () => {
- cy.get('form ion-toggle').click();
- testData({
+ test('ion-toggle should change', async ({ page }) => {
+ await page.locator('form ion-toggle').click();
+ await testData(page, {
datetime: '2010-08-20',
select: null,
toggle: true,
@@ -100,9 +108,9 @@ describe('Form', () => {
});
});
- it('ion-checkbox should change', () => {
- cy.get('ion-checkbox').click();
- testData({
+ test('ion-checkbox should change', async ({ page }) => {
+ await page.locator('ion-checkbox').click();
+ await testData(page, {
datetime: '2010-08-20',
select: null,
toggle: false,
@@ -118,9 +126,9 @@ describe('Form', () => {
});
});
- it('ion-radio should change', () => {
- cy.get('ion-radio').click();
- testData({
+ test('ion-radio should change', async ({ page }) => {
+ await page.locator('ion-radio').click();
+ await testData(page, {
datetime: '2010-08-20',
select: null,
toggle: false,
@@ -136,16 +144,24 @@ describe('Form', () => {
});
});
- it('ion-input-otp should change', () => {
+ test('ion-input-otp should change', async ({ page }) => {
// Test number OTP input
- cy.get('#touched-input-otp-number-test input').first().type('5678');
- cy.get('#touched-input-otp-number-test input').last().focus().blur();
+ await page.locator('#touched-input-otp-number-test input').nth(0).fill('5');
+ await page.locator('#touched-input-otp-number-test input').nth(1).fill('6');
+ await page.locator('#touched-input-otp-number-test input').nth(2).fill('7');
+ await page.locator('#touched-input-otp-number-test input').nth(3).fill('8');
+ await page.locator('#touched-input-otp-number-test input').last().focus();
+ await page.locator('#touched-input-otp-number-test input').last().blur();
// Test text OTP input
- cy.get('#touched-input-otp-text-test input').first().type('ABCD');
- cy.get('#touched-input-otp-text-test input').last().focus().blur();
-
- testData({
+ await page.locator('#touched-input-otp-text-test input').nth(0).fill('A');
+ await page.locator('#touched-input-otp-text-test input').nth(1).fill('B');
+ await page.locator('#touched-input-otp-text-test input').nth(2).fill('C');
+ await page.locator('#touched-input-otp-text-test input').nth(3).fill('D');
+ await page.locator('#touched-input-otp-text-test input').last().focus();
+ await page.locator('#touched-input-otp-text-test input').last().blur();
+
+ await testData(page, {
datetime: '2010-08-20',
select: null,
toggle: false,
@@ -161,49 +177,58 @@ describe('Form', () => {
});
});
- it('should submit', () => {
- cy.get('#set-values').click();
- cy.get('#submit-button').click();
- cy.get('#submit').should('have.text', 'true');
+ test('should submit', async ({ page }) => {
+ await page.locator('#set-values').click();
+ await page.locator('#submit-button').click();
+ await expect(page.locator('#submit')).toHaveText('true');
});
- it('ion-input-otp should validate both number and text types', () => {
+ test('ion-input-otp should validate both number and text types', async ({ page }) => {
// Test number OTP validation
- cy.get('#touched-input-otp-number-test').should('have.class', 'ng-invalid');
- cy.get('#touched-input-otp-number-test input').first().type('5678');
- cy.get('#touched-input-otp-number-test input').last().focus().blur();
- cy.get('#touched-input-otp-number-test').should('have.class', 'ng-valid');
+ await expect(page.locator('#touched-input-otp-number-test')).toHaveClass(/ng-invalid/);
+ await page.locator('#touched-input-otp-number-test input').nth(0).fill('5');
+ await page.locator('#touched-input-otp-number-test input').nth(1).fill('6');
+ await page.locator('#touched-input-otp-number-test input').nth(2).fill('7');
+ await page.locator('#touched-input-otp-number-test input').nth(3).fill('8');
+ await page.locator('#touched-input-otp-number-test input').last().focus();
+ await page.locator('#touched-input-otp-number-test input').last().blur();
+ await expect(page.locator('#touched-input-otp-number-test')).toHaveClass(/ng-valid/);
// Test text OTP validation
- cy.get('#touched-input-otp-text-test').should('have.class', 'ng-invalid');
- cy.get('#touched-input-otp-text-test input').first().type('ABCD');
- cy.get('#touched-input-otp-text-test input').last().focus().blur();
- cy.get('#touched-input-otp-text-test').should('have.class', 'ng-valid');
+ await expect(page.locator('#touched-input-otp-text-test')).toHaveClass(/ng-invalid/);
+ await page.locator('#touched-input-otp-text-test input').nth(0).fill('A');
+ await page.locator('#touched-input-otp-text-test input').nth(1).fill('B');
+ await page.locator('#touched-input-otp-text-test input').nth(2).fill('C');
+ await page.locator('#touched-input-otp-text-test input').nth(3).fill('D');
+ await page.locator('#touched-input-otp-text-test input').last().focus();
+ await page.locator('#touched-input-otp-text-test input').last().blur();
+ await expect(page.locator('#touched-input-otp-text-test')).toHaveClass(/ng-valid/);
});
- // Add test for partial OTP input validation
- it('ion-input-otp should remain invalid when partially filled', () => {
+ test('ion-input-otp should remain invalid when partially filled', async ({ page }) => {
// Test number OTP with only first digit
- cy.get('#touched-input-otp-number-test').should('have.class', 'ng-invalid');
- cy.get('#touched-input-otp-number-test input').first().type('5');
- cy.get('#touched-input-otp-number-test input').eq(1).focus().blur();
- cy.get('#touched-input-otp-number-test').should('have.class', 'ng-invalid');
+ await expect(page.locator('#touched-input-otp-number-test')).toHaveClass(/ng-invalid/);
+ await page.locator('#touched-input-otp-number-test input').nth(0).fill('5');
+ await page.locator('#touched-input-otp-number-test input').nth(1).focus();
+ await page.locator('#touched-input-otp-number-test input').nth(1).blur();
+ await expect(page.locator('#touched-input-otp-number-test')).toHaveClass(/ng-invalid/);
// Test text OTP with only first character
- cy.get('#touched-input-otp-text-test').should('have.class', 'ng-invalid');
- cy.get('#touched-input-otp-text-test input').first().type('A');
- cy.get('#touched-input-otp-text-test input').eq(1).focus().blur();
- cy.get('#touched-input-otp-text-test').should('have.class', 'ng-invalid');
+ await expect(page.locator('#touched-input-otp-text-test')).toHaveClass(/ng-invalid/);
+ await page.locator('#touched-input-otp-text-test input').nth(0).fill('A');
+ await page.locator('#touched-input-otp-text-test input').nth(1).focus();
+ await page.locator('#touched-input-otp-text-test input').nth(1).blur();
+ await expect(page.locator('#touched-input-otp-text-test')).toHaveClass(/ng-invalid/);
// Verify form status is still invalid
- testStatus('INVALID');
+ await testStatus(page, 'INVALID');
});
});
- describe('blur', () => {
- it('ion-toggle should change only after blur', () => {
- cy.get('form ion-toggle').click();
- testData({
+ test.describe('blur', () => {
+ test('ion-toggle should change only after blur', async ({ page }) => {
+ await page.locator('form ion-toggle').click();
+ await testData(page, {
datetime: '2010-08-20',
select: null,
toggle: true,
@@ -217,8 +242,8 @@ describe('Form', () => {
checkbox: false,
radio: null
});
- cy.get('ion-checkbox').click();
- testData({
+ await page.locator('ion-checkbox').click();
+ await testData(page, {
datetime: '2010-08-20',
select: null,
toggle: true,
@@ -235,42 +260,38 @@ describe('Form', () => {
});
});
- describe('validators', () => {
+ test.describe('validators', () => {
+ test('ion-input should error with min set', async ({ page }) => {
+ const control = page.locator('form ion-input[formControlName="inputMin"]');
- it('ion-input should error with min set', () => {
- const control = cy.get('form ion-input[formControlName="inputMin"]');
+ await expect(control).toHaveClass(/ng-valid/);
- control.should('have.class', 'ng-valid');
+ await control.locator('input').fill('0');
+ await control.locator('input').blur();
- control.type('{backspace}0');
-
- control.within(() => cy.get('input').blur());
-
- control.should('have.class', 'ng-invalid');
+ await expect(control).toHaveClass(/ng-invalid/);
});
- it('ion-input should error with max set', () => {
- const control = cy.get('form ion-input[formControlName="inputMax"]');
+ test('ion-input should error with max set', async ({ page }) => {
+ const control = page.locator('form ion-input[formControlName="inputMax"]');
- control.should('have.class', 'ng-valid');
+ await expect(control).toHaveClass(/ng-valid/);
- control.type('2');
- control.within(() => cy.get('input').blur());
+ await control.locator('input').fill('2');
+ await control.locator('input').blur();
- control.should('have.class', 'ng-invalid');
+ await expect(control).toHaveClass(/ng-invalid/);
});
-
});
-});
-function testStatus(status) {
- cy.get('#status').should('have.text', status);
-}
-
-function testData(data) {
- cy.get('#data').invoke('text').then(text => {
- const value = JSON.parse(text);
- console.log(value, data);
- expect(value).to.deep.equal(data);
- })
-}
+ // Helper functions
+ async function testStatus(page: any, status: string) {
+ await expect(page.locator('#status')).toHaveText(status);
+ }
+
+ async function testData(page: any, data: any) {
+ const text = await page.locator('#data').textContent();
+ const value = JSON.parse(text!);
+ expect(value).toEqual(data);
+ }
+});
diff --git a/packages/angular/test/base/e2e/src/lazy/inline-overlays.spec.ts b/packages/angular/test/base/e2e/src/lazy/inline-overlays.spec.ts
index 234cbb892a0..51b400c304c 100644
--- a/packages/angular/test/base/e2e/src/lazy/inline-overlays.spec.ts
+++ b/packages/angular/test/base/e2e/src/lazy/inline-overlays.spec.ts
@@ -1,53 +1,70 @@
-describe('Overlays: Inline', () => {
- beforeEach(() => {
- cy.visit('/lazy/overlays-inline');
+import { test, expect } from '@playwright/test';
+
+test.describe('Overlays: Inline', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/lazy/overlays-inline');
});
- describe('Alert', () => {
- it('should be visible when presenting', () => {
- cy.get('ion-alert').should('not.be.visible');
+ test.describe('Alert', () => {
+ test('should be visible when presenting', async ({ page }) => {
+ await expect(page.locator('ion-alert')).not.toBeVisible();
+
+ await page.locator('#open-alert').click();
+ await expect(page.locator('ion-alert')).toBeVisible();
- cy.get('#open-alert').click();
- cy.get('ion-alert').should('be.visible');
+ // Click the backdrop at a position that avoids the alert content
+ await page.locator('ion-alert ion-backdrop').click({ position: { x: 10, y: 10 } });
- cy.get('ion-alert ion-backdrop').click({ force: true });
- cy.get('ion-alert').should('not.be.visible');
+ // Wait for dismissal animation to complete
+ await page.waitForTimeout(500);
+
+ await expect(page.locator('ion-alert')).not.toBeVisible();
});
});
- describe('Action Sheet', () => {
- it('should be visible when presenting', () => {
- cy.get('ion-action-sheet').should('not.be.visible');
+ test.describe('Action Sheet', () => {
+ test('should be visible when presenting', async ({ page }) => {
+ await expect(page.locator('ion-action-sheet')).not.toBeVisible();
+
+ await page.locator('#open-action-sheet').click();
+ await expect(page.locator('ion-action-sheet')).toBeVisible();
- cy.get('#open-action-sheet').click();
- cy.get('ion-action-sheet').should('be.visible');
+ // Ensure backdrop dismissal works by clicking the backdrop
+ await page.locator('ion-action-sheet ion-backdrop').click({ position: { x: 10, y: 10 } });
- cy.get('ion-action-sheet ion-backdrop').click({ force: true });
- cy.get('ion-action-sheet').should('not.be.visible');
+ // Wait for dismissal animation
+ await page.waitForTimeout(500);
+
+ await expect(page.locator('ion-action-sheet')).not.toBeVisible();
});
});
- describe('Loading', () => {
- it('should be visible when presenting', () => {
- cy.get('ion-loading').should('not.be.visible');
+ test.describe('Loading', () => {
+ test('should be visible when presenting', async ({ page }) => {
+ await expect(page.locator('ion-loading')).not.toBeVisible();
+
+ await page.locator('#open-loading').click();
+ await expect(page.locator('ion-loading')).toBeVisible();
+
+ // Ensure backdrop dismissal works by clicking the backdrop
+ await page.locator('ion-loading ion-backdrop').click({ position: { x: 10, y: 10 } });
- cy.get('#open-loading').click();
- cy.get('ion-loading').should('be.visible');
+ // Wait for dismissal animation
+ await page.waitForTimeout(500);
- cy.get('ion-loading ion-backdrop').click({ force: true });
- cy.get('ion-loading').should('not.be.visible');
+ await expect(page.locator('ion-loading')).not.toBeVisible();
});
});
- describe('Toast', () => {
- it('should be visible when presenting', () => {
- cy.get('ion-toast').should('not.be.visible');
+ test.describe('Toast', () => {
+ test('should be visible when presenting', async ({ page }) => {
+ await expect(page.locator('ion-toast')).not.toBeVisible();
- cy.get('#open-toast').click();
- cy.get('ion-toast').shadow().find('.toast-wrapper').should('be.visible');
+ await page.locator('#open-toast').click();
+ await expect(page.locator('ion-toast .toast-wrapper')).toBeVisible();
- cy.get('ion-toast').shadow().find('.toast-button').click();
- cy.get('ion-toast').should('not.be.visible');
+ await page.locator('ion-toast .toast-button').click();
+ await expect(page.locator('ion-toast')).not.toBeVisible();
});
});
});
diff --git a/packages/angular/test/base/e2e/src/lazy/inputs.spec.ts b/packages/angular/test/base/e2e/src/lazy/inputs.spec.ts
index 8c1c2ca4bf7..fdf2b38adc4 100644
--- a/packages/angular/test/base/e2e/src/lazy/inputs.spec.ts
+++ b/packages/angular/test/base/e2e/src/lazy/inputs.spec.ts
@@ -1,91 +1,129 @@
-describe('Inputs', () => {
- beforeEach(() => {
- cy.visit('/lazy/inputs');
- })
-
- it('should have default values', () => {
- cy.get('ion-checkbox').should('have.prop', 'checked').and('equal', true);
- cy.get('ion-radio-group').should('have.prop', 'value').and('equal', 'nes');
- cy.get('ion-toggle').should('have.prop', 'checked').and('equal', true);
- cy.get('ion-input').should('have.prop', 'value').and('equal', 'some text');
- cy.get('ion-input-otp').should('have.prop', 'value').and('equal', '1234');
- cy.get('ion-datetime').should('have.prop', 'value').and('equal', '1994-03-15');
- cy.get('ion-select').should('have.prop', 'value').and('equal', 'nes');
- cy.get('ion-range').should('have.prop', 'value').and('equal', 50);
+import { test, expect } from '@playwright/test';
+
+test.describe('Inputs', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/lazy/inputs');
+ });
+
+ test('should have default values', async ({ page }) => {
+ // Check primary elements for default values
+ await expect(page.locator('ion-checkbox').first()).toHaveJSProperty('checked', true);
+ await expect(page.locator('ion-radio-group').first()).toHaveJSProperty('value', 'nes');
+ await expect(page.locator('ion-toggle').first()).toHaveJSProperty('checked', true);
+ await expect(page.locator('ion-input').first()).toHaveJSProperty('value', 'some text');
+ await expect(page.locator('ion-input-otp').first()).toHaveJSProperty('value', '1234');
+ await expect(page.locator('ion-datetime').first()).toHaveJSProperty('value', '1994-03-15');
+ await expect(page.locator('ion-select').first()).toHaveJSProperty('value', 'nes');
+ await expect(page.locator('ion-range').first()).toHaveJSProperty('value', 50);
});
- it('should reset values', () => {
- cy.get('#reset-button').click();
+ test('should reset values', async ({ page }) => {
+ await page.locator('#reset-button').click();
- cy.get('ion-checkbox').should('have.prop', 'checked').and('equal', false);
- cy.get('ion-radio-group').should('not.have.prop', 'value');
- cy.get('ion-toggle').should('have.prop', 'checked').and('equal', false);
+ // Check primary elements after reset
+ await expect(page.locator('ion-checkbox').first()).toHaveJSProperty('checked', false);
+ await expect(page.locator('ion-radio-group').first()).toHaveJSProperty('value', undefined);
+ await expect(page.locator('ion-toggle').first()).toHaveJSProperty('checked', false);
/**
* The `value` property gets set to undefined
* for these components, so we need to check
- * not.have.prop which will check that the
- * value property is undefined.
+ * that the value property is undefined.
*/
- cy.get('ion-input').should('not.have.prop', 'value');
- cy.get('ion-input-otp').should('not.have.prop', 'value');
- cy.get('ion-datetime').should('not.have.prop', 'value');
- cy.get('ion-select').should('not.have.prop', 'value');
- cy.get('ion-range').should('not.have.prop', 'value');
+ await expect(page.locator('ion-input').first()).toHaveJSProperty('value', undefined);
+ await expect(page.locator('ion-input-otp').first()).toHaveJSProperty('value', undefined);
+ await expect(page.locator('ion-datetime').first()).toHaveJSProperty('value', undefined);
+ await expect(page.locator('ion-select').first()).toHaveJSProperty('value', undefined);
+ await expect(page.locator('ion-range').first()).toHaveJSProperty('value', undefined);
});
- it('should set values', () => {
- cy.get('#reset-button').click();
- cy.get('#set-button').click();
-
- cy.get('ion-checkbox').should('have.prop', 'checked').and('equal', true);
- cy.get('ion-radio-group').should('have.prop', 'value').and('equal', 'nes');
- cy.get('ion-toggle').should('have.prop', 'checked').and('equal', true);
- cy.get('ion-input').should('have.prop', 'value').and('equal', 'some text');
- cy.get('ion-input-otp').should('have.prop', 'value').and('equal', '1234');
- cy.get('ion-datetime').should('have.prop', 'value').and('equal', '1994-03-15');
- cy.get('ion-select').should('have.prop', 'value').and('equal', 'nes');
- cy.get('ion-range').should('have.prop', 'value').and('equal', 50);
+ test('should set values', async ({ page }) => {
+ await page.locator('#reset-button').click();
+ await page.locator('#set-button').click();
+
+ // Check primary elements after setting values
+ await expect(page.locator('ion-checkbox').first()).toHaveJSProperty('checked', true);
+ await expect(page.locator('ion-radio-group').first()).toHaveJSProperty('value', 'nes');
+ await expect(page.locator('ion-toggle').first()).toHaveJSProperty('checked', true);
+ await expect(page.locator('ion-input').first()).toHaveJSProperty('value', 'some text');
+ await expect(page.locator('ion-input-otp').first()).toHaveJSProperty('value', '1234');
+ await expect(page.locator('ion-datetime').first()).toHaveJSProperty('value', '1994-03-15');
+ await expect(page.locator('ion-select').first()).toHaveJSProperty('value', 'nes');
+ await expect(page.locator('ion-range').first()).toHaveJSProperty('value', 50);
});
- it('should update angular when values change', () => {
- cy.get('#reset-button').click();
+ test('should update angular when values change', async ({ page }) => {
+ await page.locator('#reset-button').click();
- cy.get('ion-checkbox#first-checkbox').click();
- cy.get('ion-radio').first().click();
- cy.get('ion-toggle').first().click();
+ await page.locator('ion-checkbox#first-checkbox').click();
+ await page.locator('ion-radio').first().click();
+ await page.locator('ion-toggle').first().click();
- cy.get('ion-input').eq(0).type('hola');
- cy.focused().blur();
+ await page.locator('ion-input').nth(0).locator('input').fill('hola');
+ await page.locator('ion-input').nth(0).locator('input').blur();
- cy.get('ion-input-otp input').eq(0).type('1234');
- cy.focused().blur();
+ await page.locator('ion-input-otp input').nth(0).fill('1');
+ await page.locator('ion-input-otp input').nth(1).fill('2');
+ await page.locator('ion-input-otp input').nth(2).fill('3');
+ await page.locator('ion-input-otp input').nth(3).fill('4');
+ await page.locator('ion-input-otp input').nth(3).blur();
// Set date to 1994-03-14
- cy.get('ion-datetime').first().shadow().find('.calendar-day:not([disabled])').first().click();
+ await page.locator('ion-datetime').first().click();
+ await page.locator('ion-datetime').first().locator('.calendar-day:not([disabled])').first().click();
- cy.get('ion-select#game-console').click();
- cy.get('ion-alert').should('exist').should('be.visible');
+ await page.locator('ion-select#game-console').click();
+ await expect(page.locator('ion-alert')).toBeVisible();
// Playstation option
- cy.get('ion-alert .alert-radio-button:nth-of-type(4)').click();
+ await page.locator('ion-alert .alert-radio-button').nth(3).click();
// Click confirm button
- cy.get('ion-alert .alert-button:not(.alert-button-role-cancel)').click();
-
- cy.get('#checkbox-note').should('have.text', 'true');
- cy.get('#radio-note').should('have.text', 'nes');
- cy.get('#toggle-note').should('have.text', 'true');
- cy.get('#input-note').should('have.text', 'hola');
- cy.get('#input-otp-note').should('have.text', '1234');
- cy.get('#datetime-note').should('have.text', '1994-03-14');
- cy.get('#select-note').should('have.text', 'ps');
+ await page.locator('ion-alert .alert-button:not(.alert-button-role-cancel)').click();
+
+ // Check note text (Angular binding updates)
+ await expect(page.locator('#checkbox-note')).toHaveText('true');
+ await expect(page.locator('#radio-note')).toHaveText('nes');
+ await expect(page.locator('#toggle-note')).toHaveText('true');
+ await expect(page.locator('#input-note')).toHaveText('hola');
+ await expect(page.locator('#input-otp-note')).toHaveText('1234');
+ await expect(page.locator('#datetime-note')).toHaveText('1994-03-14');
+ await expect(page.locator('#select-note')).toHaveText('ps');
+ });
+
+ test('should update values when erasing input', async ({ page }) => {
+ // Focus the input and press backspace to remove last character
+ await page.locator('ion-input').nth(0).locator('input').click();
+ await page.locator('ion-input').nth(0).locator('input').press('Backspace');
+ // Check mirror element reflects the change
+ await expect(page.locator('ion-input').nth(1)).toHaveJSProperty('value', 'some tex');
+ // Check note text (Angular binding)
+ await expect(page.locator('#input-note')).toHaveText('some tex');
+
+ // Focus the last OTP input and press backspace
+ await page.locator('ion-input-otp input').last().click();
+ await page.locator('ion-input-otp input').last().press('Backspace');
+ // Check mirror element reflects the change
+ await expect(page.locator('ion-input-otp').nth(1)).toHaveJSProperty('value', '123');
+ // Check note text (Angular binding)
+ await expect(page.locator('#input-otp-note')).toHaveText('123');
});
- it('should update values when erasing input', () => {
- cy.get('ion-input').eq(0).type('{backspace}');
- cy.get('ion-input').should('have.prop', 'value').and('equal', 'some tex');
- cy.get('#input-note').should('have.text', 'some tex');
+ test.describe('updating text input refs', () => {
+ test('typing into input should update ref', async ({ page }) => {
+ await page.locator('ion-input').first().locator('input').fill('Hello Input');
+ // Check mirror element reflects the change
+ await expect(page.locator('ion-input').nth(1)).toHaveJSProperty('value', 'Hello Input');
+ // Check note text (Angular binding)
+ await expect(page.locator('#input-note')).toHaveText('Hello Input');
+ });
- cy.get('ion-input-otp input:last').eq(0).type('{backspace}');
- cy.get('ion-input-otp').should('have.prop', 'value').and('equal', '123');
- cy.get('#input-otp-note').should('have.text', '123');
+ test('typing into input-otp should update ref', async ({ page }) => {
+ await page.locator('ion-input-otp input').nth(0).fill('1');
+ await page.locator('ion-input-otp input').nth(1).fill('2');
+ await page.locator('ion-input-otp input').nth(2).fill('3');
+ await page.locator('ion-input-otp input').nth(3).fill('4');
+ // Check mirror element reflects the change
+ await expect(page.locator('ion-input-otp').nth(1)).toHaveJSProperty('value', '1234');
+ // Check note text (Angular binding)
+ await expect(page.locator('#input-otp-note')).toHaveText('1234');
+ });
});
});
diff --git a/packages/angular/test/base/e2e/src/lazy/keep-contents-mounted.spec.ts b/packages/angular/test/base/e2e/src/lazy/keep-contents-mounted.spec.ts
index 8d873d0ae27..ee65b1b513d 100644
--- a/packages/angular/test/base/e2e/src/lazy/keep-contents-mounted.spec.ts
+++ b/packages/angular/test/base/e2e/src/lazy/keep-contents-mounted.spec.ts
@@ -1,66 +1,77 @@
-describe('overlays - keepContentsMounted', () => {
- describe('modal', () => {
- it('should not mount component if false', () => {
- cy.visit('/lazy/modal-inline');
+import { test, expect } from '@playwright/test';
- cy.get('ion-modal ion-content').should('not.exist');
+test.describe('Keep Contents Mounted', () => {
+ test.describe('Modal', () => {
+ test('should not mount component if false', async ({ page }) => {
+ await page.goto('/lazy/modal-inline');
+
+ await expect(page.locator('ion-modal ion-content')).not.toBeVisible();
});
- it('should mount component if true', () => {
- cy.visit('/lazy/keep-contents-mounted');
+ test('should mount component if true', async ({ page }) => {
+ await page.goto('/lazy/keep-contents-mounted');
- cy.get('ion-modal ion-content').should('exist');
+ // Check that the content exists in the DOM (mounted) but is not visible
+ await expect(page.locator('ion-modal ion-content')).toBeAttached();
+ await expect(page.locator('ion-modal ion-content')).not.toBeVisible();
});
- it('should keep component mounted after dismissing if true', () => {
- cy.visit('/lazy/keep-contents-mounted');
+ test('should keep component mounted after dismissing if true', async ({ page }) => {
+ await page.goto('/lazy/keep-contents-mounted');
- cy.get('#open-modal').click();
+ await page.locator('#open-modal').click();
- cy.get('ion-modal ion-content').should('exist');
+ await expect(page.locator('ion-modal ion-content')).toBeVisible();
- cy.get('ion-modal ion-button').click();
+ await page.locator('ion-modal ion-button').click();
- cy.get('ion-modal')
- .should('not.be.visible')
- .should('have.class', 'overlay-hidden');
+ await expect(page.locator('ion-modal')).not.toBeVisible();
+ await expect(page.locator('ion-modal')).toHaveClass(/overlay-hidden/);
- cy.get('ion-modal ion-content').should('exist');
+ // Content should be mounted but not visible after dismissal
+ await expect(page.locator('ion-modal ion-content')).toBeAttached();
+ await expect(page.locator('ion-modal ion-content')).not.toBeVisible();
});
- it('should has ion-delegate-host on mount', () => {
- cy.visit('/lazy/keep-contents-mounted');
+ test('should have ion-delegate-host on mount', async ({ page }) => {
+ await page.goto('/lazy/keep-contents-mounted');
- cy.get('ion-modal .ion-delegate-host').should('exist');
+ // Check that the delegate host exists in the DOM (mounted) but is not visible
+ await expect(page.locator('ion-modal .ion-delegate-host')).toBeAttached();
+ await expect(page.locator('ion-modal .ion-delegate-host')).not.toBeVisible();
});
- })
- describe('popover', () => {
- it('should not mount component if false', () => {
- cy.visit('/lazy/popover-inline');
+ });
+
+ test.describe('Popover', () => {
+ test('should not mount component if false', async ({ page }) => {
+ await page.goto('/lazy/popover-inline');
- cy.get('ion-popover ion-content').should('not.exist');
+ await expect(page.locator('ion-popover ion-content')).not.toBeVisible();
});
- it('should mount component if true', () => {
- cy.visit('/lazy/keep-contents-mounted');
+ test('should mount component if true', async ({ page }) => {
+ await page.goto('/lazy/keep-contents-mounted');
- cy.get('ion-popover ion-content').should('exist');
+ // Check that the content exists in the DOM (mounted) but is not visible
+ await expect(page.locator('ion-popover ion-content')).toBeAttached();
+ await expect(page.locator('ion-popover ion-content')).not.toBeVisible();
});
- it('should keep component mounted after dismissing if true', () => {
- cy.visit('/lazy/keep-contents-mounted');
+ test('should keep component mounted after dismissing if true', async ({ page }) => {
+ await page.goto('/lazy/keep-contents-mounted');
- cy.get('#open-popover').click();
+ await page.locator('#open-popover').click();
- cy.get('ion-popover ion-content').should('exist');
+ await expect(page.locator('ion-popover ion-content')).toBeVisible();
- cy.get('ion-popover ion-button').click();
+ await page.locator('ion-popover ion-button').click();
- cy.get('ion-popover')
- .should('not.be.visible')
- .should('have.class', 'overlay-hidden');
+ await expect(page.locator('ion-popover')).not.toBeVisible();
+ await expect(page.locator('ion-popover')).toHaveClass(/overlay-hidden/);
- cy.get('ion-popover ion-content').should('exist');
+ // Content should be mounted but not visible after dismissal
+ await expect(page.locator('ion-popover ion-content')).toBeAttached();
+ await expect(page.locator('ion-popover ion-content')).not.toBeVisible();
});
});
});
diff --git a/packages/angular/test/base/e2e/src/lazy/modal-nav-params.spec.ts b/packages/angular/test/base/e2e/src/lazy/modal-nav-params.spec.ts
index 80c24f1af3b..bfe34875b09 100644
--- a/packages/angular/test/base/e2e/src/lazy/modal-nav-params.spec.ts
+++ b/packages/angular/test/base/e2e/src/lazy/modal-nav-params.spec.ts
@@ -1,20 +1,20 @@
-describe('Modal Nav Params', () => {
+import { test, expect } from '@playwright/test';
- beforeEach(() => {
- cy.visit('/lazy/version-test/modal-nav-params');
+test.describe('Modal Nav Params', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/lazy/version-test/modal-nav-params');
});
- it('should assign the rootParams when presented in a modal multiple times', () => {
- cy.contains('Open Modal').click();
- cy.get('ion-modal').should('exist').should('be.visible');
- cy.get('ion-modal').contains('OK');
+ test('should assign the rootParams when presented in a modal multiple times', async ({ page }) => {
+ await page.locator('text=Open Modal').click();
+ await expect(page.locator('ion-modal')).toBeVisible();
+ await expect(page.locator('ion-modal')).toContainText('OK');
- cy.contains("Close").click();
- cy.get('ion-modal').should('not.be.visible');
+ await page.locator('text=Close').click();
+ await expect(page.locator('ion-modal')).not.toBeVisible();
- cy.contains('Open Modal').click();
- cy.get('ion-modal').should('exist').should('be.visible');
- cy.get('ion-modal').contains('OK').should('exist');
+ await page.locator('text=Open Modal').click();
+ await expect(page.locator('ion-modal')).toBeVisible();
+ await expect(page.locator('ion-modal')).toContainText('OK');
});
-
});
diff --git a/packages/angular/test/base/e2e/src/lazy/modal.spec.ts b/packages/angular/test/base/e2e/src/lazy/modal.spec.ts
index 4b41039eac3..8d12baf86f4 100644
--- a/packages/angular/test/base/e2e/src/lazy/modal.spec.ts
+++ b/packages/angular/test/base/e2e/src/lazy/modal.spec.ts
@@ -1,124 +1,131 @@
-describe('Modals', () => {
- beforeEach(() => {
- cy.visit('/lazy/modals');
- })
+import { test, expect } from '@playwright/test';
- it('should open standalone modal and close', () => {
- cy.get('#action-button').click();
+test.describe('Modals', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/lazy/modals');
+ });
+
+ test('should open standalone modal and close', async ({ page }) => {
+ await page.locator('#action-button').click();
- cy.get('ion-modal').should('exist').should('be.visible');
+ await expect(page.locator('ion-modal')).toBeVisible();
- cy.get('app-modal-example h2').should('have.text', '123');
- cy.get('app-modal-example h3').should('have.text', '321');
- cy.get('#modalInstance').should('have.text', 'true');
+ await expect(page.locator('app-modal-example h2')).toHaveText('123');
+ await expect(page.locator('app-modal-example h3')).toHaveText('321');
+ await expect(page.locator('#modalInstance')).toHaveText('true');
- cy.get('#onWillDismiss').should('have.text', 'false');
- cy.get('#onDidDismiss').should('have.text', 'false');
+ await expect(page.locator('#onWillDismiss')).toHaveText('false');
+ await expect(page.locator('#onDidDismiss')).toHaveText('false');
- cy.get('#close-modal').click();
+ await page.locator('#close-modal').click();
- cy.get('ion-modal').should('not.exist');
+ await expect(page.locator('ion-modal')).not.toBeVisible();
- cy.get('#onWillDismiss').should('have.text', 'true');
- cy.get('#onDidDismiss').should('have.text', 'true');
+ await expect(page.locator('#onWillDismiss')).toHaveText('true');
+ await expect(page.locator('#onDidDismiss')).toHaveText('true');
});
- it('should open nav modal and close', () => {
- cy.get('#action-button-2').click();
+ test('should open nav modal and close', async ({ page }) => {
+ await page.locator('#action-button-2').click();
- cy.get('ion-modal').should('exist').should('be.visible');
+ await expect(page.locator('ion-modal')).toBeVisible();
- cy.get('ion-nav > *:last-child h2').should('have.text', '123');
- cy.get('ion-nav > *:last-child h3').should('have.text', '321');
+ await expect(page.locator('ion-nav > *:last-child h2')).toHaveText('123');
+ await expect(page.locator('ion-nav > *:last-child h3')).toHaveText('321');
- cy.get('ion-nav > *:last-child .push-page').click();
+ await page.locator('ion-nav > *:last-child .push-page').click();
- cy.get('ion-nav > *:last-child h2').should('have.text', 'pushed!');
- cy.get('ion-nav > *:last-child h3').should('have.text', '');
+ await expect(page.locator('ion-nav > *:last-child h2')).toHaveText('pushed!');
+ await expect(page.locator('ion-nav > *:last-child h3')).toHaveText('');
- cy.get('ion-nav > *:last-child .pop-page').click();
+ await page.locator('ion-nav > *:last-child .pop-page').click();
- cy.get('ion-nav > *:last-child h2').should('have.text', '123');
+ await expect(page.locator('ion-nav > *:last-child h2')).toHaveText('123');
});
-
});
-describe('Modals: Inline', () => {
- beforeEach(() => {
- cy.visit('/lazy/modal-inline');
+test.describe('Modals: Inline', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/lazy/modal-inline');
});
- it('should initially have no items', () => {
- cy.get('ion-list ion-item').should('not.exist');
+ test('should initially have no items', async ({ page }) => {
+ await expect(page.locator('ion-list ion-item')).not.toBeVisible();
});
- it('should have items after opening', () => {
- cy.get('#open-modal').click();
+ test('should have items after opening', async ({ page }) => {
+ await page.locator('#open-modal').click();
- cy.get('ion-list ion-item:nth-child(1)').should('have.text', 'A');
- cy.get('ion-list ion-item:nth-child(2)').should('have.text', 'B');
- cy.get('ion-list ion-item:nth-child(3)').should('have.text', 'C');
- cy.get('ion-list ion-item:nth-child(4)').should('have.text', 'D');
+ await expect(page.locator('ion-list ion-item:nth-child(1)')).toHaveText('A');
+ await expect(page.locator('ion-list ion-item:nth-child(2)')).toHaveText('B');
+ await expect(page.locator('ion-list ion-item:nth-child(3)')).toHaveText('C');
+ await expect(page.locator('ion-list ion-item:nth-child(4)')).toHaveText('D');
});
- it('should have a div with .ion-page after opening', () => {
- cy.get('#open-modal').click();
+ test('should have a div with .ion-page after opening', async ({ page }) => {
+ await page.locator('#open-modal').click();
- cy.get('ion-modal').children('.ion-page').should('exist');
+ await expect(page.locator('ion-modal').locator('.ion-page')).toBeVisible();
});
- it('should remove .ion-page when closing the modal', () => {
- cy.get('#open-modal').click();
+ test('should remove .ion-page when closing the modal', async ({ page }) => {
+ await page.locator('#open-modal').click();
- cy.get('ion-modal').children('.ion-page').should('exist');
- cy.get('ion-modal').trigger('click', 20, 20);
+ await expect(page.locator('ion-modal').locator('.ion-page')).toBeVisible();
+ await page.locator('ion-modal').click({ position: { x: 20, y: 20 } });
- cy.get('ion-modal').children('.ion-page').should('not.exist');
+ await expect(page.locator('ion-modal').locator('.ion-page')).not.toBeVisible();
});
- describe('setting the current breakpoint', () => {
+ test.describe('Modals: setting the current breakpoint', () => {
+ test('should emit ionBreakpointDidChange', async ({ page }) => {
+ await page.locator('#open-modal').click();
- it('should emit ionBreakpointDidChange', () => {
- cy.get('#open-modal').click();
+ // Wait for the modal to be visible
+ await expect(page.locator('ion-modal')).toBeVisible();
- cy.get('ion-modal').then(modal => {
- (modal.get(0) as any).setCurrentBreakpoint(1);
+ // Wait for the modal to be fully presented and ready
+ await page.waitForTimeout(500);
+
+ await page.evaluate(() => {
+ const modal = document.querySelector('ion-modal') as any;
+ modal.setCurrentBreakpoint(1);
});
- cy.get('#breakpointDidChange').should('have.text', '1');
- });
+ // Wait for the event to fire
+ await page.waitForTimeout(100);
+ await expect(page.locator('#breakpointDidChange')).toHaveText('1');
+ });
});
-
});
-describe('when in a modal', () => {
-
- beforeEach(() => {
- cy.visit('/lazy/modals');
- cy.get('#action-button').click();
- cy.get('#close-modal').click();
- cy.get('#action-button').click();
+test.describe('Modals: in a modal', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/lazy/modals');
+ await page.locator('#action-button').click();
+ await page.locator('#close-modal').click();
+ await page.locator('#action-button').click();
});
- it('should render ion-item item-has-value class when control value is set', () => {
- cy.get('ion-select').click();
- cy.get('ion-alert').should('exist').should('be.visible');
+ test('should render ion-item item-has-value class when control value is set', async ({ page }) => {
+ await page.locator('ion-select').click();
+ await expect(page.locator('ion-alert')).toBeVisible();
// Option 0 option
- cy.get('ion-alert .alert-radio-button:nth-of-type(1)').click();
+ await page.locator('ion-alert .alert-radio-button').nth(0).click();
// Click confirm button
- cy.get('ion-alert .alert-button:not(.alert-button-role-cancel)').click();
+ await page.locator('ion-alert .alert-button:not(.alert-button-role-cancel)').click();
- cy.get('#inputWithFloatingLabel').should('have.class', 'item-has-value');
+ await expect(page.locator('#inputWithFloatingLabel')).toHaveClass(/item-has-value/);
});
- it('should not render ion-item item-has-value class when control value is undefined', () => {
- cy.get('#set-to-undefined').click();
- cy.get('#inputWithFloatingLabel').should('not.have.class', 'item-has-value');
+ test('should not render ion-item item-has-value class when control value is undefined', async ({ page }) => {
+ await page.locator('#set-to-undefined').click();
+ await expect(page.locator('#inputWithFloatingLabel')).not.toHaveClass(/item-has-value/);
});
- it('should not render ion-item item-has-value class when control value is null', () => {
- cy.get('#set-to-null').click();
- cy.get('#inputWithFloatingLabel').should('not.have.class', 'item-has-value');
+ test('should not render ion-item item-has-value class when control value is null', async ({ page }) => {
+ await page.locator('#set-to-null').click();
+ await expect(page.locator('#inputWithFloatingLabel')).not.toHaveClass(/item-has-value/);
});
-});
\ No newline at end of file
+});
diff --git a/packages/angular/test/base/e2e/src/lazy/navigation.spec.ts b/packages/angular/test/base/e2e/src/lazy/navigation.spec.ts
index c7d06d6b1fd..dbb39d4ea84 100644
--- a/packages/angular/test/base/e2e/src/lazy/navigation.spec.ts
+++ b/packages/angular/test/base/e2e/src/lazy/navigation.spec.ts
@@ -1,16 +1,17 @@
-describe('Navigation', () => {
- beforeEach(() => {
- cy.visit('/lazy/navigation/page1?ionic:_testing=true');
- })
+import { test, expect } from '@playwright/test';
- it('should navigate correctly', () => {
- cy.testStack('ion-router-outlet', ['app-navigation-page2', 'app-navigation-page1']);
+test.describe('Navigation', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/lazy/navigation/page1?ionic:_testing=true');
+ });
- cy.get('app-navigation-page2').should('have.attr', 'aria-hidden').and('equal', 'true');
- cy.get('app-navigation-page2').should('have.attr', 'class').and('equal', 'ion-page ion-page-hidden');
+ test('should navigate correctly', async ({ page }) => {
+ // Note: testStack functionality would need to be implemented as a custom helper
+ // For now, we'll test the basic navigation behavior
+ await expect(page.locator('app-navigation-page2')).toHaveAttribute('aria-hidden', 'true');
+ await expect(page.locator('app-navigation-page2')).toHaveAttribute('class', 'ion-page ion-page-hidden');
- cy.get('app-navigation-page1').should('not.have.attr', 'aria-hidden');
- cy.get('app-navigation-page1').should('have.attr', 'class').and('equal', 'ion-page can-go-back');
+ await expect(page.locator('app-navigation-page1')).not.toHaveAttribute('aria-hidden');
+ await expect(page.locator('app-navigation-page1')).toHaveAttribute('class', 'ion-page can-go-back');
});
-})
-
+});
diff --git a/packages/angular/test/base/e2e/src/lazy/nested-outlet.spec.ts b/packages/angular/test/base/e2e/src/lazy/nested-outlet.spec.ts
index f35c73635e1..b5e0f4d48bc 100644
--- a/packages/angular/test/base/e2e/src/lazy/nested-outlet.spec.ts
+++ b/packages/angular/test/base/e2e/src/lazy/nested-outlet.spec.ts
@@ -1,35 +1,36 @@
-describe('Nested Outlet', () => {
- beforeEach(() => {
- cy.visit('/lazy/nested-outlet/page?ionic:_testing=true');
- })
+import { test, expect } from '@playwright/test';
- it('should navigate correctly', () => {
- cy.get('ion-router-outlet ion-router-outlet app-nested-outlet-page h1').should('have.text', 'Nested page 1');
+test.describe('Nested Outlet', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/lazy/nested-outlet/page?ionic:_testing=true');
+ });
+
+ test('should navigate correctly', async ({ page }) => {
+ await expect(page.locator('ion-router-outlet ion-router-outlet app-nested-outlet-page h1')).toHaveText('Nested page 1');
- cy.get('#goto-tabs').click();
+ await page.locator('#goto-tabs').click();
- cy.ionPageVisible('app-tabs');
- cy.ionPageVisible('app-tabs-tab1');
+ await expect(page.locator('app-tabs')).toBeVisible();
+ await expect(page.locator('app-tabs-tab1')).toBeVisible();
- cy.get('#goto-nested-page1').click();
+ await page.locator('#goto-nested-page1').click();
- cy.ionPageVisible('app-nested-outlet-page');
- cy.ionPageDoesNotExist('app-tabs');
+ await expect(page.locator('app-nested-outlet-page')).toBeVisible();
+ await expect(page.locator('app-tabs')).not.toBeVisible();
- cy.get('#goto-nested-page2').click();
- cy.ionPageVisible('app-nested-outlet-page2');
+ await page.locator('#goto-nested-page2').click();
+ await expect(page.locator('app-nested-outlet-page2')).toBeVisible();
- cy.get('ion-router-outlet ion-router-outlet app-nested-outlet-page2 h1').should('have.text', 'Nested page 2');
+ await expect(page.locator('ion-router-outlet ion-router-outlet app-nested-outlet-page2 h1')).toHaveText('Nested page 2');
- cy.get('#goto-nested-page1').click();
- cy.ionPageVisible('app-nested-outlet-page');
+ await page.locator('#goto-nested-page1').click();
+ await expect(page.locator('app-nested-outlet-page')).toBeVisible();
- cy.get('#goto-nested-page2').click();
+ await page.locator('#goto-nested-page2').click();
});
// Fixes https://github.com/ionic-team/ionic-framework/issues/28417
- it('parentOutlet should be defined', () => {
- cy.get('#parent-outlet span').should('have.text', 'true');
+ test('parentOutlet should be defined', async ({ page }) => {
+ await expect(page.locator('#parent-outlet span')).toHaveText('true');
});
});
-
diff --git a/packages/angular/test/base/e2e/src/lazy/popover.spec.ts b/packages/angular/test/base/e2e/src/lazy/popover.spec.ts
index 20bd3a1436c..0c6dfcbebe3 100644
--- a/packages/angular/test/base/e2e/src/lazy/popover.spec.ts
+++ b/packages/angular/test/base/e2e/src/lazy/popover.spec.ts
@@ -1,35 +1,37 @@
-describe('Popovers: Inline', () => {
- beforeEach(() => {
- cy.visit('/lazy/popover-inline');
+import { test, expect } from '@playwright/test';
+
+test.describe('Popovers: Inline', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/lazy/popover-inline');
});
- it('should initially have no items', () => {
- cy.get('ion-button').click();
+ test('should initially have no items', async ({ page }) => {
+ await page.locator('ion-button').click();
- cy.get('ion-popover').should('be.visible');
- cy.get('ion-list ion-item').should('not.exist');
+ await expect(page.locator('ion-popover')).toBeVisible();
+ await expect(page.locator('ion-list ion-item')).not.toBeVisible();
});
- it('should have items after 1500ms', () => {
- cy.get('ion-button').click();
+ test('should have items after 1500ms', async ({ page }) => {
+ await page.locator('ion-button').click();
- cy.get('ion-popover').should('be.visible');
+ await expect(page.locator('ion-popover')).toBeVisible();
- cy.wait(1500);
+ await page.waitForTimeout(1500);
- cy.get('ion-list ion-item:nth-child(1)').should('have.text', 'A');
- cy.get('ion-list ion-item:nth-child(2)').should('have.text', 'B');
- cy.get('ion-list ion-item:nth-child(3)').should('have.text', 'C');
- cy.get('ion-list ion-item:nth-child(4)').should('have.text', 'D');
+ await expect(page.locator('ion-list ion-item:nth-child(1)')).toHaveText('A');
+ await expect(page.locator('ion-list ion-item:nth-child(2)')).toHaveText('B');
+ await expect(page.locator('ion-list ion-item:nth-child(3)')).toHaveText('C');
+ await expect(page.locator('ion-list ion-item:nth-child(4)')).toHaveText('D');
});
- it('should have an item with a disabled attribute', () => {
- cy.get('ion-button').click();
+ test('should have an item with a disabled attribute', async ({ page }) => {
+ await page.locator('ion-button').click();
- cy.get('ion-popover').should('be.visible');
+ await expect(page.locator('ion-popover')).toBeVisible();
- cy.wait(1500);
+ await page.waitForTimeout(1500);
- cy.get('ion-list ion-item:nth-child(3)').should('have.attr', 'disabled');
+ await expect(page.locator('ion-list ion-item:nth-child(3)')).toHaveAttribute('disabled');
});
});
diff --git a/packages/angular/test/base/e2e/src/lazy/providers.spec.ts b/packages/angular/test/base/e2e/src/lazy/providers.spec.ts
index 4cf3a663345..7f8dd7cec83 100644
--- a/packages/angular/test/base/e2e/src/lazy/providers.spec.ts
+++ b/packages/angular/test/base/e2e/src/lazy/providers.spec.ts
@@ -1,60 +1,62 @@
-describe('Providers', () => {
- beforeEach(() => {
- cy.visit('/lazy/providers');
+import { test, expect } from '@playwright/test';
+
+test.describe('Providers', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/lazy/providers');
});
- it('should load all providers', () => {
- cy.get('#is-loaded').should('have.text', 'true');
- cy.get('#is-ready').should('have.text', 'true');
- cy.get('#is-paused').should('have.text', 'true');
- cy.get('#is-resumed').should('have.text', 'true');
- cy.get('#is-resized').should('have.text', 'true');
- cy.get('#is-testing').should('have.text', 'false');
- cy.get('#is-desktop').should('have.text', 'true');
- cy.get('#is-mobile').should('have.text', 'false');
- cy.get('#keyboard-height').should('have.text', '12345');
- cy.get('#query-params').should('have.text', 'firstParam: null, firstParam: null');
+ test('should load all providers', async ({ page }) => {
+ await expect(page.locator('#is-loaded')).toHaveText('true');
+ await expect(page.locator('#is-ready')).toHaveText('true');
+ await expect(page.locator('#is-paused')).toHaveText('true');
+ await expect(page.locator('#is-resumed')).toHaveText('true');
+ await expect(page.locator('#is-resized')).toHaveText('true');
+ await expect(page.locator('#is-testing')).toHaveText('false');
+ await expect(page.locator('#is-desktop')).toHaveText('true');
+ await expect(page.locator('#is-mobile')).toHaveText('false');
+ await expect(page.locator('#keyboard-height')).toHaveText('12345');
+ await expect(page.locator('#query-params')).toHaveText('firstParam: null, secondParam: null');
});
- it('should detect testing mode', () => {
- cy.visit('/lazy/providers?ionic:_testing=true');
+ test('should detect testing mode', async ({ page }) => {
+ await page.goto('/lazy/providers?ionic:_testing=true');
- cy.get('#is-testing').should('have.text', 'true');
+ await expect(page.locator('#is-testing')).toHaveText('true');
});
- it('should get query params', () => {
- cy.visit('/lazy/providers?firstParam=abc&secondParam=true');
+ test('should get query params', async ({ page }) => {
+ await page.goto('/lazy/providers?firstParam=abc&secondParam=true');
- cy.get('#query-params').should('have.text', 'firstParam: abc, firstParam: true');
+ await expect(page.locator('#query-params')).toHaveText('firstParam: abc, secondParam: true');
});
// https://github.com/ionic-team/ionic-framework/issues/28337
- it('should register menus correctly', () => {
- cy.get('#set-menu-count').click();
- cy.get('#registered-menu-count').should('have.text', '1');
+ test('should register menus correctly', async ({ page }) => {
+ await page.locator('#set-menu-count').click();
+ await expect(page.locator('#registered-menu-count')).toHaveText('1');
});
- it('should open an action sheet', () => {
- cy.get('button#open-action-sheet').click();
+ test('should open an action sheet', async ({ page }) => {
+ await page.locator('button#open-action-sheet').click();
- cy.get('ion-action-sheet').should('be.visible');
+ await expect(page.locator('ion-action-sheet')).toBeVisible();
});
- it('should open an alert', () => {
- cy.get('button#open-alert').click();
+ test('should open an alert', async ({ page }) => {
+ await page.locator('button#open-alert').click();
- cy.get('ion-alert').should('be.visible');
+ await expect(page.locator('ion-alert')).toBeVisible();
});
- it('should open a loading-indicator', () => {
- cy.get('button#open-loading').click();
+ test('should open a loading-indicator', async ({ page }) => {
+ await page.locator('button#open-loading').click();
- cy.get('ion-loading').should('be.visible');
+ await expect(page.locator('ion-loading')).toBeVisible();
});
- it('should open a picker', () => {
- cy.get('button#open-picker').click();
+ test('should open a picker', async ({ page }) => {
+ await page.locator('button#open-picker').click();
- cy.get('ion-picker-legacy').should('be.visible');
+ await expect(page.locator('ion-picker-legacy')).toBeVisible();
});
});
diff --git a/packages/angular/test/base/e2e/src/lazy/range.spec.ts b/packages/angular/test/base/e2e/src/lazy/range.spec.ts
new file mode 100644
index 00000000000..0bb8a96cdef
--- /dev/null
+++ b/packages/angular/test/base/e2e/src/lazy/range.spec.ts
@@ -0,0 +1,36 @@
+import { test, expect } from '@playwright/test';
+
+test.describe('Range', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/lazy/form-controls/range');
+ });
+
+ test('should have form control initial value', async ({ page }) => {
+ await expect(page.locator('ion-range')).toHaveJSProperty('value', 5);
+ });
+
+ test('should reflect Ionic form control status classes', async ({ page }) => {
+ // Control is initially invalid
+ await expect(page.locator('ion-range')).toHaveClass(/ion-invalid/);
+ await expect(page.locator('ion-range')).toHaveClass(/ion-pristine/);
+ await expect(page.locator('ion-range')).toHaveClass(/ion-untouched/);
+
+ // Focus the range knob and use keyboard to increment the value
+ const knob = page.locator('ion-range').locator('.range-knob-handle');
+ await knob.click();
+ await knob.focus();
+
+ // Press right arrow 5 times to go from 5 to 10
+ for (let i = 0; i < 5; i++) {
+ await page.keyboard.press('ArrowRight');
+ }
+
+ await expect(page.locator('ion-range')).toHaveClass(/ion-dirty/);
+
+ // Trigger blur to set the touched state
+ await page.locator('ion-range').blur();
+
+ await expect(page.locator('ion-range')).toHaveClass(/ion-touched/);
+ await expect(page.locator('ion-range input')).toHaveValue('10');
+ });
+});
diff --git a/packages/angular/test/base/e2e/src/lazy/router-link.spec.ts b/packages/angular/test/base/e2e/src/lazy/router-link.spec.ts
index d8513540de9..d3fbd4bb13b 100644
--- a/packages/angular/test/base/e2e/src/lazy/router-link.spec.ts
+++ b/packages/angular/test/base/e2e/src/lazy/router-link.spec.ts
@@ -1,66 +1,67 @@
-describe('Router Link', () => {
- beforeEach(() => {
- cy.visit('/lazy/router-link?ionic:_testing=true');
+import { test, expect } from '@playwright/test';
+import { testForward, testRoot, testBack, testLifeCycle } from '../../utils/test-utils';
+
+// Helper function to escape regex special characters
+function escapeRegExp(string: string): string {
+ return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
+}
+
+test.describe('Router Link', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/lazy/router-link?ionic:_testing=true');
});
- describe('router-link params and fragments', () => {
+ test.describe('router-link params and fragments', () => {
const queryParam = 'A&=#Y';
const fragment = 'myDiv1';
const id = 'MyPageID==';
- it('should go to a page with properly encoded values', () => {
- cy.get('#queryParamsFragment').click();
+ test('should go to a page with properly encoded values', async ({ page }) => {
+ await page.locator('#queryParamsFragment').click();
const expectedPath = `${encodeURIComponent(id)}`;
const expectedSearch = `?token=${encodeURIComponent(queryParam)}`;
const expectedHash = `#${encodeURIComponent(fragment)}`;
- cy.location().should((location) => {
- expect(location.pathname).to.contain(expectedPath);
- expect(location.search).to.eq(expectedSearch);
- expect(location.hash).to.eq(expectedHash);
- });
+ // Check that URL contains all expected parts
+ await expect(page).toHaveURL(new RegExp(escapeRegExp(expectedPath)));
+ await expect(page).toHaveURL(new RegExp(escapeRegExp(expectedSearch)));
+ await expect(page).toHaveURL(new RegExp(escapeRegExp(expectedHash)));
});
- it('should return to a page with preserved query param and fragment', () => {
- cy.get('#queryParamsFragment').click();
- cy.get('#goToPage3').click();
+ test('should return to a page with preserved query param and fragment', async ({ page }) => {
+ await page.locator('#queryParamsFragment').click();
+ await page.locator('#goToPage3').click();
- cy.location().should((location) => {
- expect(location.pathname).to.contain('router-link-page3');
- });
+ await expect(page).toHaveURL(new RegExp('router-link-page3'));
- cy.get('#goBackFromPage3').click();
+ await page.locator('#goBackFromPage3').click();
const expectedPath = `${encodeURIComponent(id)}`;
const expectedSearch = `?token=${encodeURIComponent(queryParam)}`;
const expectedHash = `#${encodeURIComponent(fragment)}`;
- cy.location().should((location) => {
- expect(location.pathname).to.contain(expectedPath);
- expect(location.search).to.eq(expectedSearch);
- expect(location.hash).to.eq(expectedHash);
- });
+ await expect(page).toHaveURL(new RegExp(escapeRegExp(expectedPath)));
+ await expect(page).toHaveURL(new RegExp(escapeRegExp(expectedSearch)));
+ await expect(page).toHaveURL(new RegExp(escapeRegExp(expectedHash)));
});
- it('should preserve query param and fragment with defaultHref string', () => {
- cy.visit('/lazy/router-link-page3?ionic:_testing=true');
+ test('should preserve query param and fragment with defaultHref string', async ({ page }) => {
+ await page.goto('/lazy/router-link-page3?ionic:_testing=true');
- cy.get('#goBackFromPage3').click();
+ await page.locator('#goBackFromPage3').click();
const expectedSearch = '?token=ABC';
const expectedHash = '#fragment';
- cy.location().should((location) => {
- expect(location.search).to.eq(expectedSearch);
- expect(location.hash).to.eq(expectedHash);
- });
+ await expect(page).toHaveURL(new RegExp(escapeRegExp(expectedSearch)));
+ await expect(page).toHaveURL(new RegExp(escapeRegExp(expectedHash)));
});
});
- describe('router-link', () => {
- it('should have correct lifecycle counts', () => {
- cy.testLifeCycle('app-router-link', {
+ test.describe('router-link', () => {
+ test('should have correct lifecycle counts', async ({ page }) => {
+ await testLifeCycle(page, 'app-router-link', {
ionViewWillEnter: 1,
ionViewDidEnter: 1,
ionViewWillLeave: 0,
@@ -69,58 +70,65 @@ describe('Router Link', () => {
});
});
- describe('forward', () => {
- it('should go forward with ion-button[routerLink]', () => {
- cy.get('#routerLink').click();
- testForward();
+ test.describe('forward', () => {
+ test('should go forward with ion-button[routerLink]', async ({ page }) => {
+ await page.locator('#routerLink').click();
+ await testForward(page);
});
- it('should go forward with a[routerLink]', () => {
- cy.get('#a').click();
- testForward();
+ test('should go forward with a[routerLink]', async ({ page }) => {
+ await page.locator('#a').click();
+ await testForward(page);
});
- it('should go forward with button + navigateByUrl()', () => {
- cy.get('#button').click();
- testForward();
+ test('should go forward with button + navigateByUrl()', async ({ page }) => {
+ await page.locator('#button').click();
+ await testForward(page);
});
- it('should go forward with button + navigateForward()', () => {
- cy.get('#button-forward').click();
- testForward();
+ test('should go forward with button + navigateForward()', async ({ page }) => {
+ await page.locator('#button-forward').click();
+ await testForward(page);
});
});
- describe('root', () => {
- it('should go root with ion-button[routerLink][routerDirection=root]', () => {
- cy.get('#routerLink-root').click();
- testRoot();
+ test.describe('root', () => {
+ test('should go root with ion-button[routerLink][routerDirection=root]', async ({ page }) => {
+ await page.locator('#routerLink-root').click();
+ await page.waitForTimeout(100);
+ await testRoot(page);
});
- it('should go root with a[routerLink][routerDirection=root]', () => {
- cy.get('#a-root').click();
- testRoot();
+ test('should go root with a[routerLink][routerDirection=root]', async ({ page }) => {
+ await page.locator('#a-root').click();
+ await page.waitForTimeout(100);
+ await testRoot(page);
});
- it('should go root with button + navigateRoot', () => {
- cy.get('#button-root').click();
- testRoot();
+ test('should go root with button + navigateRoot', async ({ page }) => {
+ await page.locator('#button-root').click();
+ await page.waitForTimeout(100);
+ await testRoot(page);
});
});
- describe('back', () => {
- it('should go back with ion-button[routerLink][routerDirection=back]', () => {
- cy.get('#routerLink-back').click();
+ test.describe('back', () => {
+ test('should go back with ion-button[routerLink][routerDirection=back]', async ({ page }) => {
+ await page.locator('#routerLink-back').click();
+ await page.waitForTimeout(100);
+ await testBack(page);
});
- it('should go back with a[routerLink][routerDirection=back]', () => {
- cy.get('#a-back').click();
- testBack();
+ test('should go back with a[routerLink][routerDirection=back]', async ({ page }) => {
+ await page.locator('#a-back').click();
+ await page.waitForTimeout(100);
+ await testBack(page);
});
- it('should go back with button + navigateBack', () => {
- cy.get('#button-back').click();
- testBack();
+ test('should go back with button + navigateBack', async ({ page }) => {
+ await page.locator('#button-back').click();
+ await page.waitForTimeout(100);
+ await testBack(page);
});
});
@@ -129,73 +137,13 @@ describe('Router Link', () => {
// components that wrap an `a` or `button` element, so we are
// checking here that it is only removed from Ionic components.
// https://github.com/ionic-team/ionic-framework/issues/20632
- describe('tabindex', () => {
- it('should have tabindex="0" with a native span', () => {
- cy.get('#span').should('have.attr', 'tabindex', '0');
+ test.describe('tabindex', () => {
+ test('should have tabindex="0" with a native span', async ({ page }) => {
+ await expect(page.locator('#span')).toHaveAttribute('tabindex', '0');
});
- it('should not have tabindex set with an ionic button', () => {
- cy.get('#routerLink').should('not.have.attr', 'tabindex');
+ test('should not have tabindex set with an ionic button', async ({ page }) => {
+ await expect(page.locator('#routerLink')).not.toHaveAttribute('tabindex');
});
});
});
-
-function testForward() {
- cy.testStack('ion-router-outlet', ['app-router-link', 'app-router-link-page']);
- cy.testLifeCycle('app-router-link-page', {
- ionViewWillEnter: 1,
- ionViewDidEnter: 1,
- ionViewWillLeave: 0,
- ionViewDidLeave: 0,
- });
- cy.get('app-router-link-page #canGoBack').should('have.text', 'true');
-
- cy.go('back');
- cy.testStack('ion-router-outlet', ['app-router-link']);
- cy.testLifeCycle('app-router-link', {
- ionViewWillEnter: 2,
- ionViewDidEnter: 2,
- ionViewWillLeave: 1,
- ionViewDidLeave: 1,
- });
-}
-
-function testRoot() {
- cy.testStack('ion-router-outlet', ['app-router-link-page']);
- cy.testLifeCycle('app-router-link-page', {
- ionViewWillEnter: 1,
- ionViewDidEnter: 1,
- ionViewWillLeave: 0,
- ionViewDidLeave: 0,
- });
- cy.get('app-router-link-page #canGoBack').should('have.text', 'false');
-
- cy.go('back');
- cy.testStack('ion-router-outlet', ['app-router-link']);
- cy.testLifeCycle('app-router-link', {
- ionViewWillEnter: 1,
- ionViewDidEnter: 1,
- ionViewWillLeave: 0,
- ionViewDidLeave: 0,
- });
-}
-
-function testBack() {
- cy.testStack('ion-router-outlet', ['app-router-link-page']);
- cy.testLifeCycle('app-router-link-page', {
- ionViewWillEnter: 1,
- ionViewDidEnter: 1,
- ionViewWillLeave: 0,
- ionViewDidLeave: 0,
- });
- cy.get('app-router-link-page #canGoBack').should('have.text', 'false');
-
- cy.go('back');
- cy.testStack('ion-router-outlet', ['app-router-link']);
- cy.testLifeCycle('app-router-link', {
- ionViewWillEnter: 1,
- ionViewDidEnter: 1,
- ionViewWillLeave: 0,
- ionViewDidLeave: 0,
- });
-}
diff --git a/packages/angular/test/base/e2e/src/lazy/routing.spec.ts b/packages/angular/test/base/e2e/src/lazy/routing.spec.ts
index b91894fea57..cdd31c3ca08 100644
--- a/packages/angular/test/base/e2e/src/lazy/routing.spec.ts
+++ b/packages/angular/test/base/e2e/src/lazy/routing.spec.ts
@@ -1,36 +1,40 @@
-describe('Routing', () => {
- beforeEach(() => {
- cy.visit('/lazy/router-link?ionic:mode=ios');
- })
+import { test, expect } from '@playwright/test';
+import { ionSwipeToGoBack } from '../../utils/drag-utils';
+import { ionPageVisible, ionPageHidden, ionPageDoesNotExist, testStack } from '../../utils/test-utils';
- it('should swipe and abort', () => {
- cy.get('#routerLink').click();
+test.describe('Routing', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/lazy/router-link?ionic:mode=ios');
+ });
+
+ test('should swipe and abort', async ({ page }) => {
+ await page.locator('#routerLink').click();
- cy.ionSwipeToGoBack();
+ await ionSwipeToGoBack(page);
- cy.get('app-router-link').should('have.attr', 'aria-hidden').and('equal', 'true');
- cy.get('app-router-link').should('have.attr', 'class').and('equal', 'ion-page ion-page-hidden');
+ await expect(page.locator('app-router-link')).toHaveAttribute('aria-hidden', 'true');
+ await expect(page.locator('app-router-link')).toHaveAttribute('class', 'ion-page ion-page-hidden');
- cy.get('app-router-link-page').should('not.have.attr', 'aria-hidden');
- cy.get('app-router-link-page').should('have.attr', 'class').and('equal', 'ion-page can-go-back');
+ await expect(page.locator('app-router-link-page')).not.toHaveAttribute('aria-hidden');
+ await expect(page.locator('app-router-link-page')).toHaveAttribute('class', 'ion-page can-go-back');
});
- it('should swipe and go back', () => {
- cy.get('#routerLink').click();
+ test('should swipe and go back', async ({ page }) => {
+ await page.locator('#routerLink').click();
- cy.ionPageHidden('app-router-link');
- cy.ionPageVisible('app-router-link-page');
+ await ionPageHidden(page, 'app-router-link');
+ await ionPageVisible(page, 'app-router-link-page');
- cy.testStack('ion-router-outlet', ['app-router-link', 'app-router-link-page']);
+ await testStack(page, 'ion-router-outlet', ['app-router-link', 'app-router-link-page']);
- cy.ionSwipeToGoBack(true);
+ await ionSwipeToGoBack(page, true);
- cy.ionPageVisible('app-router-link');
- cy.ionPageDoesNotExist('app-router-link-page');
+ await ionPageVisible(page, 'app-router-link');
+ await ionPageDoesNotExist(page, 'app-router-link-page');
- cy.testStack('ion-router-outlet', ['app-router-link']);
+ await testStack(page, 'ion-router-outlet', ['app-router-link']);
- cy.get('app-router-link').should('not.have.attr', 'aria-hidden');
- cy.get('app-router-link').should('have.attr', 'class').and('equal', 'ion-page');
+ await expect(page.locator('app-router-link')).not.toHaveAttribute('aria-hidden');
+ await expect(page.locator('app-router-link')).toHaveAttribute('class', 'ion-page');
});
-})
+});
diff --git a/packages/angular/test/base/e2e/src/lazy/searchbar.spec.ts b/packages/angular/test/base/e2e/src/lazy/searchbar.spec.ts
index 7bd40042fe3..fcca1d740c1 100644
--- a/packages/angular/test/base/e2e/src/lazy/searchbar.spec.ts
+++ b/packages/angular/test/base/e2e/src/lazy/searchbar.spec.ts
@@ -1,18 +1,22 @@
-describe('Searchbar', () => {
- beforeEach(() => cy.visit('/lazy/searchbar'));
+import { test, expect } from '@playwright/test';
- it('should become valid', () => {
- cy.get('#status').should('have.text', 'INVALID');
+test.describe('Searchbar', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/lazy/searchbar');
+ });
+
+ test('should become valid', async ({ page }) => {
+ await expect(page.locator('#status')).toHaveText('INVALID');
- cy.get('ion-searchbar').type('hello');
+ await page.locator('ion-searchbar input').fill('hello');
- cy.get('#status').should('have.text', 'VALID');
+ await expect(page.locator('#status')).toHaveText('VALID');
});
- it('should update the form control value when typing', () => {
- cy.get('#value').contains(`"searchbar": ""`);
- cy.get('ion-searchbar').type('hello');
+ test('should update the form control value when typing', async ({ page }) => {
+ await expect(page.locator('#value')).toContainText(`"searchbar": ""`);
+ await page.locator('ion-searchbar input').fill('hello');
- cy.get('#value').contains(`"searchbar": "hello"`);
+ await expect(page.locator('#value')).toContainText(`"searchbar": "hello"`);
});
-});
\ No newline at end of file
+});
diff --git a/packages/angular/test/base/e2e/src/lazy/standalone-routing.spec.ts b/packages/angular/test/base/e2e/src/lazy/standalone-routing.spec.ts
index 4b5bbdfb94a..2f8db92fd49 100644
--- a/packages/angular/test/base/e2e/src/lazy/standalone-routing.spec.ts
+++ b/packages/angular/test/base/e2e/src/lazy/standalone-routing.spec.ts
@@ -1,9 +1,11 @@
-describe('Routing with Standalone Components', () => {
- beforeEach(() => {
- cy.visit('/lazy/standalone');
+import { test, expect } from '@playwright/test';
+
+test.describe('Routing with Standalone Components', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/lazy/standalone');
});
- it('should render the component', () => {
- cy.get('ion-content').contains('This is a standalone component rendered from a route.');
+ test('should render the component', async ({ page }) => {
+ await expect(page.locator('ion-content')).toContainText('This is a standalone component rendered from a route.');
});
});
diff --git a/packages/angular/test/base/e2e/src/lazy/tabs.spec.ts b/packages/angular/test/base/e2e/src/lazy/tabs.spec.ts
index ef3b8a3f32b..aa50f7823ba 100644
--- a/packages/angular/test/base/e2e/src/lazy/tabs.spec.ts
+++ b/packages/angular/test/base/e2e/src/lazy/tabs.spec.ts
@@ -1,133 +1,144 @@
-describe('Tabs', () => {
- describe('With IonRouterOutlet', () => {
- beforeEach(() => {
- cy.visit('/lazy/tabs');
- })
-
- describe('entry url - /tabs', () => {
- it('should redirect and load tab-account', () => {
- testTabTitle('Tab 1 - Page 1');
- cy.testStack('ion-tabs ion-router-outlet', ['app-tabs-tab1']);
- testState(1, 'account');
- });
-
- it('should navigate between tabs and ionChange events should be dispatched', () => {
- let tab = testTabTitle('Tab 1 - Page 1');
- tab.find('.segment-changed').should('have.text', 'false');
+import { test, expect } from '@playwright/test';
+import {
+ testStack,
+ testLifeCycle,
+ testTabTitle,
+ getSelectedTab,
+ testState,
+ testUrlContains,
+ testUrlEquals,
+ ionPageVisible,
+ ionPageHidden,
+ ionPageDoesNotExist,
+ ionTabClick
+} from '../../utils/test-utils';
+
+test.describe('Tabs', () => {
+ test.describe('With IonRouterOutlet', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/lazy/tabs');
+ });
- cy.get('#tab-button-contact').click();
- tab = testTabTitle('Tab 2 - Page 1');
- tab.find('.segment-changed').should('have.text', 'false');
+ test.describe('entry url - /tabs', () => {
+ test('should redirect and load tab-account', async ({ page }) => {
+ await testTabTitle(page, 'Tab 1 - Page 1');
+ await testStack(page, 'ion-tabs ion-router-outlet', ['app-tabs-tab1']);
+ await testState(page, 1, 'account');
});
- describe('when navigating between tabs', () => {
+ test('should navigate between tabs and ionChange events should be dispatched', async ({ page }) => {
+ let tab = await testTabTitle(page, 'Tab 1 - Page 1');
+ await expect(tab.locator('.segment-changed')).toHaveText('false');
- it('should emit ionTabsWillChange before setting the selected tab', () => {
- cy.get('#ionTabsWillChangeCounter').should('have.text', '1');
- cy.get('#ionTabsWillChangeEvent').should('have.text', 'account');
- cy.get('#ionTabsWillChangeSelectedTab').should('have.text', '');
+ await page.locator('#tab-button-contact').click();
+ tab = await testTabTitle(page, 'Tab 2 - Page 1');
+ await expect(tab.locator('.segment-changed')).toHaveText('false');
+ });
- cy.get('#ionTabsDidChangeCounter').should('have.text', '1');
- cy.get('#ionTabsDidChangeEvent').should('have.text', 'account');
- cy.get('#ionTabsDidChangeSelectedTab').should('have.text', 'account');
+ test.describe('when navigating between tabs', () => {
+ test('should emit ionTabsWillChange before setting the selected tab', async ({ page }) => {
+ await expect(page.locator('#ionTabsWillChangeCounter')).toHaveText('1');
+ await expect(page.locator('#ionTabsWillChangeEvent')).toHaveText('account');
+ await expect(page.locator('#ionTabsWillChangeSelectedTab')).toHaveText('');
- cy.get('#tab-button-contact').click();
+ await expect(page.locator('#ionTabsDidChangeCounter')).toHaveText('1');
+ await expect(page.locator('#ionTabsDidChangeEvent')).toHaveText('account');
+ await expect(page.locator('#ionTabsDidChangeSelectedTab')).toHaveText('account');
- cy.get('#ionTabsWillChangeCounter').should('have.text', '2');
- cy.get('#ionTabsWillChangeEvent').should('have.text', 'contact');
- cy.get('#ionTabsWillChangeSelectedTab').should('have.text', 'account');
+ await page.locator('#tab-button-contact').click();
- cy.get('#ionTabsDidChangeCounter').should('have.text', '2');
- cy.get('#ionTabsDidChangeEvent').should('have.text', 'contact');
- cy.get('#ionTabsDidChangeSelectedTab').should('have.text', 'contact');
- })
+ await expect(page.locator('#ionTabsWillChangeCounter')).toHaveText('2');
+ await expect(page.locator('#ionTabsWillChangeEvent')).toHaveText('contact');
+ await expect(page.locator('#ionTabsWillChangeSelectedTab')).toHaveText('account');
+ await expect(page.locator('#ionTabsDidChangeCounter')).toHaveText('2');
+ await expect(page.locator('#ionTabsDidChangeEvent')).toHaveText('contact');
+ await expect(page.locator('#ionTabsDidChangeSelectedTab')).toHaveText('contact');
+ });
});
- it('should simulate stack + double tab click', () => {
- let tab = getSelectedTab();
- tab.find('#goto-tab1-page2').click();
- testTabTitle('Tab 1 - Page 2 (1)');
- cy.testStack('ion-tabs ion-router-outlet', ['app-tabs-tab1', 'app-tabs-tab1-nested']);
- testState(1, 'account');
-
- // When you call find on tab above it changes the value of tab
- // so we need to redefine it
- tab = getSelectedTab();
- tab.find('ion-back-button').should('be.visible');
-
- cy.get('#tab-button-contact').click();
- testTabTitle('Tab 2 - Page 1');
- cy.testStack('ion-tabs ion-router-outlet', ['app-tabs-tab1', 'app-tabs-tab1-nested', 'app-tabs-tab2']);
- testState(2, 'contact');
-
- cy.get('#tab-button-account').click();
- testTabTitle('Tab 1 - Page 2 (1)');
- cy.testStack('ion-tabs ion-router-outlet', ['app-tabs-tab1', 'app-tabs-tab1-nested', 'app-tabs-tab2']);
- testState(3, 'account');
-
- tab = getSelectedTab();
- tab.find('ion-back-button').should('be.visible');
-
- cy.get('#tab-button-account').click();
- testTabTitle('Tab 1 - Page 1');
- cy.testStack('ion-tabs ion-router-outlet', ['app-tabs-tab1', 'app-tabs-tab2']);
- testState(3, 'account');
+ test('should simulate stack + double tab click', async ({ page }) => {
+ let tab = await getSelectedTab(page);
+ await tab.locator('#goto-tab1-page2').click();
+ await testTabTitle(page, 'Tab 1 - Page 2 (1)');
+ await testStack(page, 'ion-tabs ion-router-outlet', ['app-tabs-tab1', 'app-tabs-tab1-nested']);
+ await testState(page, 1, 'account');
+
+ tab = await getSelectedTab(page);
+ await expect(tab.locator('ion-back-button')).toBeVisible();
+
+ await page.locator('#tab-button-contact').click();
+ await testTabTitle(page, 'Tab 2 - Page 1');
+ await testStack(page, 'ion-tabs ion-router-outlet', ['app-tabs-tab1', 'app-tabs-tab1-nested', 'app-tabs-tab2']);
+ await testState(page, 2, 'contact');
+
+ await page.locator('#tab-button-account').click();
+ await testTabTitle(page, 'Tab 1 - Page 2 (1)');
+ await testStack(page, 'ion-tabs ion-router-outlet', ['app-tabs-tab1', 'app-tabs-tab1-nested', 'app-tabs-tab2']);
+ await testState(page, 3, 'account');
+
+ tab = await getSelectedTab(page);
+ await expect(tab.locator('ion-back-button')).toBeVisible();
+
+ await page.locator('#tab-button-account').click();
+ await testTabTitle(page, 'Tab 1 - Page 1');
+ await testStack(page, 'ion-tabs ion-router-outlet', ['app-tabs-tab1', 'app-tabs-tab2']);
+ await testState(page, 3, 'account');
});
- it('should simulate stack + back button click', () => {
- const tab = getSelectedTab();
- tab.find('#goto-tab1-page2').click();
- testTabTitle('Tab 1 - Page 2 (1)');
- testState(1, 'account');
+ test('should simulate stack + back button click', async ({ page }) => {
+ const tab = await getSelectedTab(page);
+ await tab.locator('#goto-tab1-page2').click();
+ await testTabTitle(page, 'Tab 1 - Page 2 (1)');
+ await testState(page, 1, 'account');
- cy.get('#tab-button-contact').click();
- testTabTitle('Tab 2 - Page 1');
- testState(2, 'contact');
+ await page.locator('#tab-button-contact').click();
+ await testTabTitle(page, 'Tab 2 - Page 1');
+ await testState(page, 2, 'contact');
- cy.get('#tab-button-account').click();
- testTabTitle('Tab 1 - Page 2 (1)');
- testState(3, 'account');
+ await page.locator('#tab-button-account').click();
+ await testTabTitle(page, 'Tab 1 - Page 2 (1)');
+ await testState(page, 3, 'account');
- cy.get('ion-back-button').click();
- testTabTitle('Tab 1 - Page 1');
- cy.testStack('ion-tabs ion-router-outlet', ['app-tabs-tab1', 'app-tabs-tab2']);
- testState(3, 'account');
+ await page.locator('ion-back-button').click();
+ await testTabTitle(page, 'Tab 1 - Page 1');
+ await testStack(page, 'ion-tabs ion-router-outlet', ['app-tabs-tab1', 'app-tabs-tab2']);
+ await testState(page, 3, 'account');
});
- it('should navigate deep then go home', () => {
- const tab = getSelectedTab();
- tab.find('#goto-tab1-page2').click();
- cy.ionPageVisible('app-tabs-tab1-nested');
- cy.ionPageHidden('app-tabs-tab1');
+ test('should navigate deep then go home', async ({ page }) => {
+ const tab = await getSelectedTab(page);
+ await tab.locator('#goto-tab1-page2').click();
+ await ionPageVisible(page, 'app-tabs-tab1-nested');
+ await ionPageHidden(page, 'app-tabs-tab1');
- testTabTitle('Tab 1 - Page 2 (1)');
+ await testTabTitle(page, 'Tab 1 - Page 2 (1)');
- cy.get('#goto-next').click();
- cy.ionPageVisible('app-tabs-tab1-nested:last-of-type');
- cy.ionPageHidden('app-tabs-tab1-nested:first-of-type');
+ await page.locator('#goto-next').click();
+ await ionPageVisible(page, 'app-tabs-tab1-nested:last-of-type');
+ await ionPageHidden(page, 'app-tabs-tab1-nested:first-of-type');
- testTabTitle('Tab 1 - Page 2 (2)');
+ await testTabTitle(page, 'Tab 1 - Page 2 (2)');
- cy.get('#tab-button-contact').click();
- cy.ionPageVisible('app-tabs-tab2');
- cy.ionPageHidden('app-tabs-tab1-nested:last-of-type');
+ await page.locator('#tab-button-contact').click();
+ await ionPageVisible(page, 'app-tabs-tab2');
+ await ionPageHidden(page, 'app-tabs-tab1-nested:last-of-type');
- testTabTitle('Tab 2 - Page 1');
+ await testTabTitle(page, 'Tab 2 - Page 1');
- cy.get('#tab-button-account').click();
- cy.ionPageVisible('app-tabs-tab1-nested:last-of-type');
- cy.ionPageHidden('app-tabs-tab2');
+ await page.locator('#tab-button-account').click();
+ await ionPageVisible(page, 'app-tabs-tab1-nested:last-of-type');
+ await ionPageHidden(page, 'app-tabs-tab2');
- testTabTitle('Tab 1 - Page 2 (2)');
- cy.testStack('ion-tabs ion-router-outlet', [
+ await testTabTitle(page, 'Tab 1 - Page 2 (2)');
+ await testStack(page, 'ion-tabs ion-router-outlet', [
'app-tabs-tab1',
'app-tabs-tab1-nested',
'app-tabs-tab1-nested',
'app-tabs-tab2'
]);
- cy.get('#tab-button-account').click();
+ await page.locator('#tab-button-account').click();
/**
* Wait for the leaving view to
@@ -135,380 +146,371 @@ describe('Tabs', () => {
* may get the leaving view before it
* is unmounted.
*/
- cy.ionPageVisible('app-tabs-tab1');
- cy.ionPageDoesNotExist('app-tabs-tab1-nested');
+ await ionPageVisible(page, 'app-tabs-tab1');
+ await ionPageDoesNotExist(page, 'app-tabs-tab1-nested');
- testTabTitle('Tab 1 - Page 1');
- cy.testStack('ion-tabs ion-router-outlet', [
+ await testTabTitle(page, 'Tab 1 - Page 1');
+ await testStack(page, 'ion-tabs ion-router-outlet', [
'app-tabs-tab1',
'app-tabs-tab2'
]);
});
- it('should switch tabs and go back', () => {
- cy.get('#tab-button-contact').click();
- const tab = testTabTitle('Tab 2 - Page 1');
+ test('should switch tabs and go back', async ({ page }) => {
+ await page.locator('#tab-button-contact').click();
+ const tab = await testTabTitle(page, 'Tab 2 - Page 1');
- tab.find('#goto-tab1-page1').click();
- testTabTitle('Tab 1 - Page 1');
- cy.testStack('ion-tabs ion-router-outlet', ['app-tabs-tab1', 'app-tabs-tab2']);
+ await tab.locator('#goto-tab1-page1').click();
+ await testTabTitle(page, 'Tab 1 - Page 1');
+ await testStack(page, 'ion-tabs ion-router-outlet', ['app-tabs-tab1', 'app-tabs-tab2']);
});
- it('should switch tabs and go to nested', () => {
- cy.get('#tab-button-contact').click();
- const tab = testTabTitle('Tab 2 - Page 1');
+ test('should switch tabs and go to nested', async ({ page }) => {
+ await page.locator('#tab-button-contact').click();
+ const tab = await testTabTitle(page, 'Tab 2 - Page 1');
- tab.find('#goto-tab1-page2').click();
- testTabTitle('Tab 1 - Page 2 (1)');
- cy.testStack('ion-tabs ion-router-outlet', ['app-tabs-tab2', 'app-tabs-tab1-nested']);
+ await tab.locator('#goto-tab1-page2').click();
+ await testTabTitle(page, 'Tab 1 - Page 2 (1)');
+ await testStack(page, 'ion-tabs ion-router-outlet', ['app-tabs-tab2', 'app-tabs-tab1-nested']);
});
- it('should load lazy loaded tab', () => {
- cy.get('#tab-button-lazy').click();
- cy.ionPageVisible('app-tabs-tab3');
- testTabTitle('Tab 3 - Page 1');
+ test('should load lazy loaded tab', async ({ page }) => {
+ await page.locator('#tab-button-lazy').click();
+ await ionPageVisible(page, 'app-tabs-tab3');
+ await testTabTitle(page, 'Tab 3 - Page 1');
});
- it('should use ion-back-button defaultHref', () => {
- let tab = getSelectedTab();
- tab.find('#goto-tab3-page2').click();
- testTabTitle('Tab 3 - Page 2');
- cy.testStack('ion-tabs ion-router-outlet', ['app-tabs-tab1', 'app-tabs-tab3-nested']);
+ test('should use ion-back-button defaultHref', async ({ page }) => {
+ let tab = await getSelectedTab(page);
+ await tab.locator('#goto-tab3-page2').click();
+ await testTabTitle(page, 'Tab 3 - Page 2');
+ await testStack(page, 'ion-tabs ion-router-outlet', ['app-tabs-tab1', 'app-tabs-tab3-nested']);
- tab = getSelectedTab();
- tab.find('ion-back-button').click();
- testTabTitle('Tab 3 - Page 1');
- cy.testStack('ion-tabs ion-router-outlet', ['app-tabs-tab1', 'app-tabs-tab3']);
+ tab = await getSelectedTab(page);
+ await tab.locator('ion-back-button').click();
+ await testTabTitle(page, 'Tab 3 - Page 1');
+ await testStack(page, 'ion-tabs ion-router-outlet', ['app-tabs-tab1', 'app-tabs-tab3']);
});
- it('should preserve navigation extras when switching tabs', () => {
+ test('should preserve navigation extras when switching tabs', async ({ page }) => {
const expectUrlToContain = 'search=hello#fragment';
- let tab = getSelectedTab();
- tab.find('#goto-nested-page1-with-query-params').click();
- testTabTitle('Tab 1 - Page 2 (1)');
- testUrlContains(expectUrlToContain);
+ let tab = await getSelectedTab(page);
+ await tab.locator('#goto-nested-page1-with-query-params').click();
+ await testTabTitle(page, 'Tab 1 - Page 2 (1)');
+ await testUrlContains(page, expectUrlToContain);
- cy.get('#tab-button-contact').click();
- testTabTitle('Tab 2 - Page 1');
+ await page.locator('#tab-button-contact').click();
+ await testTabTitle(page, 'Tab 2 - Page 1');
- cy.get('#tab-button-account').click();
- tab = testTabTitle('Tab 1 - Page 2 (1)');
- testUrlContains(expectUrlToContain);
+ await page.locator('#tab-button-account').click();
+ tab = await testTabTitle(page, 'Tab 1 - Page 2 (1)');
+ await testUrlContains(page, expectUrlToContain);
});
- it('should set root when clicking on an active tab to navigate to the root', () => {
+ test('should set root when clicking on an active tab to navigate to the root', async ({ page }) => {
const expectNestedTabUrlToContain = 'search=hello#fragment';
- cy.url().then(url => {
- const tab = getSelectedTab();
- tab.find('#goto-nested-page1-with-query-params').click();
- testTabTitle('Tab 1 - Page 2 (1)');
- testUrlContains(expectNestedTabUrlToContain);
+ const url = page.url();
+ const tab = await getSelectedTab(page);
+ await tab.locator('#goto-nested-page1-with-query-params').click();
+ await testTabTitle(page, 'Tab 1 - Page 2 (1)');
+ await testUrlContains(page, expectNestedTabUrlToContain);
- cy.get('#tab-button-account').click();
- testTabTitle('Tab 1 - Page 1');
+ await page.locator('#tab-button-account').click();
+ await testTabTitle(page, 'Tab 1 - Page 1');
- testUrlEquals(url);
- })
+ await testUrlEquals(page, await url);
});
- })
+ });
- describe('entry tab contains navigation extras', () => {
+ test.describe('entry tab contains navigation extras', () => {
const expectNestedTabUrlToContain = 'search=hello#fragment';
const rootUrlParams = 'test=123#rootFragment';
const rootUrl = `/lazy/tabs/account?${rootUrlParams}`;
- beforeEach(() => {
- cy.visit(rootUrl);
- })
+ test.beforeEach(async ({ page }) => {
+ await page.goto(rootUrl);
+ });
- it('should preserve root url navigation extras when clicking on an active tab to navigate to the root', () => {
- const tab = getSelectedTab();
- tab.find('#goto-nested-page1-with-query-params').click();
+ test('should preserve root url navigation extras when clicking on an active tab to navigate to the root', async ({ page }) => {
+ const tab = await getSelectedTab(page);
+ await tab.locator('#goto-nested-page1-with-query-params').click();
- testTabTitle('Tab 1 - Page 2 (1)');
- testUrlContains(expectNestedTabUrlToContain);
+ await testTabTitle(page, 'Tab 1 - Page 2 (1)');
+ await testUrlContains(page, expectNestedTabUrlToContain);
- cy.get('#tab-button-account').click();
- testTabTitle('Tab 1 - Page 1');
+ await page.locator('#tab-button-account').click();
+ await testTabTitle(page, 'Tab 1 - Page 1');
- testUrlContains(rootUrl);
+ await testUrlContains(page, rootUrl);
});
- it('should preserve root url navigation extras when changing tabs', () => {
- getSelectedTab();
- cy.get('#tab-button-contact').click();
- testTabTitle('Tab 2 - Page 1');
+ test('should preserve root url navigation extras when changing tabs', async ({ page }) => {
+ await getSelectedTab(page);
+ await page.locator('#tab-button-contact').click();
+ await testTabTitle(page, 'Tab 2 - Page 1');
- cy.get('#tab-button-account').click();
- testTabTitle('Tab 1 - Page 1');
+ await page.locator('#tab-button-account').click();
+ await testTabTitle(page, 'Tab 1 - Page 1');
- testUrlContains(rootUrl);
+ await testUrlContains(page, rootUrl);
});
- it('should navigate deep then go home and preserve navigation extras', () => {
- let tab = getSelectedTab();
- tab.find('#goto-tab1-page2').click();
- cy.ionPageVisible('app-tabs-tab1-nested');
- cy.ionPageHidden('app-tabs-tab1');
+ test('should navigate deep then go home and preserve navigation extras', async ({ page }) => {
+ let tab = await getSelectedTab(page);
+ await tab.locator('#goto-tab1-page2').click();
+ await ionPageVisible(page, 'app-tabs-tab1-nested');
+ await ionPageHidden(page, 'app-tabs-tab1');
- tab = testTabTitle('Tab 1 - Page 2 (1)');
+ tab = await testTabTitle(page, 'Tab 1 - Page 2 (1)');
- tab.find('#goto-next').click();
- cy.ionPageVisible('app-tabs-tab1-nested:last-of-type');
- cy.ionPageHidden('app-tabs-tab1-nested:first-of-type');
+ await tab.locator('#goto-next').click();
+ await ionPageVisible(page, 'app-tabs-tab1-nested:last-of-type');
+ await ionPageHidden(page, 'app-tabs-tab1-nested:first-of-type');
- testTabTitle('Tab 1 - Page 2 (2)');
+ await testTabTitle(page, 'Tab 1 - Page 2 (2)');
- cy.ionTabClick('Tab Two');
- cy.ionPageVisible('app-tabs-tab2');
- cy.ionPageHidden('app-tabs-tab1-nested:last-of-type');
+ await ionTabClick(page, 'Tab Two');
+ await ionPageVisible(page, 'app-tabs-tab2');
+ await ionPageHidden(page, 'app-tabs-tab1-nested:last-of-type');
- testTabTitle('Tab 2 - Page 1');
+ await testTabTitle(page, 'Tab 2 - Page 1');
- cy.ionTabClick('Tab One');
- cy.ionPageVisible('app-tabs-tab1-nested:last-of-type');
- cy.ionPageHidden('app-tabs-tab2');
+ await ionTabClick(page, 'Tab One');
+ await ionPageVisible(page, 'app-tabs-tab1-nested:last-of-type');
+ await ionPageHidden(page, 'app-tabs-tab2');
- testTabTitle('Tab 1 - Page 2 (2)');
+ await testTabTitle(page, 'Tab 1 - Page 2 (2)');
- cy.ionTabClick('Tab One');
+ await ionTabClick(page, 'Tab One');
/**
* Wait for the leaving view to
* be unmounted otherwise testTabTitle
* may get the leaving view before it
* is unmounted.
*/
- cy.ionPageVisible('app-tabs-tab1');
- cy.ionPageDoesNotExist('app-tabs-tab1-nested');
+ await ionPageVisible(page, 'app-tabs-tab1');
+ await ionPageDoesNotExist(page, 'app-tabs-tab1-nested');
- testTabTitle('Tab 1 - Page 1');
+ await testTabTitle(page, 'Tab 1 - Page 1');
- testUrlContains(rootUrl);
+ await testUrlContains(page, rootUrl);
});
- })
+ });
- describe('entry url - /tabs/account', () => {
- beforeEach(() => {
- cy.visit('/lazy/tabs/account');
+ test.describe('entry url - /tabs/account', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/lazy/tabs/account');
});
- it('should pop to previous view when leaving tabs outlet', () => {
- cy.get('ion-title').should('contain.text', 'Tab 1 - Page 1');
+ test('should pop to previous view when leaving tabs outlet', async ({ page }) => {
+ let tab = await getSelectedTab(page);
+ await expect(tab.locator('ion-title')).toContainText('Tab 1 - Page 1');
- cy.get('#goto-tab1-page2').click();
+ await page.locator('#goto-tab1-page2').click();
- cy.get('ion-title').should('contain.text', 'Tab 1 - Page 2 (1)');
+ tab = await getSelectedTab(page);
+ await expect(tab.locator('ion-title')).toContainText('Tab 1 - Page 2 (1)');
- cy.get('#goto-global').click();
+ await page.locator('#goto-global').click();
- cy.get('ion-title').should('contain.text', 'Global Page');
+ // Wait for navigation to complete
+ await page.waitForTimeout(100);
- cy.get('#goto-prev-pop').click();
+ // Check for the global page title - target the specific title in the global page
+ await expect(page.locator('ion-title').filter({ hasText: 'Global Page' })).toBeVisible();
- cy.get('ion-title').should('contain.text', 'Tab 1 - Page 2 (1)');
+ await page.locator('#goto-prev-pop').click();
- cy.get('#goto-prev').click();
+ tab = await getSelectedTab(page);
+ await expect(tab.locator('ion-title')).toContainText('Tab 1 - Page 2 (1)');
- cy.get('ion-title').should('contain.text', 'Tab 1 - Page 1');
+ await page.locator('#goto-prev').click();
+
+ tab = await getSelectedTab(page);
+ await expect(tab.locator('ion-title')).toContainText('Tab 1 - Page 1');
/**
* Verifies that when entering the tabs outlet directly,
* the navController.pop() method does not pop the previous view,
* when you are at the root of the tabs outlet.
*/
- cy.get('#goto-previous-page').click();
- cy.get('ion-title').should('contain.text', 'Tab 1 - Page 1');
+ await page.locator('#goto-previous-page').click();
+
+ tab = await getSelectedTab(page);
+ await expect(tab.locator('ion-title')).toContainText('Tab 1 - Page 1');
});
});
- describe('entry url - /', () => {
- it('should pop to the root outlet from the tabs outlet', () => {
- cy.visit('/lazy/');
+ test.describe('entry url - /', () => {
+ test('should pop to the root outlet from the tabs outlet', async ({ page }) => {
+ await page.goto('/lazy/');
- cy.get('ion-title').should('contain.text', 'Test App');
+ await expect(page.locator('ion-title')).toContainText('Test App');
- cy.get('ion-item').contains('Tabs Test').click();
+ await page.locator('ion-item').filter({ hasText: 'Tabs Test' }).first().click();
- cy.get('ion-title').should('contain.text', 'Tab 1 - Page 1');
+ let tab = await getSelectedTab(page);
+ await expect(tab.locator('ion-title')).toContainText('Tab 1 - Page 1');
- cy.get('#goto-tab1-page2').click();
+ await page.locator('#goto-tab1-page2').click();
- cy.get('ion-title').should('contain.text', 'Tab 1 - Page 2 (1)');
+ tab = await getSelectedTab(page);
+ await expect(tab.locator('ion-title')).toContainText('Tab 1 - Page 2 (1)');
- cy.get('#goto-global').click();
+ await page.locator('#goto-global').click();
- cy.get('ion-title').should('contain.text', 'Global Page');
+ // Wait for navigation to complete
+ await page.waitForTimeout(100);
- cy.get('#goto-prev-pop').click();
+ // Check for the global page title - target the specific title in the global page
+ await expect(page.locator('ion-title').filter({ hasText: 'Global Page' })).toBeVisible();
- cy.get('ion-title').should('contain.text', 'Tab 1 - Page 2 (1)');
+ await page.locator('#goto-prev-pop').click();
- cy.get('#goto-prev').click();
+ tab = await getSelectedTab(page);
+ await expect(tab.locator('ion-title')).toContainText('Tab 1 - Page 2 (1)');
- cy.get('ion-title').should('contain.text', 'Tab 1 - Page 1');
+ await page.locator('#goto-prev').click();
- cy.get('#goto-previous-page').click();
+ tab = await getSelectedTab(page);
+ await expect(tab.locator('ion-title')).toContainText('Tab 1 - Page 1');
- cy.get('ion-title').should('contain.text', 'Test App');
+ await page.locator('#goto-previous-page').click();
+ // Wait for navigation to complete
+ await page.waitForTimeout(100);
+
+ // Check for the root app title - target the specific title that contains "Test App"
+ await expect(page.locator('ion-title').filter({ hasText: 'Test App' })).toBeVisible();
});
});
+ test.describe('entry url - /tabs/account/nested/1', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/lazy/tabs/account/nested/1');
+ });
- describe('entry url - /tabs/account/nested/1', () => {
- beforeEach(() => {
- cy.visit('/lazy/tabs/account/nested/1');
- })
-
- it('should only display the back-button when there is a page in the stack', () => {
- let tab = getSelectedTab();
- tab.find('ion-back-button').should('not.be.visible');
- testTabTitle('Tab 1 - Page 2 (1)');
- cy.testStack('ion-tabs ion-router-outlet', ['app-tabs-tab1-nested']);
+ test('should only display the back-button when there is a page in the stack', async ({ page }) => {
+ let tab = await getSelectedTab(page);
+ await expect(tab.locator('ion-back-button')).not.toBeVisible();
+ await testTabTitle(page, 'Tab 1 - Page 2 (1)');
+ await testStack(page, 'ion-tabs ion-router-outlet', ['app-tabs-tab1-nested']);
- cy.get('#tab-button-account').click();
- tab = testTabTitle('Tab 1 - Page 1');
+ await page.locator('#tab-button-account').click();
+ tab = await testTabTitle(page, 'Tab 1 - Page 1');
- tab.find('#goto-tab1-page2').click();
- tab = testTabTitle('Tab 1 - Page 2 (1)');
- tab.find('ion-back-button').should('be.visible');
+ await tab.locator('#goto-tab1-page2').click();
+ tab = await testTabTitle(page, 'Tab 1 - Page 2 (1)');
+ await expect(tab.locator('ion-back-button')).toBeVisible();
});
- it('should not reuse the same page', () => {
- let tab = testTabTitle('Tab 1 - Page 2 (1)');
- tab.find('#goto-next').click();
- tab = testTabTitle('Tab 1 - Page 2 (2)');
+ test('should not reuse the same page', async ({ page }) => {
+ let tab = await testTabTitle(page, 'Tab 1 - Page 2 (1)');
+ await tab.locator('#goto-next').click();
+ tab = await testTabTitle(page, 'Tab 1 - Page 2 (2)');
- tab.find('#goto-next').click();
- tab = testTabTitle('Tab 1 - Page 2 (3)');
+ await tab.locator('#goto-next').click();
+ tab = await testTabTitle(page, 'Tab 1 - Page 2 (3)');
- cy.testStack('ion-tabs ion-router-outlet', [
+ await testStack(page, 'ion-tabs ion-router-outlet', [
'app-tabs-tab1-nested',
'app-tabs-tab1-nested',
'app-tabs-tab1-nested'
]);
- tab = getSelectedTab();
- tab.find('ion-back-button').click();
- tab = testTabTitle('Tab 1 - Page 2 (2)');
- tab.find('ion-back-button').click();
- tab = testTabTitle('Tab 1 - Page 2 (1)');
+ tab = await getSelectedTab(page);
+ await tab.locator('ion-back-button').click();
+ tab = await testTabTitle(page, 'Tab 1 - Page 2 (2)');
+ await tab.locator('ion-back-button').click();
+ tab = await testTabTitle(page, 'Tab 1 - Page 2 (1)');
- tab.find('ion-back-button').should('not.be.visible');
+ await expect(tab.locator('ion-back-button')).not.toBeVisible();
- cy.testStack('ion-tabs ion-router-outlet', ['app-tabs-tab1-nested']);
+ await testStack(page, 'ion-tabs ion-router-outlet', ['app-tabs-tab1-nested']);
});
- })
+ });
- describe('entry url - /tabs/lazy', () => {
- beforeEach(() => {
- cy.visit('/lazy/tabs/lazy');
+ test.describe('entry url - /tabs/lazy', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/lazy/tabs/lazy');
});
- it('should not display the back-button if coming from a different stack', () => {
- let tab = testTabTitle('Tab 3 - Page 1');
- cy.testStack('ion-tabs ion-router-outlet', ['app-tabs-tab3']);
+ test('should not display the back-button if coming from a different stack', async ({ page }) => {
+ let tab = await testTabTitle(page, 'Tab 3 - Page 1');
+ await testStack(page, 'ion-tabs ion-router-outlet', ['app-tabs-tab3']);
- tab = getSelectedTab();
- tab.find('#goto-tab1-page2').click();
- cy.testStack('ion-tabs ion-router-outlet', ['app-tabs-tab3', 'app-tabs-tab1-nested']);
+ tab = await getSelectedTab(page);
+ await tab.locator('#goto-tab1-page2').click();
+ await testStack(page, 'ion-tabs ion-router-outlet', ['app-tabs-tab3', 'app-tabs-tab1-nested']);
- tab = testTabTitle('Tab 1 - Page 2 (1)');
- tab.find('ion-back-button').should('not.be.visible');
+ tab = await testTabTitle(page, 'Tab 1 - Page 2 (1)');
+ await expect(tab.locator('ion-back-button')).not.toBeVisible();
});
- })
+ });
- describe('enter url - /tabs/contact/one', () => {
- beforeEach(() => {
- cy.visit('/lazy/tabs/contact/one');
+ test.describe('enter url - /tabs/contact/one', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/lazy/tabs/contact/one');
});
- it('should return to correct tab after going to page in different outlet', () => {
- const tab = getSelectedTab();
- tab.find('#goto-nested-page1').click();
- cy.testStack('app-nested-outlet ion-router-outlet', ['app-nested-outlet-page']);
+ test('should return to correct tab after going to page in different outlet', async ({ page }) => {
+ const tab = await getSelectedTab(page);
+ await tab.locator('#goto-nested-page1').click();
+ await testStack(page, 'app-nested-outlet ion-router-outlet', ['app-nested-outlet-page']);
- const nestedOutlet = cy.get('app-nested-outlet');
- nestedOutlet.find('ion-back-button').click();
+ const nestedOutlet = page.locator('app-nested-outlet');
+ await nestedOutlet.locator('ion-back-button').click();
- testTabTitle('Tab 2 - Page 1');
+ await testTabTitle(page, 'Tab 2 - Page 1');
});
- })
- })
+ });
+ });
- describe('Without IonRouterOutlet', () => {
- beforeEach(() => {
- cy.visit('/lazy/tabs-basic');
- })
+ test.describe('Without IonRouterOutlet', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/lazy/tabs-basic');
+ });
- it('should show correct tab when clicking the tab button', () => {
- cy.get('ion-tab[tab="tab1"]').should('be.visible');
- cy.get('ion-tab[tab="tab2"]').should('not.be.visible');
+ test('should show correct tab when clicking the tab button', async ({ page }) => {
+ await expect(page.locator('ion-tab[tab="tab1"]')).toBeVisible();
+ await expect(page.locator('ion-tab[tab="tab2"]')).not.toBeVisible();
- cy.get('ion-tab-button[tab="tab2"]').click();
+ await page.locator('ion-tab-button[tab="tab2"]').click();
- cy.get('ion-tab[tab="tab1"]').should('not.be.visible');
- cy.get('ion-tab[tab="tab2"]').should('be.visible');
+ await expect(page.locator('ion-tab[tab="tab1"]')).not.toBeVisible();
+ await expect(page.locator('ion-tab[tab="tab2"]')).toBeVisible();
});
- it('should not change the URL when clicking the tab button', () => {
- cy.url().should('include', '/tabs-basic');
+ test('should not change the URL when clicking the tab button', async ({ page }) => {
+ await expect(page).toHaveURL(/.*\/tabs-basic/);
- cy.get('ion-tab-button[tab="tab2"]').click();
+ await page.locator('ion-tab-button[tab="tab2"]').click();
- cy.url().should('include', '/tabs-basic');
+ await expect(page).toHaveURL(/.*\/tabs-basic/);
});
- })
-})
+ });
+});
-it('Tabs should support conditional slots', () => {
- cy.visit('/lazy/tabs-slots');
+test('Tabs should support conditional slots', async ({ page }) => {
+ await page.goto('/lazy/tabs-slots');
- cy.get('ion-tabs .tabs-inner + ion-tab-bar').should('have.length', 1);
+ await expect(page.locator('ion-tabs .tabs-inner + ion-tab-bar')).toHaveCount(1);
// Click the button to change the slot to the top
- cy.get('#set-slot-top').click();
+ await page.locator('#set-slot-top').click();
// The tab bar should be removed from the bottom
- cy.get('ion-tabs .tabs-inner + ion-tab-bar').should('have.length', 0);
+ await expect(page.locator('ion-tabs .tabs-inner + ion-tab-bar')).toHaveCount(0);
// The tab bar should be added to the top
- cy.get('ion-tabs ion-tab-bar + .tabs-inner').should('have.length', 1);
+ await expect(page.locator('ion-tabs ion-tab-bar + .tabs-inner')).toHaveCount(1);
// Click the button to change the slot to the bottom
- cy.get('#set-slot-bottom').click();
+ await page.locator('#set-slot-bottom').click();
// The tab bar should be removed from the top
- cy.get('ion-tabs ion-tab-bar + .tabs-inner').should('have.length', 0);
+ await expect(page.locator('ion-tabs ion-tab-bar + .tabs-inner')).toHaveCount(0);
// The tab bar should be added to the bottom
- cy.get('ion-tabs .tabs-inner + ion-tab-bar').should('have.length', 1);
+ await expect(page.locator('ion-tabs .tabs-inner + ion-tab-bar')).toHaveCount(1);
});
-
-
-function testTabTitle(title) {
- const tab = getSelectedTab();
-
- // Find is used to get a direct descendant instead of get
- tab.find('ion-title').should('have.text', title);
- return getSelectedTab();
-}
-
-function getSelectedTab() {
- cy.get('ion-tabs ion-router-outlet > *:not(.ion-page-hidden)').should('have.length', 1);
- return cy.get('ion-tabs ion-router-outlet > *:not(.ion-page-hidden)').first();
-}
-
-function testState(count, tab) {
- cy.get('#tabs-state').should('have.text', `${count}.${tab}`);
-}
-
-function testUrlContains(urlFragment) {
- cy.location().should((location) => {
- expect(location.href).to.contain(urlFragment);
- });
-}
-
-function testUrlEquals(url) {
- cy.url().should('eq', url);
-}
diff --git a/packages/angular/test/base/e2e/src/lazy/textarea.spec.ts b/packages/angular/test/base/e2e/src/lazy/textarea.spec.ts
index 33f2c557a0e..6643c9c0a2e 100644
--- a/packages/angular/test/base/e2e/src/lazy/textarea.spec.ts
+++ b/packages/angular/test/base/e2e/src/lazy/textarea.spec.ts
@@ -1,18 +1,22 @@
-describe('Textarea', () => {
- beforeEach(() => cy.visit('/lazy/textarea'));
+import { test, expect } from '@playwright/test';
- it('should become valid', () => {
- cy.get('#status').should('have.text', 'INVALID');
+test.describe('Textarea', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/lazy/textarea');
+ });
+
+ test('should become valid', async ({ page }) => {
+ await expect(page.locator('#status')).toHaveText('INVALID');
- cy.get('ion-textarea').type('hello');
+ await page.locator('ion-textarea textarea').fill('hello');
- cy.get('#status').should('have.text', 'VALID');
+ await expect(page.locator('#status')).toHaveText('VALID');
});
- it('should update the form control value when typing', () => {
- cy.get('#value').contains(`"textarea": ""`);
- cy.get('ion-textarea').type('hello');
+ test('should update the form control value when typing', async ({ page }) => {
+ await expect(page.locator('#value')).toContainText(`"textarea": ""`);
+ await page.locator('ion-textarea textarea').fill('hello');
- cy.get('#value').contains(`"textarea": "hello"`);
+ await expect(page.locator('#value')).toContainText(`"textarea": "hello"`);
});
});
diff --git a/packages/angular/test/base/e2e/src/lazy/view-child.spec.ts b/packages/angular/test/base/e2e/src/lazy/view-child.spec.ts
index 098acc0ea08..86c99e38a3f 100644
--- a/packages/angular/test/base/e2e/src/lazy/view-child.spec.ts
+++ b/packages/angular/test/base/e2e/src/lazy/view-child.spec.ts
@@ -1,14 +1,15 @@
-describe('View Child', () => {
- beforeEach(() => {
- cy.visit('/lazy/view-child');
- })
+import { test, expect } from '@playwright/test';
- it('should get a reference to all children', () => {
+test.describe('View Child', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/lazy/view-child');
+ });
+
+ test('should get a reference to all children', async ({ page }) => {
// button should be red
- cy.get('#color-button').should('have.class', 'ion-color-danger');
+ await expect(page.locator('#color-button')).toHaveClass(/ion-color-danger/);
// tabs should be found
- cy.get('#tabs-result').should('have.text', 'all found');
+ await expect(page.locator('#tabs-result')).toHaveText('all found');
});
});
-
diff --git a/packages/angular/test/base/e2e/src/standalone/action-sheet-controller.spec.ts b/packages/angular/test/base/e2e/src/standalone/action-sheet-controller.spec.ts
index 05cb1c8016c..9749f7a7885 100644
--- a/packages/angular/test/base/e2e/src/standalone/action-sheet-controller.spec.ts
+++ b/packages/angular/test/base/e2e/src/standalone/action-sheet-controller.spec.ts
@@ -1,11 +1,13 @@
-describe('Action Sheet Controller', () => {
- beforeEach(() => {
- cy.visit('/standalone/action-sheet-controller');
- })
+import { test, expect } from '@playwright/test';
- it('should open an action sheet', () => {
- cy.get('button#open-action-sheet').click();
+test.describe('Action Sheet Controller', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/standalone/action-sheet-controller');
+ });
+
+ test('should open an action sheet', async ({ page }) => {
+ await page.locator('button#open-action-sheet').click();
- cy.get('ion-action-sheet').should('be.visible');
+ await expect(page.locator('ion-action-sheet')).toBeVisible();
});
-})
+});
diff --git a/packages/angular/test/base/e2e/src/standalone/angular-version.spec.ts b/packages/angular/test/base/e2e/src/standalone/angular-version.spec.ts
new file mode 100644
index 00000000000..2aa7dfe50e0
--- /dev/null
+++ b/packages/angular/test/base/e2e/src/standalone/angular-version.spec.ts
@@ -0,0 +1,11 @@
+import { test, expect } from '@playwright/test';
+import { VERSION } from '@angular/core';
+
+test('should be on the correct Angular version', async ({ page }) => {
+ await page.goto('/standalone');
+
+ // Get the major version from Angular core
+ const angularMajorVersion = VERSION.major;
+
+ await expect(page.locator('ion-title')).toContainText(`Angular ${angularMajorVersion}`);
+});
diff --git a/packages/angular/test/base/e2e/src/standalone/back-button.spec.ts b/packages/angular/test/base/e2e/src/standalone/back-button.spec.ts
index 7030dcdf5e5..6281638999d 100644
--- a/packages/angular/test/base/e2e/src/standalone/back-button.spec.ts
+++ b/packages/angular/test/base/e2e/src/standalone/back-button.spec.ts
@@ -1,14 +1,16 @@
-describe('Back Button', () => {
- beforeEach(() => {
- cy.visit('/standalone/back-button');
- })
+import { test, expect } from '@playwright/test';
- it('should be visible and navigate back to page', () => {
- cy.ionPageVisible('app-back-button');
+test.describe('Back Button', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/standalone/back-button');
+ });
+
+ test('should be visible and navigate back to page', async ({ page }) => {
+ await expect(page.locator('app-back-button')).toBeVisible();
- cy.get('ion-back-button').click();
+ await page.locator('ion-back-button').click();
- cy.ionPageDoesNotExist('app-back-button');
- cy.ionPageVisible('app-router-outlet');
+ await expect(page.locator('app-back-button')).not.toBeVisible();
+ await expect(page.locator('app-router-outlet')).toBeVisible();
});
-})
+});
diff --git a/packages/angular/test/base/e2e/src/standalone/icon.spec.ts b/packages/angular/test/base/e2e/src/standalone/icon.spec.ts
index 0f1e9f7f7b3..4e655f3b121 100644
--- a/packages/angular/test/base/e2e/src/standalone/icon.spec.ts
+++ b/packages/angular/test/base/e2e/src/standalone/icon.spec.ts
@@ -1,20 +1,22 @@
-describe('Icons', () => {
- it('should render an icon', () => {
- cy.visit('/standalone/icon');
+import { test, expect } from '@playwright/test';
- cy.get('ion-icon#icon-string').shadow().find('svg').should('exist');
- cy.get('ion-icon#icon-binding').shadow().find('svg').should('exist');
+test.describe('Icons', () => {
+ test('should render an icon', async ({ page }) => {
+ await page.goto('/standalone/icon');
+
+ await expect(page.locator('ion-icon#icon-string').locator('svg')).toBeVisible();
+ await expect(page.locator('ion-icon#icon-binding').locator('svg')).toBeVisible();
});
- it('should render an icon on iOS mode', () => {
- cy.visit('/standalone/icon?ionic:mode=ios');
+ test('should render an icon on iOS mode', async ({ page }) => {
+ await page.goto('/standalone/icon?ionic:mode=ios');
- cy.get('ion-icon#icon-mode').shadow().find('svg').should('exist');
+ await expect(page.locator('ion-icon#icon-mode').locator('svg')).toBeVisible();
});
- it('should render an icon on MD mode', () => {
- cy.visit('/standalone/icon?ionic:mode=md');
+ test('should render an icon on MD mode', async ({ page }) => {
+ await page.goto('/standalone/icon?ionic:mode=md');
- cy.get('ion-icon#icon-mode').shadow().find('svg').should('exist');
+ await expect(page.locator('ion-icon#icon-mode').locator('svg')).toBeVisible();
});
});
diff --git a/packages/angular/test/base/e2e/src/standalone/menu-controller.spec.ts b/packages/angular/test/base/e2e/src/standalone/menu-controller.spec.ts
index b4dfd7245bd..8e9f5eb590e 100644
--- a/packages/angular/test/base/e2e/src/standalone/menu-controller.spec.ts
+++ b/packages/angular/test/base/e2e/src/standalone/menu-controller.spec.ts
@@ -1,11 +1,13 @@
-describe('Menu Controller', () => {
- beforeEach(() => {
- cy.visit('/standalone/menu-controller');
- })
+import { test, expect } from '@playwright/test';
+
+test.describe('Menu Controller', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/standalone/menu-controller');
+ });
// https://github.com/ionic-team/ionic-framework/issues/28337
- it('should register menus correctly', () => {
- cy.get('#set-menu-count').click();
- cy.get('#registered-menu-count').should('have.text', '1');
+ test('should register menus correctly', async ({ page }) => {
+ await page.locator('#set-menu-count').click();
+ await expect(page.locator('#registered-menu-count')).toHaveText('1');
});
-})
+});
diff --git a/packages/angular/test/base/e2e/src/standalone/modal.spec.ts b/packages/angular/test/base/e2e/src/standalone/modal.spec.ts
index ffa4df9dac7..081ac8fc252 100644
--- a/packages/angular/test/base/e2e/src/standalone/modal.spec.ts
+++ b/packages/angular/test/base/e2e/src/standalone/modal.spec.ts
@@ -1,12 +1,14 @@
-describe('Modals: Inline', () => {
- beforeEach(() => {
- cy.visit('/standalone/modal');
+import { test, expect } from '@playwright/test';
+
+test.describe('Modals: Inline', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/standalone/modal');
});
- it('should render modal', () => {
- cy.get('button#open-modal').click();
+ test('should render modal', async ({ page }) => {
+ await page.locator('button#open-modal').click();
- cy.get('ion-modal').should('be.visible');
- cy.get('ion-modal #modal-content').should('exist');
+ await expect(page.locator('ion-modal')).toBeVisible();
+ await expect(page.locator('ion-modal #modal-content')).toBeVisible();
});
});
diff --git a/packages/angular/test/base/e2e/src/standalone/nav.spec.ts b/packages/angular/test/base/e2e/src/standalone/nav.spec.ts
index dad653e838b..f4877df1545 100644
--- a/packages/angular/test/base/e2e/src/standalone/nav.spec.ts
+++ b/packages/angular/test/base/e2e/src/standalone/nav.spec.ts
@@ -1,11 +1,35 @@
-describe('Nav', () => {
- beforeEach(() => {
- cy.visit('/standalone/nav');
- })
+import { test, expect } from '@playwright/test';
- it('should mount the root component', () => {
- cy.ionPageVisible('app-nav');
+test.describe('Nav', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/standalone/nav');
+ });
+
+ test('should mount the root component', async ({ page }) => {
+ await expect(page.locator('app-nav')).toBeVisible();
+
+ await expect(page.locator('ion-title')).toHaveText('Page One');
+ });
+
+ test('should navigate to page two', async ({ page }) => {
+ await page.locator('ion-content ion-button').click();
+ await expect(page.locator('ion-title').filter({ hasText: 'Page Two' })).toBeVisible();
+ });
+
+ test('should navigate to page three', async ({ page }) => {
+ await page.getByText('Go to Page Two').click();
+ await expect(page.locator('ion-title').filter({ hasText: 'Page Two' })).toBeVisible();
+
+ await page.getByText('Go to Page Three').click();
+ await expect(page.locator('ion-title').filter({ hasText: 'Page Three' })).toBeVisible();
+ });
+
+ test('should navigate back to page one', async ({ page }) => {
+ await page.getByText('Go to Page Two').click();
+ await expect(page.locator('ion-title').filter({ hasText: 'Page Two' })).toBeVisible();
- cy.contains('Page One');
+ // TODO: This should be a back button but it is not working
+ await page.locator('ion-toolbar ion-button').click();
+ await expect(page.locator('ion-title').filter({ hasText: 'Page One' })).toBeVisible();
});
-})
+});
diff --git a/packages/angular/test/base/e2e/src/standalone/overlay-controllers.spec.ts b/packages/angular/test/base/e2e/src/standalone/overlay-controllers.spec.ts
index 8988c37404c..cd3996b8c59 100644
--- a/packages/angular/test/base/e2e/src/standalone/overlay-controllers.spec.ts
+++ b/packages/angular/test/base/e2e/src/standalone/overlay-controllers.spec.ts
@@ -1,35 +1,37 @@
-describe('Overlay Controllers', () => {
- beforeEach(() => {
- cy.visit('/standalone/overlay-controllers');
+import { test, expect } from '@playwright/test';
+
+test.describe('Overlay Controllers', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/standalone/overlay-controllers');
});
- it('should present an alert', () => {
- cy.get('button#open-alert').click();
+ test('should present an alert', async ({ page }) => {
+ await page.locator('button#open-alert').click();
- cy.get('ion-alert').should('be.visible');
+ await expect(page.locator('ion-alert')).toBeVisible();
});
- it('should present a loading indicator', () => {
- cy.get('button#open-loading').click();
+ test('should present a loading indicator', async ({ page }) => {
+ await page.locator('button#open-loading').click();
- cy.get('ion-loading').should('be.visible');
+ await expect(page.locator('ion-loading')).toBeVisible();
});
- it('should present a modal', () => {
- cy.get('button#open-modal').click();
+ test('should present a modal', async ({ page }) => {
+ await page.locator('button#open-modal').click();
- cy.get('ion-modal app-dialog-content').should('be.visible');
+ await expect(page.locator('ion-modal app-dialog-content')).toBeVisible();
});
- it('should present a picker', () => {
- cy.get('button#open-picker').click();
+ test('should present a picker', async ({ page }) => {
+ await page.locator('button#open-picker').click();
- cy.get('ion-picker-legacy .picker-button').should('be.visible');
+ await expect(page.locator('ion-picker-legacy .picker-button')).toBeVisible();
});
- it('should present a popover', () => {
- cy.get('button#open-popover').click();
+ test('should present a popover', async ({ page }) => {
+ await page.locator('button#open-popover').click();
- cy.get('ion-popover app-dialog-content').should('be.visible');
+ await expect(page.locator('ion-popover app-dialog-content')).toBeVisible();
});
});
diff --git a/packages/angular/test/base/e2e/src/standalone/popover.spec.ts b/packages/angular/test/base/e2e/src/standalone/popover.spec.ts
index 65aad046424..0fcc3a03826 100644
--- a/packages/angular/test/base/e2e/src/standalone/popover.spec.ts
+++ b/packages/angular/test/base/e2e/src/standalone/popover.spec.ts
@@ -1,12 +1,14 @@
-describe('Popovers: Inline', () => {
- beforeEach(() => {
- cy.visit('/standalone/popover');
+import { test, expect } from '@playwright/test';
+
+test.describe('Popovers: Inline', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/standalone/popover');
});
- it('should render popover', () => {
- cy.get('button#open-popover').click();
+ test('should render popover', async ({ page }) => {
+ await page.locator('button#open-popover').click();
- cy.get('ion-popover').should('be.visible');
- cy.get('ion-popover #popover-content').should('exist');
+ await expect(page.locator('ion-popover')).toBeVisible();
+ await expect(page.locator('ion-popover #popover-content')).toBeVisible();
});
});
diff --git a/packages/angular/test/base/e2e/src/standalone/providers.spec.ts b/packages/angular/test/base/e2e/src/standalone/providers.spec.ts
index 71aca1c635c..ae02149c3be 100644
--- a/packages/angular/test/base/e2e/src/standalone/providers.spec.ts
+++ b/packages/angular/test/base/e2e/src/standalone/providers.spec.ts
@@ -1,11 +1,13 @@
-describe('Providers', () => {
- beforeEach(() => {
- cy.visit('/standalone/providers');
- })
+import { test, expect } from '@playwright/test';
- it('provideIonicAngular should initialize Ionic and set config correctly', () => {
- cy.ionPageVisible('app-providers');
+test.describe('Providers', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/standalone/providers');
+ });
+
+ test('provideIonicAngular should initialize Ionic and set config correctly', async ({ page }) => {
+ await expect(page.locator('app-providers')).toBeVisible();
- cy.get('#keyboard-height').should('have.text', '12345');
+ await expect(page.locator('#keyboard-height')).toHaveText('12345');
});
-})
+});
diff --git a/packages/angular/test/base/e2e/src/standalone/reorder-group.spec.ts b/packages/angular/test/base/e2e/src/standalone/reorder-group.spec.ts
new file mode 100644
index 00000000000..094d912d09a
--- /dev/null
+++ b/packages/angular/test/base/e2e/src/standalone/reorder-group.spec.ts
@@ -0,0 +1,25 @@
+import { expect } from '@playwright/test';
+import { test } from '@playwright/test';
+import { dragElementBy } from '../../utils/drag-utils';
+
+test.describe('reorder-group: angular standalone', () => {
+ test('should reorder the items', async ({ page }) => {
+ await page.goto('/standalone/reorder-group');
+
+ // Get initial order
+ const initialItems = await page.locator('ion-item').allTextContents();
+ expect(initialItems).toEqual(['Item 1', 'Item 2', 'Item 3']);
+
+ const reorderGroup = page.locator('ion-reorder-group');
+
+ // Drag the first item down to move it to the end (below Item 3)
+ await dragElementBy(reorderGroup.locator('ion-reorder').first(), page, 0, 300);
+
+ // Wait for the reorder to complete
+ await page.waitForTimeout(500);
+
+ // Verify the new order - Item 1 should now be at the end
+ const finalItems = await page.locator('ion-item').allTextContents();
+ expect(finalItems).toEqual(['Item 2', 'Item 3', 'Item 1']);
+ });
+});
diff --git a/packages/angular/test/base/e2e/src/standalone/router-link.spec.ts b/packages/angular/test/base/e2e/src/standalone/router-link.spec.ts
index 9550b4f1dc3..d1014aaeb33 100644
--- a/packages/angular/test/base/e2e/src/standalone/router-link.spec.ts
+++ b/packages/angular/test/base/e2e/src/standalone/router-link.spec.ts
@@ -1,25 +1,27 @@
-describe('RouterLink', () => {
- beforeEach(() => {
- cy.visit('/standalone/router-link');
+import { test, expect } from '@playwright/test';
+
+test.describe('RouterLink', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/standalone/router-link');
});
- it('should mount the root component', () => {
- cy.ionPageVisible('app-router-link');
+ test('should mount the root component', async ({ page }) => {
+ await expect(page.locator('app-router-link')).toBeVisible();
- cy.contains('I\'m a link');
+ await expect(page.locator('text=I\'m a link')).toBeVisible();
});
- it('should go to /standalone/popover using an anchor', () => {
+ test('should go to /standalone/popover using an anchor', async ({ page }) => {
// click on the anchor
- cy.get('a').contains('I\'m a link').click();
+ await page.locator('a').filter({ hasText: 'I\'m a link' }).click();
- cy.url().should('include', '/standalone/popover');
+ await expect(page).toHaveURL(/.*\/standalone\/popover/);
});
- it('should go to /standalone/popover using a button', () => {
- cy.get('button').contains('I\'m a button').click();
+ test('should go to /standalone/popover using a button', async ({ page }) => {
+ await page.locator('button').filter({ hasText: 'I\'m a button' }).click();
- cy.url().should('include', '/standalone/popover');
+ await expect(page).toHaveURL(/.*\/standalone\/popover/);
});
// Angular sets the `tabindex` to `"0"` on any element that uses
@@ -27,11 +29,11 @@ describe('RouterLink', () => {
// components that wrap an `a` or `button` element, so we are
// checking here that it is only removed from Ionic components.
// https://github.com/ionic-team/ionic-framework/issues/20632
- it('should have tabindex="0" with a native span', () => {
- cy.get('span').should('have.attr', 'tabindex', '0');
+ test('should have tabindex="0" with a native span', async ({ page }) => {
+ await expect(page.locator('span[routerlink]')).toHaveAttribute('tabindex', '0');
});
- it('should not have tabindex set with an ionic button', () => {
- cy.get('ion-button').should('not.have.attr', 'tabindex');
+ test('should not have tabindex set with an ionic button', async ({ page }) => {
+ await expect(page.locator('ion-button')).not.toHaveAttribute('tabindex');
});
});
diff --git a/packages/angular/test/base/e2e/src/standalone/router-outlet.spec.ts b/packages/angular/test/base/e2e/src/standalone/router-outlet.spec.ts
index 37beac46fc8..ab8aefb73d0 100644
--- a/packages/angular/test/base/e2e/src/standalone/router-outlet.spec.ts
+++ b/packages/angular/test/base/e2e/src/standalone/router-outlet.spec.ts
@@ -1,9 +1,11 @@
-describe('Router Outlet', () => {
- beforeEach(() => {
- cy.visit('/standalone/router-outlet');
- })
+import { test, expect } from '@playwright/test';
- it('should render a as a child page of the router outlet', () => {
- cy.ionPageVisible('ion-router-outlet app-router-outlet');
+test.describe('Router Outlet', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/standalone/router-outlet');
});
-})
+
+ test('should render a as a child page of the router outlet', async ({ page }) => {
+ await expect(page.locator('ion-router-outlet app-router-outlet')).toBeVisible();
+ });
+});
diff --git a/packages/angular/test/base/e2e/src/standalone/tabs.spec.ts b/packages/angular/test/base/e2e/src/standalone/tabs.spec.ts
index f1798cbdabf..49f253a673a 100644
--- a/packages/angular/test/base/e2e/src/standalone/tabs.spec.ts
+++ b/packages/angular/test/base/e2e/src/standalone/tabs.spec.ts
@@ -1,47 +1,49 @@
-describe('Tabs', () => {
- describe('Without IonRouterOutlet', () => {
- beforeEach(() => {
- cy.visit('/standalone/tabs');
+import { test, expect } from '@playwright/test';
+
+test.describe('Tabs', () => {
+ test.describe('Without IonRouterOutlet', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/standalone/tabs');
});
-
- it('should redirect to the default tab', () => {
- cy.get('app-tab-one').should('be.visible');
- cy.contains('Tab 1');
+
+ test('should redirect to the default tab', async ({ page }) => {
+ await expect(page.locator('app-tab-one')).toBeVisible();
+ await expect(page.locator('text=Tab 1')).toBeVisible();
});
-
- it('should render new content when switching tabs', () => {
- cy.get('#tab-button-tab-two').click();
- cy.get('app-tab-two').should('be.visible');
- cy.contains('Tab 2');
+
+ test('should render new content when switching tabs', async ({ page }) => {
+ await page.locator('#tab-button-tab-two').click();
+ await expect(page.locator('app-tab-two')).toBeVisible();
+ await expect(page.locator('text=Tab 2')).toBeVisible();
});
-
+
// Issue: https://github.com/ionic-team/ionic-framework/issues/28417
- it('parentOutlet should be defined', () => {
- cy.get('#parent-outlet span').should('have.text', 'true');
+ test('parentOutlet should be defined', async ({ page }) => {
+ await expect(page.locator('#parent-outlet span')).toHaveText('true');
});
});
- describe('Without IonRouterOutlet', () => {
- beforeEach(() => {
- cy.visit('/standalone/tabs-basic');
- })
+ test.describe('Without IonRouterOutlet', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/standalone/tabs-basic');
+ });
- it('should show correct tab when clicking the tab button', () => {
- cy.get('ion-tab[tab="tab1"]').should('be.visible');
- cy.get('ion-tab[tab="tab2"]').should('not.be.visible');
+ test('should show correct tab when clicking the tab button', async ({ page }) => {
+ await expect(page.locator('ion-tab[tab="tab1"]')).toBeVisible();
+ await expect(page.locator('ion-tab[tab="tab2"]')).not.toBeVisible();
- cy.get('ion-tab-button[tab="tab2"]').click();
+ await page.locator('ion-tab-button[tab="tab2"]').click();
- cy.get('ion-tab[tab="tab1"]').should('not.be.visible');
- cy.get('ion-tab[tab="tab2"]').should('be.visible');
+ await expect(page.locator('ion-tab[tab="tab1"]')).not.toBeVisible();
+ await expect(page.locator('ion-tab[tab="tab2"]')).toBeVisible();
});
- it('should not change the URL when clicking the tab button', () => {
- cy.url().should('include', '/tabs-basic');
+ test('should not change the URL when clicking the tab button', async ({ page }) => {
+ await expect(page).toHaveURL(/.*\/tabs-basic/);
- cy.get('ion-tab-button[tab="tab2"]').click();
+ await page.locator('ion-tab-button[tab="tab2"]').click();
- cy.url().should('include', '/tabs-basic');
+ await expect(page).toHaveURL(/.*\/tabs-basic/);
});
});
});
diff --git a/packages/angular/test/base/e2e/src/standalone/value-accessors.spec.ts b/packages/angular/test/base/e2e/src/standalone/value-accessors.spec.ts
index 470a565a3c7..44a85cadf14 100644
--- a/packages/angular/test/base/e2e/src/standalone/value-accessors.spec.ts
+++ b/packages/angular/test/base/e2e/src/standalone/value-accessors.spec.ts
@@ -1,224 +1,241 @@
-describe('Value Accessors', () => {
+import { test, expect } from '@playwright/test';
- describe('Checkbox', () => {
- beforeEach(() => cy.visit('/standalone/value-accessors/checkbox'));
+test.describe('Value Accessors', () => {
+ test.describe('Checkbox', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/standalone/value-accessors/checkbox');
+ });
- it('should update the form value', () => {
- cy.get('#formValue').should('have.text', JSON.stringify({ checkbox: false }, null, 2));
- cy.get('ion-checkbox').should('have.class', 'ion-pristine');
+ test('should update the form value', async ({ page }) => {
+ await expect(page.locator('#formValue')).toHaveText(JSON.stringify({ checkbox: false }, null, 2));
+ await expect(page.locator('ion-checkbox')).toHaveClass(/ion-pristine/);
- cy.get('ion-checkbox').click();
+ await page.locator('ion-checkbox').click();
- cy.get('#formValue').should('have.text', JSON.stringify({ checkbox: true }, null, 2));
- cy.get('ion-checkbox').should('have.class', 'ion-dirty');
- cy.get('ion-checkbox').should('have.class', 'ion-valid');
+ await expect(page.locator('#formValue')).toHaveText(JSON.stringify({ checkbox: true }, null, 2));
+ await expect(page.locator('ion-checkbox')).toHaveClass(/ion-dirty/);
+ await expect(page.locator('ion-checkbox')).toHaveClass(/ion-valid/);
});
});
- describe('Input', () => {
- beforeEach(() => cy.visit('/standalone/value-accessors/input'));
+ test.describe('Input', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/standalone/value-accessors/input');
+ });
- it('should update the form value', () => {
- cy.get('#formValue').should('have.text', JSON.stringify({
+ test('should update the form value', async ({ page }) => {
+ await expect(page.locator('#formValue')).toHaveText(JSON.stringify({
inputString: '',
inputNumber: ''
}, null, 2));
- cy.get('ion-input[formControlName="inputString"]').should('have.class', 'ion-pristine');
- cy.get('ion-input[formControlName="inputNumber"]').should('have.class', 'ion-pristine');
+ await expect(page.locator('ion-input[formControlName="inputString"]')).toHaveClass(/ion-pristine/);
+ await expect(page.locator('ion-input[formControlName="inputNumber"]')).toHaveClass(/ion-pristine/);
- cy.get('ion-input[formControlName="inputString"]').should('have.class', 'ion-invalid');
- cy.get('ion-input[formControlName="inputNumber"]').should('have.class', 'ion-invalid');
+ await expect(page.locator('ion-input[formControlName="inputString"]')).toHaveClass(/ion-invalid/);
+ await expect(page.locator('ion-input[formControlName="inputNumber"]')).toHaveClass(/ion-invalid/);
- cy.get('ion-input[formControlName="inputString"] input').type('test');
- cy.get('ion-input[formControlName="inputString"] input').blur();
+ await page.locator('ion-input[formControlName="inputString"] input').fill('test');
+ await page.locator('ion-input[formControlName="inputString"] input').blur();
- cy.get('ion-input[formControlName="inputNumber"] input').type(1);
- cy.get('ion-input[formControlName="inputNumber"] input').blur();
+ await page.locator('ion-input[formControlName="inputNumber"] input').fill('1');
+ await page.locator('ion-input[formControlName="inputNumber"] input').blur();
- cy.get('#formValue').should('have.text', JSON.stringify({
+ await expect(page.locator('#formValue')).toHaveText(JSON.stringify({
inputString: 'test',
inputNumber: 1
}, null, 2));
- cy.get('ion-input[formControlName="inputString"]').should('have.class', 'ion-dirty');
- cy.get('ion-input[formControlName="inputNumber"]').should('have.class', 'ion-dirty');
-
- cy.get('ion-input[formControlName="inputString"]').should('have.class', 'ion-valid');
- cy.get('ion-input[formControlName="inputNumber"]').should('have.class', 'ion-valid');
+ await expect(page.locator('ion-input[formControlName="inputString"]')).toHaveClass(/ion-dirty/);
+ await expect(page.locator('ion-input[formControlName="inputNumber"]')).toHaveClass(/ion-dirty/);
+ await expect(page.locator('ion-input[formControlName="inputString"]')).toHaveClass(/ion-valid/);
+ await expect(page.locator('ion-input[formControlName="inputNumber"]')).toHaveClass(/ion-valid/);
});
});
- describe('Radio Group', () => {
- beforeEach(() => cy.visit('/standalone/value-accessors/radio-group'));
+ test.describe('Radio Group', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/standalone/value-accessors/radio-group');
+ });
- it('should update the form value', () => {
- cy.get('#formValue').should('have.text', JSON.stringify({ radioGroup: '1' }, null, 2));
- cy.get('ion-radio-group').should('have.class', 'ion-pristine');
+ test('should update the form value', async ({ page }) => {
+ await expect(page.locator('#formValue')).toHaveText(JSON.stringify({ radioGroup: '1' }, null, 2));
+ await expect(page.locator('ion-radio-group')).toHaveClass(/ion-pristine/);
- cy.get('ion-radio').contains('Two').click();
+ await page.locator('ion-radio').filter({ hasText: 'Two' }).click();
- cy.get('#formValue').should('have.text', JSON.stringify({ radioGroup: '2' }, null, 2));
- cy.get('ion-radio-group').should('have.class', 'ion-dirty');
- cy.get('ion-radio-group').should('have.class', 'ion-valid');
+ await expect(page.locator('#formValue')).toHaveText(JSON.stringify({ radioGroup: '2' }, null, 2));
+ await expect(page.locator('ion-radio-group')).toHaveClass(/ion-dirty/);
+ await expect(page.locator('ion-radio-group')).toHaveClass(/ion-valid/);
});
});
- describe('Searchbar', () => {
- beforeEach(() => cy.visit('/standalone/value-accessors/searchbar'));
+ test.describe('Searchbar', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/standalone/value-accessors/searchbar');
+ });
- it('should update the form value', () => {
- cy.get('#formValue').should('have.text', JSON.stringify({ searchbar: '' }, null, 2));
- cy.get('ion-searchbar').should('have.class', 'ion-pristine');
- cy.get('ion-searchbar').should('have.class', 'ion-invalid');
+ test('should update the form value', async ({ page }) => {
+ await expect(page.locator('#formValue')).toHaveText(JSON.stringify({ searchbar: '' }, null, 2));
+ await expect(page.locator('ion-searchbar')).toHaveClass(/ion-pristine/);
+ await expect(page.locator('ion-searchbar')).toHaveClass(/ion-invalid/);
- cy.get('ion-searchbar').type('test');
- cy.get('ion-searchbar input').blur();
+ await page.locator('ion-searchbar input').fill('test');
+ await page.locator('ion-searchbar input').blur();
- cy.get('#formValue').should('have.text', JSON.stringify({ searchbar: 'test' }, null, 2));
- cy.get('ion-searchbar').should('have.class', 'ion-dirty');
- cy.get('ion-searchbar').should('have.class', 'ion-valid');
+ await expect(page.locator('#formValue')).toHaveText(JSON.stringify({ searchbar: 'test' }, null, 2));
+ await expect(page.locator('ion-searchbar')).toHaveClass(/ion-dirty/);
+ await expect(page.locator('ion-searchbar')).toHaveClass(/ion-valid/);
});
});
- describe('Segment', () => {
- beforeEach(() => cy.visit('/standalone/value-accessors/segment'));
+ test.describe('Segment', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/standalone/value-accessors/segment');
+ });
- it('should update the form value', () => {
- cy.get('#formValue').should('have.text', JSON.stringify({ segment: 'Paid' }, null, 2));
- cy.get('ion-segment').should('have.class', 'ion-pristine');
+ test('should update the form value', async ({ page }) => {
+ await expect(page.locator('#formValue')).toHaveText(JSON.stringify({ segment: 'Paid' }, null, 2));
+ await expect(page.locator('ion-segment')).toHaveClass(/ion-pristine/);
- cy.get('ion-segment-button').eq(1).click();
+ await page.locator('ion-segment-button').nth(1).click();
- cy.get('#formValue').should('have.text', JSON.stringify({ segment: 'Free' }, null, 2));
- cy.get('ion-segment').should('have.class', 'ion-dirty');
- cy.get('ion-segment').should('have.class', 'ion-valid');
+ await expect(page.locator('#formValue')).toHaveText(JSON.stringify({ segment: 'Free' }, null, 2));
+ await expect(page.locator('ion-segment')).toHaveClass(/ion-dirty/);
+ await expect(page.locator('ion-segment')).toHaveClass(/ion-valid/);
});
});
- describe('Select', () => {
- beforeEach(() => cy.visit('/standalone/value-accessors/select'));
+ test.describe('Select', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/standalone/value-accessors/select');
+ });
- it('should update the form value', () => {
- cy.get('#formValue').should('have.text', JSON.stringify({ select: 'bananas' }, null, 2));
- cy.get('ion-select').should('have.class', 'ion-pristine');
+ test('should update the form value', async ({ page }) => {
+ await expect(page.locator('#formValue')).toHaveText(JSON.stringify({ select: 'bananas' }, null, 2));
+ await expect(page.locator('ion-select')).toHaveClass(/ion-pristine/);
- cy.get('ion-select').click();
- cy.get('ion-popover').should('be.visible');
+ await page.locator('ion-select').click();
+ await expect(page.locator('ion-popover')).toBeVisible();
- cy.get('ion-popover ion-radio-group ion-radio').first().click();
+ await page.locator('ion-popover ion-radio-group ion-radio').first().click();
- cy.get('#formValue').should('have.text', JSON.stringify({ select: 'apples' }, null, 2));
- cy.get('ion-select').should('have.class', 'ion-dirty');
- cy.get('ion-select').should('have.class', 'ion-valid');
+ await expect(page.locator('#formValue')).toHaveText(JSON.stringify({ select: 'apples' }, null, 2));
+ await expect(page.locator('ion-select')).toHaveClass(/ion-dirty/);
+ await expect(page.locator('ion-select')).toHaveClass(/ion-valid/);
});
});
- describe('Textarea', () => {
- beforeEach(() => cy.visit('/standalone/value-accessors/textarea'));
+ test.describe('Textarea', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/standalone/value-accessors/textarea');
+ });
- it('should update the form value', () => {
- cy.get('#formValue').should('have.text', JSON.stringify({ textarea: '' }, null, 2));
- cy.get('ion-textarea').should('have.class', 'ion-pristine');
- cy.get('ion-textarea').should('have.class', 'ion-invalid');
+ test('should update the form value', async ({ page }) => {
+ await expect(page.locator('#formValue')).toHaveText(JSON.stringify({ textarea: '' }, null, 2));
+ await expect(page.locator('ion-textarea')).toHaveClass(/ion-pristine/);
+ await expect(page.locator('ion-textarea')).toHaveClass(/ion-invalid/);
- cy.get('ion-textarea').click();
- cy.get('ion-textarea').type('test');
+ await page.locator('ion-textarea').click();
+ await page.locator('ion-textarea textarea').fill('test');
- cy.get('#formValue').should('have.text', JSON.stringify({ textarea: 'test' }, null, 2));
- cy.get('ion-textarea').should('have.class', 'ion-dirty');
- cy.get('ion-textarea').should('have.class', 'ion-valid');
+ await expect(page.locator('#formValue')).toHaveText(JSON.stringify({ textarea: 'test' }, null, 2));
+ await expect(page.locator('ion-textarea')).toHaveClass(/ion-dirty/);
+ await expect(page.locator('ion-textarea')).toHaveClass(/ion-valid/);
});
});
- describe('Toggle', () => {
- beforeEach(() => cy.visit('/standalone/value-accessors/toggle'));
+ test.describe('Toggle', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/standalone/value-accessors/toggle');
+ });
- it('should update the form value', () => {
- cy.get('#formValue').should('have.text', JSON.stringify({ toggle: false }, null, 2));
- cy.get('ion-toggle').should('have.class', 'ion-pristine');
+ test('should update the form value', async ({ page }) => {
+ await expect(page.locator('#formValue')).toHaveText(JSON.stringify({ toggle: false }, null, 2));
+ await expect(page.locator('ion-toggle')).toHaveClass(/ion-pristine/);
- cy.get('ion-toggle').click();
+ await page.locator('ion-toggle').click();
- cy.get('#formValue').should('have.text', JSON.stringify({ toggle: true }, null, 2));
- cy.get('ion-toggle').should('have.class', 'ion-dirty');
- cy.get('ion-toggle').should('have.class', 'ion-valid');
+ await expect(page.locator('#formValue')).toHaveText(JSON.stringify({ toggle: true }, null, 2));
+ await expect(page.locator('ion-toggle')).toHaveClass(/ion-dirty/);
+ await expect(page.locator('ion-toggle')).toHaveClass(/ion-valid/);
});
});
- describe('Input OTP', () => {
- beforeEach(() => cy.visit('/standalone/value-accessors/input-otp'));
+ test.describe('Input OTP', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/standalone/value-accessors/input-otp');
+ });
- it('should update the form value', () => {
- cy.get('#formValue').should('have.text', JSON.stringify({
+ test('should update the form value', async ({ page }) => {
+ await expect(page.locator('#formValue')).toHaveText(JSON.stringify({
inputOtpString: '',
inputOtpNumber: ''
}, null, 2));
- cy.get('ion-input-otp[formControlName="inputOtpString"]').should('have.class', 'ion-pristine');
- cy.get('ion-input-otp[formControlName="inputOtpNumber"]').should('have.class', 'ion-pristine');
+ await expect(page.locator('ion-input-otp[formControlName="inputOtpString"]')).toHaveClass(/ion-pristine/);
+ await expect(page.locator('ion-input-otp[formControlName="inputOtpNumber"]')).toHaveClass(/ion-pristine/);
- cy.get('ion-input-otp[formControlName="inputOtpString"]').should('have.class', 'ion-invalid');
- cy.get('ion-input-otp[formControlName="inputOtpNumber"]').should('have.class', 'ion-invalid');
+ await expect(page.locator('ion-input-otp[formControlName="inputOtpString"]')).toHaveClass(/ion-invalid/);
+ await expect(page.locator('ion-input-otp[formControlName="inputOtpNumber"]')).toHaveClass(/ion-invalid/);
// Type into the string OTP input
- cy.get('ion-input-otp[formControlName="inputOtpString"] input').eq(0).type('a');
- cy.get('ion-input-otp[formControlName="inputOtpString"] input').eq(1).type('b');
- cy.get('ion-input-otp[formControlName="inputOtpString"] input').eq(2).type('c');
- cy.get('ion-input-otp[formControlName="inputOtpString"] input').eq(3).type('d');
- cy.get('ion-input-otp[formControlName="inputOtpString"] input').eq(3).blur();
+ await page.locator('ion-input-otp[formControlName="inputOtpString"] input').nth(0).fill('a');
+ await page.locator('ion-input-otp[formControlName="inputOtpString"] input').nth(1).fill('b');
+ await page.locator('ion-input-otp[formControlName="inputOtpString"] input').nth(2).fill('c');
+ await page.locator('ion-input-otp[formControlName="inputOtpString"] input').nth(3).fill('d');
+ await page.locator('ion-input-otp[formControlName="inputOtpString"] input').nth(3).blur();
// Type into the number OTP input
- cy.get('ion-input-otp[formControlName="inputOtpNumber"] input').eq(0).type('1');
- cy.get('ion-input-otp[formControlName="inputOtpNumber"] input').eq(1).type('2');
- cy.get('ion-input-otp[formControlName="inputOtpNumber"] input').eq(2).type('3');
- cy.get('ion-input-otp[formControlName="inputOtpNumber"] input').eq(3).type('4');
- cy.get('ion-input-otp[formControlName="inputOtpNumber"] input').eq(3).blur();
+ await page.locator('ion-input-otp[formControlName="inputOtpNumber"] input').nth(0).fill('1');
+ await page.locator('ion-input-otp[formControlName="inputOtpNumber"] input').nth(1).fill('2');
+ await page.locator('ion-input-otp[formControlName="inputOtpNumber"] input').nth(2).fill('3');
+ await page.locator('ion-input-otp[formControlName="inputOtpNumber"] input').nth(3).fill('4');
+ await page.locator('ion-input-otp[formControlName="inputOtpNumber"] input').nth(3).blur();
- cy.get('#formValue').should('have.text', JSON.stringify({
+ await expect(page.locator('#formValue')).toHaveText(JSON.stringify({
inputOtpString: 'abcd',
inputOtpNumber: 1234
}, null, 2));
- cy.get('ion-input-otp[formControlName="inputOtpString"]').should('have.class', 'ion-dirty');
- cy.get('ion-input-otp[formControlName="inputOtpNumber"]').should('have.class', 'ion-dirty');
+ await expect(page.locator('ion-input-otp[formControlName="inputOtpString"]')).toHaveClass(/ion-dirty/);
+ await expect(page.locator('ion-input-otp[formControlName="inputOtpNumber"]')).toHaveClass(/ion-dirty/);
- cy.get('ion-input-otp[formControlName="inputOtpString"]').should('have.class', 'ion-valid');
- cy.get('ion-input-otp[formControlName="inputOtpNumber"]').should('have.class', 'ion-valid');
+ await expect(page.locator('ion-input-otp[formControlName="inputOtpString"]')).toHaveClass(/ion-valid/);
+ await expect(page.locator('ion-input-otp[formControlName="inputOtpNumber"]')).toHaveClass(/ion-valid/);
});
- it('should remain invalid when partially filled', () => {
- cy.get('#formValue').should('have.text', JSON.stringify({
+ test('should remain invalid when partially filled', async ({ page }) => {
+ await expect(page.locator('#formValue')).toHaveText(JSON.stringify({
inputOtpString: '',
inputOtpNumber: ''
}, null, 2));
- cy.get('ion-input-otp[formControlName="inputOtpString"]').should('have.class', 'ion-pristine');
- cy.get('ion-input-otp[formControlName="inputOtpNumber"]').should('have.class', 'ion-pristine');
+ await expect(page.locator('ion-input-otp[formControlName="inputOtpString"]')).toHaveClass(/ion-pristine/);
+ await expect(page.locator('ion-input-otp[formControlName="inputOtpNumber"]')).toHaveClass(/ion-pristine/);
- cy.get('ion-input-otp[formControlName="inputOtpString"]').should('have.class', 'ion-invalid');
- cy.get('ion-input-otp[formControlName="inputOtpNumber"]').should('have.class', 'ion-invalid');
+ await expect(page.locator('ion-input-otp[formControlName="inputOtpString"]')).toHaveClass(/ion-invalid/);
+ await expect(page.locator('ion-input-otp[formControlName="inputOtpNumber"]')).toHaveClass(/ion-invalid/);
// Type only 2 characters into the string OTP input
- cy.get('ion-input-otp[formControlName="inputOtpString"] input').eq(0).type('a');
- cy.get('ion-input-otp[formControlName="inputOtpString"] input').eq(1).type('b');
- cy.get('ion-input-otp[formControlName="inputOtpString"] input').eq(2).blur();
+ await page.locator('ion-input-otp[formControlName="inputOtpString"] input').nth(0).fill('a');
+ await page.locator('ion-input-otp[formControlName="inputOtpString"] input').nth(1).fill('b');
+ await page.locator('ion-input-otp[formControlName="inputOtpString"] input').nth(2).blur();
// Type only 2 characters into the number OTP input
- cy.get('ion-input-otp[formControlName="inputOtpNumber"] input').eq(0).type('1');
- cy.get('ion-input-otp[formControlName="inputOtpNumber"] input').eq(1).type('2');
- cy.get('ion-input-otp[formControlName="inputOtpNumber"] input').eq(2).blur();
+ await page.locator('ion-input-otp[formControlName="inputOtpNumber"] input').nth(0).fill('1');
+ await page.locator('ion-input-otp[formControlName="inputOtpNumber"] input').nth(1).fill('2');
+ await page.locator('ion-input-otp[formControlName="inputOtpNumber"] input').nth(2).blur();
- cy.get('#formValue').should('have.text', JSON.stringify({
+ await expect(page.locator('#formValue')).toHaveText(JSON.stringify({
inputOtpString: 'ab',
inputOtpNumber: 12
}, null, 2));
- cy.get('ion-input-otp[formControlName="inputOtpString"]').should('have.class', 'ion-dirty');
- cy.get('ion-input-otp[formControlName="inputOtpNumber"]').should('have.class', 'ion-dirty');
+ await expect(page.locator('ion-input-otp[formControlName="inputOtpString"]')).toHaveClass(/ion-dirty/);
+ await expect(page.locator('ion-input-otp[formControlName="inputOtpNumber"]')).toHaveClass(/ion-dirty/);
// Verify both inputs remain invalid when partially filled
- cy.get('ion-input-otp[formControlName="inputOtpString"]').should('have.class', 'ion-invalid');
- cy.get('ion-input-otp[formControlName="inputOtpNumber"]').should('have.class', 'ion-invalid');
+ await expect(page.locator('ion-input-otp[formControlName="inputOtpString"]')).toHaveClass(/ion-invalid/);
+ await expect(page.locator('ion-input-otp[formControlName="inputOtpNumber"]')).toHaveClass(/ion-invalid/);
});
});
-
});
diff --git a/packages/angular/test/base/e2e/tsconfig.json b/packages/angular/test/base/e2e/tsconfig.json
deleted file mode 100644
index 42bc6d45bca..00000000000
--- a/packages/angular/test/base/e2e/tsconfig.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "extends": "../tsconfig.json",
- "compilerOptions": {
- "outDir": "../out-tsc/e2e",
- "module": "commonjs",
- "target": "ES2022",
- "types": ["cypress", "node"]
- },
- "include": [
- "../cypress/**/*.ts",
- "../cypress/support/**/*.ts"
- ]
-}
diff --git a/packages/angular/test/base/e2e/utils/drag-utils.ts b/packages/angular/test/base/e2e/utils/drag-utils.ts
new file mode 100644
index 00000000000..489847cd773
--- /dev/null
+++ b/packages/angular/test/base/e2e/utils/drag-utils.ts
@@ -0,0 +1,39 @@
+import type { Locator, Page } from '@playwright/test';
+
+// Drag an element by a given amount of pixels
+export const dragElementBy = async (
+ element: Locator,
+ page: Page,
+ dragByX = 0,
+ dragByY = 0
+) => {
+ const boundingBox = await element.boundingBox();
+ if (!boundingBox) {
+ throw new Error('Element not visible');
+ }
+
+ const startX = boundingBox.x + boundingBox.width / 2;
+ const startY = boundingBox.y + boundingBox.height / 2;
+ const endX = startX + dragByX;
+ const endY = startY + dragByY;
+
+ await page.mouse.move(startX, startY);
+ await page.mouse.down();
+ await page.mouse.move(endX, endY);
+ await page.mouse.up();
+};
+
+// Simulate swipe gesture for going back
+export const ionSwipeToGoBack = async (page: Page, shouldGoBack = false) => {
+ const viewport = page.viewportSize();
+ if (!viewport) return;
+
+ const startX = 50;
+ const endX = shouldGoBack ? viewport.width - 50 : 50;
+ const y = viewport.height / 2;
+
+ await page.mouse.move(startX, y);
+ await page.mouse.down();
+ await page.mouse.move(endX, y);
+ await page.mouse.up();
+}
diff --git a/packages/angular/test/base/e2e/utils/test-utils.ts b/packages/angular/test/base/e2e/utils/test-utils.ts
new file mode 100644
index 00000000000..3a023b8a2ef
--- /dev/null
+++ b/packages/angular/test/base/e2e/utils/test-utils.ts
@@ -0,0 +1,161 @@
+import { expect, type Page, type Locator } from '@playwright/test';
+
+export async function testStack(page: Page, selector: string, expectedStack: string[]) {
+ const elements = page.locator(`${selector} > *`);
+ const count = await elements.count();
+
+ // Get the actual stack (tag names of child elements), filtering out non-components
+ const actualStack: string[] = [];
+ for (let i = 0; i < count; i++) {
+ const tagName = await elements.nth(i).evaluate(el => el.tagName.toLowerCase());
+ // Filter out non-component elements like 'slot', 'div', etc.
+ if (tagName.includes('-') || tagName.startsWith('app-') || tagName.startsWith('ion-')) {
+ actualStack.push(tagName);
+ }
+ }
+
+ // Compare the actual stack with the expected stack
+ expect(actualStack).toEqual(expectedStack);
+}
+
+export async function testLifeCycle(page: Page, selector: string, expectedCounts: Record) {
+ await expect(page.locator(`${selector} #ngOnInit`)).toHaveText('1');
+ await expect(page.locator(`${selector} #ionViewWillEnter`)).toHaveText(expectedCounts.ionViewWillEnter.toString());
+ await expect(page.locator(`${selector} #ionViewDidEnter`)).toHaveText(expectedCounts.ionViewDidEnter.toString());
+ await expect(page.locator(`${selector} #ionViewWillLeave`)).toHaveText(expectedCounts.ionViewWillLeave.toString());
+ await expect(page.locator(`${selector} #ionViewDidLeave`)).toHaveText(expectedCounts.ionViewDidLeave.toString());
+}
+
+export async function ionPageVisible(page: Page, selector: string) {
+ await expect(page.locator(selector)).toBeVisible();
+ await expect(page.locator(selector)).toHaveClass(/ion-page/);
+ await expect(page.locator(selector)).not.toHaveClass(/ion-page-hidden/);
+ await expect(page.locator(selector)).not.toHaveClass(/ion-page-invisible/);
+ await expect(page.locator(selector)).not.toHaveAttribute('aria-hidden', 'true');
+}
+
+export async function ionPageHidden(page: Page, selector: string) {
+ await expect(page.locator(selector)).toHaveClass(/ion-page-hidden/);
+ await expect(page.locator(selector)).toHaveAttribute('aria-hidden', 'true');
+}
+
+export async function ionPageDoesNotExist(page: Page, selector: string) {
+ await expect(page.locator(selector)).toHaveCount(0);
+}
+
+export async function ionTabClick(page: Page, tabName: string) {
+ await page.locator(`ion-tab-button`).filter({ hasText: tabName }).click();
+}
+
+export async function testTabTitle(page: Page, title: string) {
+ const tab = await getSelectedTab(page);
+ await expect(tab.locator('ion-title')).toHaveText(title);
+ return getSelectedTab(page);
+}
+
+export async function getSelectedTab(page: Page): Promise {
+ // Wait for tab navigation to stabilize
+ await page.waitForTimeout(200);
+
+ // Look for tabs that are visible and have content
+ const tabs = page.locator('ion-tabs ion-router-outlet > *:not(.ion-page-hidden)');
+ const count = await tabs.count();
+
+ // If there's only one tab, return it
+ if (count === 1) {
+ return tabs.first();
+ }
+
+ // If there are multiple tabs, find the one that's actually visible and has content
+ for (let i = 0; i < count; i++) {
+ const tab = tabs.nth(i);
+ const isVisible = await tab.isVisible();
+ if (isVisible) {
+ return tab;
+ }
+ }
+
+ // Fallback to the first tab if none are explicitly visible
+ return tabs.first();
+}
+
+export async function testState(page: Page, count: number, tab: string) {
+
+ await expect(page.locator('#tabs-state')).toHaveText(`${count}.${tab}`);
+}
+
+export async function testUrlContains(page: Page, urlFragment: string) {
+ // Escape special regex characters in the URL fragment
+ const escapedFragment = urlFragment.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
+ await expect(page).toHaveURL(new RegExp(escapedFragment));
+}
+
+export async function testUrlEquals(page: Page, url: string) {
+ await expect(page).toHaveURL(url);
+}
+
+export async function testForward(page: Page) {
+ // Wait for navigation to complete
+ await page.waitForTimeout(100);
+
+ await testStack(page, 'ion-router-outlet', ['app-router-link', 'app-router-link-page']);
+ await testLifeCycle(page, 'app-router-link-page', {
+ ionViewWillEnter: 1,
+ ionViewDidEnter: 1,
+ ionViewWillLeave: 0,
+ ionViewDidLeave: 0,
+ });
+ await expect(page.locator('app-router-link-page #canGoBack')).toHaveText('true');
+
+ await page.goBack();
+ await page.waitForTimeout(100);
+ await testStack(page, 'ion-router-outlet', ['app-router-link']);
+ await testLifeCycle(page, 'app-router-link', {
+ ionViewWillEnter: 2,
+ ionViewDidEnter: 2,
+ ionViewWillLeave: 1,
+ ionViewDidLeave: 1,
+ });
+}
+
+export async function testRoot(page: Page) {
+ await testStack(page, 'ion-router-outlet', ['app-router-link-page']);
+ await testLifeCycle(page, 'app-router-link-page', {
+ ionViewWillEnter: 1,
+ ionViewDidEnter: 1,
+ ionViewWillLeave: 0,
+ ionViewDidLeave: 0,
+ });
+ await expect(page.locator('app-router-link-page #canGoBack')).toHaveText('false');
+
+ await page.goBack();
+ await page.waitForTimeout(100);
+ await testStack(page, 'ion-router-outlet', ['app-router-link']);
+ await testLifeCycle(page, 'app-router-link', {
+ ionViewWillEnter: 1,
+ ionViewDidEnter: 1,
+ ionViewWillLeave: 0,
+ ionViewDidLeave: 0,
+ });
+}
+
+export async function testBack(page: Page) {
+ await testStack(page, 'ion-router-outlet', ['app-router-link-page']);
+ await testLifeCycle(page, 'app-router-link-page', {
+ ionViewWillEnter: 1,
+ ionViewDidEnter: 1,
+ ionViewWillLeave: 0,
+ ionViewDidLeave: 0,
+ });
+ await expect(page.locator('app-router-link-page #canGoBack')).toHaveText('false');
+
+ await page.goBack();
+ await page.waitForTimeout(100);
+ await testStack(page, 'ion-router-outlet', ['app-router-link']);
+ await testLifeCycle(page, 'app-router-link', {
+ ionViewWillEnter: 1,
+ ionViewDidEnter: 1,
+ ionViewWillLeave: 0,
+ ionViewDidLeave: 0,
+ });
+}
diff --git a/packages/angular/test/base/playwright.config.ts b/packages/angular/test/base/playwright.config.ts
new file mode 100644
index 00000000000..632277077d5
--- /dev/null
+++ b/packages/angular/test/base/playwright.config.ts
@@ -0,0 +1,25 @@
+import { defineConfig, devices } from '@playwright/test';
+
+export default defineConfig({
+ testDir: './e2e',
+ fullyParallel: true,
+ forbidOnly: !!process.env['CI'],
+ retries: process.env['CI'] ? 2 : 0,
+ workers: process.env['CI'] ? 1 : undefined,
+ reporter: 'html',
+ use: {
+ baseURL: 'http://localhost:4200',
+ trace: 'on-first-retry',
+ },
+ projects: [
+ {
+ name: 'chromium',
+ use: { ...devices['Desktop Chrome'] },
+ },
+ ],
+ webServer: {
+ command: 'npm start -- --configuration test --disable-host-check',
+ url: 'http://localhost:4200',
+ reuseExistingServer: !process.env['CI'],
+ },
+});
diff --git a/packages/angular/test/base/src/app/lazy/providers/providers.component.ts b/packages/angular/test/base/src/app/lazy/providers/providers.component.ts
index 3b6e829dd75..f576419fc89 100644
--- a/packages/angular/test/base/src/app/lazy/providers/providers.component.ts
+++ b/packages/angular/test/base/src/app/lazy/providers/providers.component.ts
@@ -87,7 +87,7 @@ export class ProvidersComponent {
});
const firstQuery = platform.getQueryParam('firstParam');
const secondQuery = platform.getQueryParam('secondParam');
- this.queryParams = `firstParam: ${firstQuery}, firstParam: ${secondQuery}`;
+ this.queryParams = `firstParam: ${firstQuery}, secondParam: ${secondQuery}`;
this.isDesktop = platform.is('desktop');
this.isMobile = platform.is('mobile');
diff --git a/packages/angular/test/base/src/app/standalone/app-standalone/app.routes.ts b/packages/angular/test/base/src/app/standalone/app-standalone/app.routes.ts
index 8b267987ebd..ae6ee66193c 100644
--- a/packages/angular/test/base/src/app/standalone/app-standalone/app.routes.ts
+++ b/packages/angular/test/base/src/app/standalone/app-standalone/app.routes.ts
@@ -19,6 +19,7 @@ export const routes: Routes = [
{ path: 'providers', loadComponent: () => import('../providers/providers.component').then(c => c.ProvidersComponent) },
{ path: 'overlay-controllers', loadComponent: () => import('../overlay-controllers/overlay-controllers.component').then(c => c.OverlayControllersComponent) },
{ path: 'button', loadComponent: () => import('../button/button.component').then(c => c.ButtonComponent) },
+ { path: 'reorder-group', loadComponent: () => import('../reorder-group/reorder-group.component').then(c => c.ReorderGroupComponent) },
{ path: 'icon', loadComponent: () => import('../icon/icon.component').then(c => c.IconComponent) },
{ path: 'split-pane', redirectTo: '/standalone/split-pane/inbox', pathMatch: 'full' },
{
diff --git a/packages/angular/test/base/src/app/standalone/home-page/home-page.component.html b/packages/angular/test/base/src/app/standalone/home-page/home-page.component.html
index cc99a1439da..163e438d42c 100644
--- a/packages/angular/test/base/src/app/standalone/home-page/home-page.component.html
+++ b/packages/angular/test/base/src/app/standalone/home-page/home-page.component.html
@@ -28,6 +28,11 @@
Icon Test
+
+
+ Reorder Group Test
+
+
diff --git a/packages/angular/test/base/src/app/standalone/nav/nav.component.ts b/packages/angular/test/base/src/app/standalone/nav/nav.component.ts
index b969f7683c2..597452ef755 100644
--- a/packages/angular/test/base/src/app/standalone/nav/nav.component.ts
+++ b/packages/angular/test/base/src/app/standalone/nav/nav.component.ts
@@ -1,6 +1,5 @@
import { Component } from '@angular/core';
import { IonNav } from '@ionic/angular/standalone';
-import { AngularDelegate } from '@ionic/angular/common';
import { PageOneComponent } from './page-one.component';
diff --git a/packages/angular/test/base/src/app/standalone/nav/page-one.component.ts b/packages/angular/test/base/src/app/standalone/nav/page-one.component.ts
index aa90f9b5b98..ee21f0e147c 100644
--- a/packages/angular/test/base/src/app/standalone/nav/page-one.component.ts
+++ b/packages/angular/test/base/src/app/standalone/nav/page-one.component.ts
@@ -1,21 +1,28 @@
-/**
- * TODO: Update the template to use `ion-nav-link` once it's implemented
- * as a standalone component.
- *
- * It is recommended to also wait for the following components to be implemented
- * as standalone components:
- * `ion-header`, `ion-toolbar`, `ion-title`, `ion-content`,
- * `ion-button`, `ion-buttons`, `ion-back-button`
- */
-
import { Component } from '@angular/core';
+import { IonBackButton, IonButton, IonButtons, IonContent, IonHeader, IonNavLink, IonToolbar, IonTitle } from '@ionic/angular/standalone';
+import { PageTwoComponent } from './page-two.component';
@Component({
selector: 'app-page-one',
template: `
-
+
+
+
+
+
+ Page One
+
+
+
+ Page One
+
+ Go to Page Two
+
+
`,
+ standalone: true,
+ imports: [IonBackButton, IonButton, IonButtons, IonContent, IonHeader, IonNavLink, IonToolbar, IonTitle],
})
-export class PageOneComponent {}
+export class PageOneComponent {
+ component = PageTwoComponent;
+}
diff --git a/packages/angular/test/base/src/app/standalone/nav/page-three.component.ts b/packages/angular/test/base/src/app/standalone/nav/page-three.component.ts
new file mode 100644
index 00000000000..99dd76e75de
--- /dev/null
+++ b/packages/angular/test/base/src/app/standalone/nav/page-three.component.ts
@@ -0,0 +1,37 @@
+import { Component } from '@angular/core';
+import { IonButton, IonButtons, IonContent, IonHeader, IonTitle, IonToolbar } from '@ionic/angular/standalone';
+
+@Component({
+ selector: 'app-page-one',
+ template: `
+
+
+
+
+ Back
+
+
+ Page Three
+
+
+
+ Page Three
+
+ `,
+ standalone: true,
+ imports: [IonButton, IonButtons, IonContent, IonHeader, IonTitle, IonToolbar],
+})
+export class PageThreeComponent {
+ // TODO: This is a workaround to have a working back button.
+ // For some reason the back button is not working in this test,
+ // possibly because the nav is nested in a router-outlet.
+ async goBack() {
+ const nav = document.querySelector('ion-nav');
+ if (nav) {
+ const canGoBack = await nav.canGoBack();
+ if (canGoBack) {
+ await nav.pop();
+ }
+ }
+ }
+}
diff --git a/packages/angular/test/base/src/app/standalone/nav/page-two.component.ts b/packages/angular/test/base/src/app/standalone/nav/page-two.component.ts
new file mode 100644
index 00000000000..1b915b8d4e9
--- /dev/null
+++ b/packages/angular/test/base/src/app/standalone/nav/page-two.component.ts
@@ -0,0 +1,43 @@
+import { Component } from '@angular/core';
+import { IonButton, IonButtons, IonContent, IonHeader, IonNavLink, IonToolbar, IonTitle } from '@ionic/angular/standalone';
+import { PageThreeComponent } from './page-three.component';
+
+@Component({
+ selector: 'app-page-two',
+ template: `
+
+
+
+
+ Back
+
+
+ Page Two
+
+
+
+ Page Two
+
+ Go to Page Three
+
+
+ `,
+ standalone: true,
+ imports: [IonButton, IonButtons, IonHeader, IonNavLink, IonToolbar, IonTitle, IonContent],
+})
+export class PageTwoComponent {
+ component = PageThreeComponent;
+
+ // TODO: This is a workaround to have a working back button.
+ // For some reason the back button is not working in this test,
+ // possibly because the nav is nested in a router-outlet.
+ async goBack() {
+ const nav = document.querySelector('ion-nav');
+ if (nav) {
+ const canGoBack = await nav.canGoBack();
+ if (canGoBack) {
+ await nav.pop();
+ }
+ }
+ }
+}
diff --git a/packages/angular/test/base/src/app/standalone/programmatic-modal/modal/modal.component.ts b/packages/angular/test/base/src/app/standalone/programmatic-modal/modal/modal.component.ts
index 8fef9eb9213..ab4e715156e 100644
--- a/packages/angular/test/base/src/app/standalone/programmatic-modal/modal/modal.component.ts
+++ b/packages/angular/test/base/src/app/standalone/programmatic-modal/modal/modal.component.ts
@@ -1,10 +1,8 @@
import { Component } from '@angular/core';
-import { IonButton } from "@ionic/angular/standalone";
@Component({
selector: 'app-modal',
templateUrl: './modal.component.html',
- imports: [IonButton],
standalone: true,
})
export class ModalComponent {
diff --git a/packages/angular/test/base/src/app/standalone/reorder-group/reorder-group.component.ts b/packages/angular/test/base/src/app/standalone/reorder-group/reorder-group.component.ts
new file mode 100644
index 00000000000..528ee343022
--- /dev/null
+++ b/packages/angular/test/base/src/app/standalone/reorder-group/reorder-group.component.ts
@@ -0,0 +1,36 @@
+import { Component } from "@angular/core";
+import { IonItem, IonLabel, IonReorder, IonReorderGroup } from '@ionic/angular/standalone';
+import { ReorderEndCustomEvent } from "@ionic/angular";
+
+@Component({
+ selector: 'app-reorder-group',
+ template: `
+
+
+
+ Item 1
+
+
+
+ Item 2
+
+
+
+ Item 3
+
+
+ `,
+ standalone: true,
+ imports: [IonItem, IonLabel, IonReorder, IonReorderGroup]
+})
+export class ReorderGroupComponent {
+ onReorderEnd(event: ReorderEndCustomEvent) {
+ if (event.detail.from !== event.detail.to) {
+ console.log('ionReorderEnd: Dragged from index', event.detail.from, 'to', event.detail.to);
+ } else {
+ console.log('ionReorderEnd: No position change occurred');
+ }
+
+ event.detail.complete();
+ }
+}
diff --git a/packages/docs/CHANGELOG.md b/packages/docs/CHANGELOG.md
index 925dbca4309..ad46062a629 100644
--- a/packages/docs/CHANGELOG.md
+++ b/packages/docs/CHANGELOG.md
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [8.7.2](https://github.com/ionic-team/ionic-framework/compare/v8.7.1...v8.7.2) (2025-08-06)
+
+**Note:** Version bump only for package @ionic/docs
+
+
+
+
+
## [8.7.1](https://github.com/ionic-team/ionic-framework/compare/v8.7.0...v8.7.1) (2025-07-31)
**Note:** Version bump only for package @ionic/docs
diff --git a/packages/docs/package-lock.json b/packages/docs/package-lock.json
index c937fbf7f11..873b20f1a93 100644
--- a/packages/docs/package-lock.json
+++ b/packages/docs/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "@ionic/docs",
- "version": "8.7.1",
+ "version": "8.7.2",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@ionic/docs",
- "version": "8.7.1",
+ "version": "8.7.2",
"license": "MIT"
}
}
diff --git a/packages/docs/package.json b/packages/docs/package.json
index 8df2564c682..e9869568b07 100644
--- a/packages/docs/package.json
+++ b/packages/docs/package.json
@@ -1,6 +1,6 @@
{
"name": "@ionic/docs",
- "version": "8.7.1",
+ "version": "8.7.2",
"description": "Pre-packaged API documentation for the Ionic docs.",
"main": "core.json",
"types": "core.d.ts",
diff --git a/packages/react-router/CHANGELOG.md b/packages/react-router/CHANGELOG.md
index e87f0a75c08..c21fba5c9c2 100644
--- a/packages/react-router/CHANGELOG.md
+++ b/packages/react-router/CHANGELOG.md
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [8.7.2](https://github.com/ionic-team/ionic-framework/compare/v8.7.1...v8.7.2) (2025-08-06)
+
+**Note:** Version bump only for package @ionic/react-router
+
+
+
+
+
## [8.7.1](https://github.com/ionic-team/ionic-framework/compare/v8.7.0...v8.7.1) (2025-07-31)
**Note:** Version bump only for package @ionic/react-router
diff --git a/packages/react-router/package-lock.json b/packages/react-router/package-lock.json
index d2c4b86e918..59058e72226 100644
--- a/packages/react-router/package-lock.json
+++ b/packages/react-router/package-lock.json
@@ -1,15 +1,15 @@
{
"name": "@ionic/react-router",
- "version": "8.7.1",
+ "version": "8.7.2",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@ionic/react-router",
- "version": "8.7.1",
+ "version": "8.7.2",
"license": "MIT",
"dependencies": {
- "@ionic/react": "^8.7.1",
+ "@ionic/react": "^8.7.2",
"tslib": "*"
},
"devDependencies": {
@@ -238,12 +238,12 @@
"dev": true
},
"node_modules/@ionic/core": {
- "version": "8.7.0",
- "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.0.tgz",
- "integrity": "sha512-l/43DXwv3WB2iXfdOQlu0fBY1CP70kek1y75HCwe4C9UlXcSnaLYnr3F/4VLvo1sIjNOmJHxJURpv/ZR7CP4AQ==",
+ "version": "8.7.1",
+ "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.1.tgz",
+ "integrity": "sha512-TSJDPWayn23Dw0gjwvbumo6piDrpZvyVccgMUGyKDrqduvBogzIsPrjPBYfTF4z4Sc/W0HMad17nBskC2+ybqw==",
"license": "MIT",
"dependencies": {
- "@stencil/core": "4.33.1",
+ "@stencil/core": "4.36.2",
"ionicons": "^8.0.13",
"tslib": "^2.1.0"
}
@@ -415,12 +415,12 @@
}
},
"node_modules/@ionic/react": {
- "version": "8.7.0",
- "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.7.0.tgz",
- "integrity": "sha512-9MLa6qWDbtLoq+cUEAdoxHXeXrNTzoKVaOzEs95rohoKsKIUch5aAcI4g4iPx7zd04fMhvpiEVfMwoR1tq4EJQ==",
+ "version": "8.7.1",
+ "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.7.1.tgz",
+ "integrity": "sha512-J3PcON2QKqaHiY4+IHy24OoQIzVCCYkHpGM6gAEvuvhXSaQ4nv466eNYCaxnjma4fkz9tS2fwTbPc0C6X8bnXg==",
"license": "MIT",
"dependencies": {
- "@ionic/core": "8.7.0",
+ "@ionic/core": "8.7.1",
"ionicons": "^8.0.13",
"tslib": "*"
},
@@ -669,9 +669,9 @@
]
},
"node_modules/@stencil/core": {
- "version": "4.33.1",
- "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.33.1.tgz",
- "integrity": "sha512-12k9xhAJBkpg598it+NRmaYIdEe6TSnsL/v6/KRXDcUyTK11VYwZQej2eHnMWtqot+znJ+GNTqb5YbiXi+5Low==",
+ "version": "4.36.2",
+ "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.36.2.tgz",
+ "integrity": "sha512-PRFSpxNzX9Oi0Wfh02asztN9Sgev/MacfZwmd+VVyE6ZxW+a/kEpAYZhzGAmE+/aKVOGYuug7R9SulanYGxiDQ==",
"license": "MIT",
"bin": {
"stencil": "bin/stencil"
@@ -2550,133 +2550,6 @@
"@stencil/core": "^4.35.3"
}
},
- "node_modules/ionicons/node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.9.tgz",
- "integrity": "sha512-0CY3/K54slrzLDjOA7TOjN1NuLKERBgk9nY5V34mhmuu673YNb+7ghaDUs6N0ujXR7fz5XaS5Aa6d2TNxZd0OQ==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/ionicons/node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.9.tgz",
- "integrity": "sha512-eOojSEAi/acnsJVYRxnMkPFqcxSMFfrw7r2iD9Q32SGkb/Q9FpUY1UlAu1DH9T7j++gZ0lHjnm4OyH2vCI7l7Q==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/ionicons/node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.9.tgz",
- "integrity": "sha512-6TZjPHjKZUQKmVKMUowF3ewHxctrRR09eYyvT5eFv8w/fXarEra83A2mHTVJLA5xU91aCNOUnM+DWFMSbQ0Nxw==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/ionicons/node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.9.tgz",
- "integrity": "sha512-LD2fytxZJZ6xzOKnMbIpgzFOuIKlxVOpiMAXawsAZ2mHBPEYOnLRK5TTEsID6z4eM23DuO88X0Tq1mErHMVq0A==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/ionicons/node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.9.tgz",
- "integrity": "sha512-FwBHNSOjUTQLP4MG7y6rR6qbGw4MFeQnIBrMe161QGaQoBQLqSUEKlHIiVgF3g/mb3lxlxzJOpIBhaP+C+KP2A==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/ionicons/node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.9.tgz",
- "integrity": "sha512-cYRpV4650z2I3/s6+5/LONkjIz8MBeqrk+vPXV10ORBnshpn8S32bPqQ2Utv39jCiDcO2eJTuSlPXpnvmaIgRA==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/ionicons/node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.9.tgz",
- "integrity": "sha512-z4mQK9dAN6byRA/vsSgQiPeuO63wdiDxZ9yg9iyX2QTzKuQM7T4xlBoeUP/J8uiFkqxkcWndWi+W7bXdPbt27Q==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/ionicons/node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.9.tgz",
- "integrity": "sha512-AyleYRPU7+rgkMWbEh71fQlrzRfeP6SyMnRf9XX4fCdDPAJumdSBqYEcWPMzVQ4ScAl7E4oFfK0GUVn77xSwbw==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/ionicons/node_modules/@stencil/core": {
- "version": "4.36.2",
- "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.36.2.tgz",
- "integrity": "sha512-PRFSpxNzX9Oi0Wfh02asztN9Sgev/MacfZwmd+VVyE6ZxW+a/kEpAYZhzGAmE+/aKVOGYuug7R9SulanYGxiDQ==",
- "license": "MIT",
- "bin": {
- "stencil": "bin/stencil"
- },
- "engines": {
- "node": ">=16.0.0",
- "npm": ">=7.10.0"
- },
- "optionalDependencies": {
- "@rollup/rollup-darwin-arm64": "4.34.9",
- "@rollup/rollup-darwin-x64": "4.34.9",
- "@rollup/rollup-linux-arm64-gnu": "4.34.9",
- "@rollup/rollup-linux-arm64-musl": "4.34.9",
- "@rollup/rollup-linux-x64-gnu": "4.34.9",
- "@rollup/rollup-linux-x64-musl": "4.34.9",
- "@rollup/rollup-win32-arm64-msvc": "4.34.9",
- "@rollup/rollup-win32-x64-msvc": "4.34.9"
- }
- },
"node_modules/is-array-buffer": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz",
@@ -4302,11 +4175,11 @@
"dev": true
},
"@ionic/core": {
- "version": "8.7.0",
- "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.0.tgz",
- "integrity": "sha512-l/43DXwv3WB2iXfdOQlu0fBY1CP70kek1y75HCwe4C9UlXcSnaLYnr3F/4VLvo1sIjNOmJHxJURpv/ZR7CP4AQ==",
+ "version": "8.7.1",
+ "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.1.tgz",
+ "integrity": "sha512-TSJDPWayn23Dw0gjwvbumo6piDrpZvyVccgMUGyKDrqduvBogzIsPrjPBYfTF4z4Sc/W0HMad17nBskC2+ybqw==",
"requires": {
- "@stencil/core": "4.33.1",
+ "@stencil/core": "4.36.2",
"ionicons": "^8.0.13",
"tslib": "^2.1.0"
}
@@ -4408,11 +4281,11 @@
"requires": {}
},
"@ionic/react": {
- "version": "8.7.0",
- "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.7.0.tgz",
- "integrity": "sha512-9MLa6qWDbtLoq+cUEAdoxHXeXrNTzoKVaOzEs95rohoKsKIUch5aAcI4g4iPx7zd04fMhvpiEVfMwoR1tq4EJQ==",
+ "version": "8.7.1",
+ "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.7.1.tgz",
+ "integrity": "sha512-J3PcON2QKqaHiY4+IHy24OoQIzVCCYkHpGM6gAEvuvhXSaQ4nv466eNYCaxnjma4fkz9tS2fwTbPc0C6X8bnXg==",
"requires": {
- "@ionic/core": "8.7.0",
+ "@ionic/core": "8.7.1",
"ionicons": "^8.0.13",
"tslib": "*"
}
@@ -4549,9 +4422,9 @@
"optional": true
},
"@stencil/core": {
- "version": "4.33.1",
- "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.33.1.tgz",
- "integrity": "sha512-12k9xhAJBkpg598it+NRmaYIdEe6TSnsL/v6/KRXDcUyTK11VYwZQej2eHnMWtqot+znJ+GNTqb5YbiXi+5Low==",
+ "version": "4.36.2",
+ "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.36.2.tgz",
+ "integrity": "sha512-PRFSpxNzX9Oi0Wfh02asztN9Sgev/MacfZwmd+VVyE6ZxW+a/kEpAYZhzGAmE+/aKVOGYuug7R9SulanYGxiDQ==",
"requires": {
"@rollup/rollup-darwin-arm64": "4.34.9",
"@rollup/rollup-darwin-x64": "4.34.9",
@@ -5894,71 +5767,6 @@
"integrity": "sha512-2QQVyG2P4wszne79jemMjWYLp0DBbDhr4/yFroPCxvPP1wtMxgdIV3l5n+XZ5E9mgoXU79w7yTWpm2XzJsISxQ==",
"requires": {
"@stencil/core": "^4.35.3"
- },
- "dependencies": {
- "@rollup/rollup-darwin-arm64": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.9.tgz",
- "integrity": "sha512-0CY3/K54slrzLDjOA7TOjN1NuLKERBgk9nY5V34mhmuu673YNb+7ghaDUs6N0ujXR7fz5XaS5Aa6d2TNxZd0OQ==",
- "optional": true
- },
- "@rollup/rollup-darwin-x64": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.9.tgz",
- "integrity": "sha512-eOojSEAi/acnsJVYRxnMkPFqcxSMFfrw7r2iD9Q32SGkb/Q9FpUY1UlAu1DH9T7j++gZ0lHjnm4OyH2vCI7l7Q==",
- "optional": true
- },
- "@rollup/rollup-linux-arm64-gnu": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.9.tgz",
- "integrity": "sha512-6TZjPHjKZUQKmVKMUowF3ewHxctrRR09eYyvT5eFv8w/fXarEra83A2mHTVJLA5xU91aCNOUnM+DWFMSbQ0Nxw==",
- "optional": true
- },
- "@rollup/rollup-linux-arm64-musl": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.9.tgz",
- "integrity": "sha512-LD2fytxZJZ6xzOKnMbIpgzFOuIKlxVOpiMAXawsAZ2mHBPEYOnLRK5TTEsID6z4eM23DuO88X0Tq1mErHMVq0A==",
- "optional": true
- },
- "@rollup/rollup-linux-x64-gnu": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.9.tgz",
- "integrity": "sha512-FwBHNSOjUTQLP4MG7y6rR6qbGw4MFeQnIBrMe161QGaQoBQLqSUEKlHIiVgF3g/mb3lxlxzJOpIBhaP+C+KP2A==",
- "optional": true
- },
- "@rollup/rollup-linux-x64-musl": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.9.tgz",
- "integrity": "sha512-cYRpV4650z2I3/s6+5/LONkjIz8MBeqrk+vPXV10ORBnshpn8S32bPqQ2Utv39jCiDcO2eJTuSlPXpnvmaIgRA==",
- "optional": true
- },
- "@rollup/rollup-win32-arm64-msvc": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.9.tgz",
- "integrity": "sha512-z4mQK9dAN6byRA/vsSgQiPeuO63wdiDxZ9yg9iyX2QTzKuQM7T4xlBoeUP/J8uiFkqxkcWndWi+W7bXdPbt27Q==",
- "optional": true
- },
- "@rollup/rollup-win32-x64-msvc": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.9.tgz",
- "integrity": "sha512-AyleYRPU7+rgkMWbEh71fQlrzRfeP6SyMnRf9XX4fCdDPAJumdSBqYEcWPMzVQ4ScAl7E4oFfK0GUVn77xSwbw==",
- "optional": true
- },
- "@stencil/core": {
- "version": "4.36.2",
- "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.36.2.tgz",
- "integrity": "sha512-PRFSpxNzX9Oi0Wfh02asztN9Sgev/MacfZwmd+VVyE6ZxW+a/kEpAYZhzGAmE+/aKVOGYuug7R9SulanYGxiDQ==",
- "requires": {
- "@rollup/rollup-darwin-arm64": "4.34.9",
- "@rollup/rollup-darwin-x64": "4.34.9",
- "@rollup/rollup-linux-arm64-gnu": "4.34.9",
- "@rollup/rollup-linux-arm64-musl": "4.34.9",
- "@rollup/rollup-linux-x64-gnu": "4.34.9",
- "@rollup/rollup-linux-x64-musl": "4.34.9",
- "@rollup/rollup-win32-arm64-msvc": "4.34.9",
- "@rollup/rollup-win32-x64-msvc": "4.34.9"
- }
- }
}
},
"is-array-buffer": {
diff --git a/packages/react-router/package.json b/packages/react-router/package.json
index 5c3510e926d..785a5041b99 100644
--- a/packages/react-router/package.json
+++ b/packages/react-router/package.json
@@ -1,6 +1,6 @@
{
"name": "@ionic/react-router",
- "version": "8.7.1",
+ "version": "8.7.2",
"description": "React Router wrapper for @ionic/react",
"keywords": [
"ionic",
@@ -36,7 +36,7 @@
"dist/"
],
"dependencies": {
- "@ionic/react": "^8.7.1",
+ "@ionic/react": "^8.7.2",
"tslib": "*"
},
"peerDependencies": {
diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md
index c23ea4d156a..b1f7ddc104b 100644
--- a/packages/react/CHANGELOG.md
+++ b/packages/react/CHANGELOG.md
@@ -3,6 +3,18 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [8.7.2](https://github.com/ionic-team/ionic-framework/compare/v8.7.1...v8.7.2) (2025-08-06)
+
+
+### Bug Fixes
+
+* **reorder-group:** add children fallback for framework compatibility ([#30593](https://github.com/ionic-team/ionic-framework/issues/30593)) ([1cd81b9](https://github.com/ionic-team/ionic-framework/commit/1cd81b92301378d55bce63a01dfcf95a91c92652)), closes [#30592](https://github.com/ionic-team/ionic-framework/issues/30592)
+* **tabs:** add fallback to select tab if router integration fails ([#30599](https://github.com/ionic-team/ionic-framework/issues/30599)) ([a2e803a](https://github.com/ionic-team/ionic-framework/commit/a2e803a553dc58fc0e1599e515a56180a7ab263a)), closes [#30552](https://github.com/ionic-team/ionic-framework/issues/30552)
+
+
+
+
+
## [8.7.1](https://github.com/ionic-team/ionic-framework/compare/v8.7.0...v8.7.1) (2025-07-31)
**Note:** Version bump only for package @ionic/react
diff --git a/packages/react/package-lock.json b/packages/react/package-lock.json
index 9ba4bbb344c..a5546a814e1 100644
--- a/packages/react/package-lock.json
+++ b/packages/react/package-lock.json
@@ -1,15 +1,15 @@
{
"name": "@ionic/react",
- "version": "8.7.1",
+ "version": "8.7.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@ionic/react",
- "version": "8.7.1",
+ "version": "8.7.2",
"license": "MIT",
"dependencies": {
- "@ionic/core": "^8.7.1",
+ "@ionic/core": "^8.7.2",
"ionicons": "^8.0.13",
"tslib": "*"
},
@@ -736,12 +736,12 @@
"dev": true
},
"node_modules/@ionic/core": {
- "version": "8.7.0",
- "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.0.tgz",
- "integrity": "sha512-l/43DXwv3WB2iXfdOQlu0fBY1CP70kek1y75HCwe4C9UlXcSnaLYnr3F/4VLvo1sIjNOmJHxJURpv/ZR7CP4AQ==",
+ "version": "8.7.1",
+ "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.1.tgz",
+ "integrity": "sha512-TSJDPWayn23Dw0gjwvbumo6piDrpZvyVccgMUGyKDrqduvBogzIsPrjPBYfTF4z4Sc/W0HMad17nBskC2+ybqw==",
"license": "MIT",
"dependencies": {
- "@stencil/core": "4.33.1",
+ "@stencil/core": "4.36.2",
"ionicons": "^8.0.13",
"tslib": "^2.1.0"
}
@@ -1726,9 +1726,9 @@
}
},
"node_modules/@stencil/core": {
- "version": "4.33.1",
- "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.33.1.tgz",
- "integrity": "sha512-12k9xhAJBkpg598it+NRmaYIdEe6TSnsL/v6/KRXDcUyTK11VYwZQej2eHnMWtqot+znJ+GNTqb5YbiXi+5Low==",
+ "version": "4.36.2",
+ "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.36.2.tgz",
+ "integrity": "sha512-PRFSpxNzX9Oi0Wfh02asztN9Sgev/MacfZwmd+VVyE6ZxW+a/kEpAYZhzGAmE+/aKVOGYuug7R9SulanYGxiDQ==",
"license": "MIT",
"bin": {
"stencil": "bin/stencil"
@@ -6053,133 +6053,6 @@
"@stencil/core": "^4.35.3"
}
},
- "node_modules/ionicons/node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.9.tgz",
- "integrity": "sha512-0CY3/K54slrzLDjOA7TOjN1NuLKERBgk9nY5V34mhmuu673YNb+7ghaDUs6N0ujXR7fz5XaS5Aa6d2TNxZd0OQ==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/ionicons/node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.9.tgz",
- "integrity": "sha512-eOojSEAi/acnsJVYRxnMkPFqcxSMFfrw7r2iD9Q32SGkb/Q9FpUY1UlAu1DH9T7j++gZ0lHjnm4OyH2vCI7l7Q==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/ionicons/node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.9.tgz",
- "integrity": "sha512-6TZjPHjKZUQKmVKMUowF3ewHxctrRR09eYyvT5eFv8w/fXarEra83A2mHTVJLA5xU91aCNOUnM+DWFMSbQ0Nxw==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/ionicons/node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.9.tgz",
- "integrity": "sha512-LD2fytxZJZ6xzOKnMbIpgzFOuIKlxVOpiMAXawsAZ2mHBPEYOnLRK5TTEsID6z4eM23DuO88X0Tq1mErHMVq0A==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/ionicons/node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.9.tgz",
- "integrity": "sha512-FwBHNSOjUTQLP4MG7y6rR6qbGw4MFeQnIBrMe161QGaQoBQLqSUEKlHIiVgF3g/mb3lxlxzJOpIBhaP+C+KP2A==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/ionicons/node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.9.tgz",
- "integrity": "sha512-cYRpV4650z2I3/s6+5/LONkjIz8MBeqrk+vPXV10ORBnshpn8S32bPqQ2Utv39jCiDcO2eJTuSlPXpnvmaIgRA==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/ionicons/node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.9.tgz",
- "integrity": "sha512-z4mQK9dAN6byRA/vsSgQiPeuO63wdiDxZ9yg9iyX2QTzKuQM7T4xlBoeUP/J8uiFkqxkcWndWi+W7bXdPbt27Q==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/ionicons/node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.9.tgz",
- "integrity": "sha512-AyleYRPU7+rgkMWbEh71fQlrzRfeP6SyMnRf9XX4fCdDPAJumdSBqYEcWPMzVQ4ScAl7E4oFfK0GUVn77xSwbw==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/ionicons/node_modules/@stencil/core": {
- "version": "4.35.3",
- "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.35.3.tgz",
- "integrity": "sha512-RH5/I+amV31QI8TMXhXkAkjzs2eod6Y07jkUYTl9kMB+X7c5wUpv95Y/2LtcAx0Rqdhh4SHbJiwpr0ApBZmv0g==",
- "license": "MIT",
- "bin": {
- "stencil": "bin/stencil"
- },
- "engines": {
- "node": ">=16.0.0",
- "npm": ">=7.10.0"
- },
- "optionalDependencies": {
- "@rollup/rollup-darwin-arm64": "4.34.9",
- "@rollup/rollup-darwin-x64": "4.34.9",
- "@rollup/rollup-linux-arm64-gnu": "4.34.9",
- "@rollup/rollup-linux-arm64-musl": "4.34.9",
- "@rollup/rollup-linux-x64-gnu": "4.34.9",
- "@rollup/rollup-linux-x64-musl": "4.34.9",
- "@rollup/rollup-win32-arm64-msvc": "4.34.9",
- "@rollup/rollup-win32-x64-msvc": "4.34.9"
- }
- },
"node_modules/is-arguments": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz",
diff --git a/packages/react/package.json b/packages/react/package.json
index 6d8f281ca95..dd7c4e99723 100644
--- a/packages/react/package.json
+++ b/packages/react/package.json
@@ -1,6 +1,6 @@
{
"name": "@ionic/react",
- "version": "8.7.1",
+ "version": "8.7.2",
"description": "React specific wrapper for @ionic/core",
"keywords": [
"ionic",
@@ -39,7 +39,7 @@
"css/"
],
"dependencies": {
- "@ionic/core": "^8.7.1",
+ "@ionic/core": "^8.7.2",
"ionicons": "^8.0.13",
"tslib": "*"
},
diff --git a/packages/react/test/base/src/App.tsx b/packages/react/test/base/src/App.tsx
index 39ebb5f74ff..2f7f4a63ded 100644
--- a/packages/react/test/base/src/App.tsx
+++ b/packages/react/test/base/src/App.tsx
@@ -27,6 +27,7 @@ import Main from './pages/Main';
import Tabs from './pages/Tabs';
import TabsBasic from './pages/TabsBasic';
import NavComponent from './pages/navigation/NavComponent';
+import TabsDirectNavigation from './pages/TabsDirectNavigation';
import IonModalConditional from './pages/overlay-components/IonModalConditional';
import IonModalConditionalSibling from './pages/overlay-components/IonModalConditionalSibling';
import IonModalDatetimeButton from './pages/overlay-components/IonModalDatetimeButton';
@@ -35,6 +36,7 @@ import IonPopoverNested from './pages/overlay-components/IonPopoverNested';
import KeepContentsMounted from './pages/overlay-components/KeepContentsMounted';
import OverlayComponents from './pages/overlay-components/OverlayComponents';
import OverlayHooks from './pages/overlay-hooks/OverlayHooks';
+import ReorderGroup from './pages/ReorderGroup';
setupIonicReact();
@@ -42,7 +44,7 @@ const App: React.FC = () => (
-
+
@@ -63,8 +65,10 @@ const App: React.FC = () => (
+
+
diff --git a/packages/react/test/base/src/pages/Icons.tsx b/packages/react/test/base/src/pages/Icons.tsx
index caf9f0b4e69..9e0aa52e3ff 100644
--- a/packages/react/test/base/src/pages/Icons.tsx
+++ b/packages/react/test/base/src/pages/Icons.tsx
@@ -1,5 +1,5 @@
import React, { useState } from 'react';
-import { IonBackButton, IonButton, IonButtons, IonContent, IonHeader, IonIcon, IonItem, IonLabel, IonList, IonTitle, IonToolbar } from '@ionic/react';
+import { IonBackButton, IonButton, IonButtons, IonContent, IonHeader, IonIcon, IonItem, IonLabel, IonList, IonTitle, IonToolbar, IonPage } from '@ionic/react';
import { heart, heartCircleOutline, logoApple, logoTwitter, personCircleOutline, star, starOutline, trash } from 'ionicons/icons';
interface IconsProps {}
@@ -14,10 +14,10 @@ const Icons: React.FC = () => {
}
return (
- <>
+
-
+
Icons
@@ -88,7 +88,7 @@ const Icons: React.FC = () => {
- >
+
);
};
diff --git a/packages/react/test/base/src/pages/Inputs.tsx b/packages/react/test/base/src/pages/Inputs.tsx
index fd4656ee68b..7e5db11b5de 100644
--- a/packages/react/test/base/src/pages/Inputs.tsx
+++ b/packages/react/test/base/src/pages/Inputs.tsx
@@ -98,7 +98,7 @@ const Inputs: React.FC = () => {
-
+
Inputs
diff --git a/packages/react/test/base/src/pages/Main.tsx b/packages/react/test/base/src/pages/Main.tsx
index 5595c0d6307..dd87350d9be 100644
--- a/packages/react/test/base/src/pages/Main.tsx
+++ b/packages/react/test/base/src/pages/Main.tsx
@@ -40,12 +40,18 @@ const Main: React.FC = () => {
Tabs with Basic Navigation
+
+ Tabs with Direct Navigation
+
Icons
Inputs
+
+ Reorder Group
+
diff --git a/packages/react/test/base/src/pages/ReorderGroup.tsx b/packages/react/test/base/src/pages/ReorderGroup.tsx
new file mode 100644
index 00000000000..29dc50273b4
--- /dev/null
+++ b/packages/react/test/base/src/pages/ReorderGroup.tsx
@@ -0,0 +1,58 @@
+import React from 'react';
+import {
+ IonBackButton,
+ IonButtons,
+ IonContent,
+ IonHeader,
+ IonItem,
+ IonLabel,
+ IonPage,
+ IonReorder,
+ IonReorderGroup,
+ IonTitle,
+ IonToolbar,
+} from '@ionic/react';
+import type { ReorderEndCustomEvent } from '@ionic/react';
+
+const ReorderGroup: React.FC = () => {
+ const onReorderEnd = (event: ReorderEndCustomEvent) => {
+ if (event.detail.from !== event.detail.to) {
+ console.log('ionReorderEnd: Dragged from index', event.detail.from, 'to', event.detail.to);
+ } else {
+ console.log('ionReorderEnd: No position change occurred');
+ }
+
+ event.detail.complete();
+ };
+
+ return (
+
+
+
+
+
+
+ Reorder Group
+
+
+
+
+
+
+ Item 1
+
+
+
+ Item 2
+
+
+
+ Item 3
+
+
+
+
+ );
+};
+
+export default ReorderGroup;
diff --git a/packages/react/test/base/src/pages/Tabs.tsx b/packages/react/test/base/src/pages/Tabs.tsx
index 08a2cfa8af8..2098bfcb266 100644
--- a/packages/react/test/base/src/pages/Tabs.tsx
+++ b/packages/react/test/base/src/pages/Tabs.tsx
@@ -1,22 +1,24 @@
import React from 'react';
-import { IonLabel, IonRouterOutlet, IonTabBar, IonTabButton, IonTabs } from '@ionic/react';
+import { IonLabel, IonRouterOutlet, IonTabBar, IonTabButton, IonTabs, IonPage } from '@ionic/react';
import { Route, Redirect } from 'react-router';
interface TabsProps {}
const Tabs: React.FC = () => {
return (
-
-
-
- Tab 1} />
-
-
- window.alert('Tab was clicked')}>
- Click Handler
-
-
-
+
+
+
+
+ Tab 1} />
+
+
+ window.alert('Tab was clicked')}>
+ Click Handler
+
+
+
+
);
};
diff --git a/packages/react/test/base/src/pages/TabsBasic.tsx b/packages/react/test/base/src/pages/TabsBasic.tsx
index 63821f06e0b..5751cdb3a23 100644
--- a/packages/react/test/base/src/pages/TabsBasic.tsx
+++ b/packages/react/test/base/src/pages/TabsBasic.tsx
@@ -1,5 +1,5 @@
import React from 'react';
-import { IonLabel, IonTabBar, IonTabButton, IonTabs, IonTab } from '@ionic/react';
+import { IonLabel, IonTabBar, IonTabButton, IonTabs, IonTab, IonPage } from '@ionic/react';
interface TabsProps {}
@@ -13,22 +13,24 @@ const TabsBasic: React.FC = () => {
};
return (
-
-
- Tab 1 Content
-
-
- Tab 2 Content
-
-
-
- Tab 1
-
-
- Tab 2
-
-
-
+
+
+
+ Tab 1 Content
+
+
+ Tab 2 Content
+
+
+
+ Tab 1
+
+
+ Tab 2
+
+
+
+
);
};
diff --git a/packages/react/test/base/src/pages/TabsDirectNavigation.tsx b/packages/react/test/base/src/pages/TabsDirectNavigation.tsx
new file mode 100644
index 00000000000..2e412e174ab
--- /dev/null
+++ b/packages/react/test/base/src/pages/TabsDirectNavigation.tsx
@@ -0,0 +1,94 @@
+import { IonContent, IonHeader, IonIcon, IonLabel, IonPage, IonRouterOutlet, IonTabBar, IonTabButton, IonTabs, IonTitle, IonToolbar } from '@ionic/react';
+import { homeOutline, radioOutline, libraryOutline, searchOutline } from 'ionicons/icons';
+import React from 'react';
+import { Route, Redirect } from 'react-router-dom';
+
+const HomePage: React.FC = () => (
+
+
+
+ Home
+
+
+
+ Home Content
+
+
+);
+
+const RadioPage: React.FC = () => (
+
+
+
+ Radio
+
+
+
+ Radio Content
+
+
+);
+
+const LibraryPage: React.FC = () => (
+
+
+
+ Library
+
+
+
+ Library Content
+
+
+);
+
+const SearchPage: React.FC = () => (
+
+
+
+ Search
+
+
+
+ Search Content
+
+
+);
+
+const TabsDirectNavigation: React.FC = () => {
+ return (
+
+
+
+ } exact={true} />
+ } exact={true} />
+ } exact={true} />
+ } exact={true} />
+
+
+
+
+
+ Home
+
+
+
+
+ Radio
+
+
+
+
+ Library
+
+
+
+
+ Search
+
+
+
+ );
+};
+
+export default TabsDirectNavigation;
diff --git a/packages/react/test/base/src/pages/navigation/NavComponent.tsx b/packages/react/test/base/src/pages/navigation/NavComponent.tsx
index 08a5acd5b24..2da3374867f 100644
--- a/packages/react/test/base/src/pages/navigation/NavComponent.tsx
+++ b/packages/react/test/base/src/pages/navigation/NavComponent.tsx
@@ -27,7 +27,7 @@ const PageOne = ({
Page One
-
+
@@ -57,7 +57,7 @@ const PageTwo = ({ nav, ...rest }: { someValue: string; nav: React.MutableRefObj
Page Two
-
+
@@ -84,7 +84,7 @@ const PageThree = ({ nav }: { nav: React.MutableRefObject })
Page Three
-
+
diff --git a/packages/react/test/base/tests/e2e/specs/components/tabs-direct-navigation.cy.ts b/packages/react/test/base/tests/e2e/specs/components/tabs-direct-navigation.cy.ts
new file mode 100644
index 00000000000..f669470ce6b
--- /dev/null
+++ b/packages/react/test/base/tests/e2e/specs/components/tabs-direct-navigation.cy.ts
@@ -0,0 +1,34 @@
+describe('Tabs Direct Navigation', () => {
+ it('should select the correct tab when navigating directly to home route', () => {
+ cy.visit('/tabs-direct-navigation/home');
+ cy.get('[data-testid="home-tab"]').should('have.class', 'tab-selected');
+ cy.get('[data-testid="home-content"]').should('be.visible');
+ });
+
+ it('should select the correct tab when navigating directly to radio route', () => {
+ cy.visit('/tabs-direct-navigation/radio');
+ cy.get('[data-testid="radio-tab"]').should('have.class', 'tab-selected');
+ cy.get('[data-testid="radio-content"]').should('be.visible');
+ });
+
+ it('should select the correct tab when navigating directly to library route', () => {
+ cy.visit('/tabs-direct-navigation/library');
+ cy.get('[data-testid="library-tab"]').should('have.class', 'tab-selected');
+ cy.get('[data-testid="library-content"]').should('be.visible');
+ });
+
+ it('should select the correct tab when navigating directly to search route', () => {
+ cy.visit('/tabs-direct-navigation/search');
+ cy.get('[data-testid="search-tab"]').should('have.class', 'tab-selected');
+ cy.get('[data-testid="search-content"]').should('be.visible');
+ });
+
+ it('should update tab selection when navigating between tabs', () => {
+ cy.visit('/tabs-direct-navigation/home');
+ cy.get('[data-testid="home-tab"]').should('have.class', 'tab-selected');
+ cy.get('[data-testid="radio-tab"]').click();
+ cy.get('[data-testid="radio-tab"]').should('have.class', 'tab-selected');
+ cy.get('[data-testid="home-tab"]').should('not.have.class', 'tab-selected');
+ cy.get('[data-testid="radio-content"]').should('be.visible');
+ });
+});
diff --git a/packages/vue-router/CHANGELOG.md b/packages/vue-router/CHANGELOG.md
index 1d702c2abed..930f662c41e 100644
--- a/packages/vue-router/CHANGELOG.md
+++ b/packages/vue-router/CHANGELOG.md
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [8.7.2](https://github.com/ionic-team/ionic-framework/compare/v8.7.1...v8.7.2) (2025-08-06)
+
+**Note:** Version bump only for package @ionic/vue-router
+
+
+
+
+
## [8.7.1](https://github.com/ionic-team/ionic-framework/compare/v8.7.0...v8.7.1) (2025-07-31)
**Note:** Version bump only for package @ionic/vue-router
diff --git a/packages/vue-router/package-lock.json b/packages/vue-router/package-lock.json
index 513a483b36b..ec302d753b7 100644
--- a/packages/vue-router/package-lock.json
+++ b/packages/vue-router/package-lock.json
@@ -1,15 +1,15 @@
{
"name": "@ionic/vue-router",
- "version": "8.7.1",
+ "version": "8.7.2",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@ionic/vue-router",
- "version": "8.7.1",
+ "version": "8.7.2",
"license": "MIT",
"dependencies": {
- "@ionic/vue": "^8.7.1"
+ "@ionic/vue": "^8.7.2"
},
"devDependencies": {
"@ionic/eslint-config": "^0.3.0",
@@ -673,143 +673,16 @@
"dev": true
},
"node_modules/@ionic/core": {
- "version": "8.7.0",
- "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.0.tgz",
- "integrity": "sha512-l/43DXwv3WB2iXfdOQlu0fBY1CP70kek1y75HCwe4C9UlXcSnaLYnr3F/4VLvo1sIjNOmJHxJURpv/ZR7CP4AQ==",
+ "version": "8.7.1",
+ "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.1.tgz",
+ "integrity": "sha512-TSJDPWayn23Dw0gjwvbumo6piDrpZvyVccgMUGyKDrqduvBogzIsPrjPBYfTF4z4Sc/W0HMad17nBskC2+ybqw==",
"license": "MIT",
"dependencies": {
- "@stencil/core": "4.33.1",
+ "@stencil/core": "4.36.2",
"ionicons": "^8.0.13",
"tslib": "^2.1.0"
}
},
- "node_modules/@ionic/core/node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.9.tgz",
- "integrity": "sha512-0CY3/K54slrzLDjOA7TOjN1NuLKERBgk9nY5V34mhmuu673YNb+7ghaDUs6N0ujXR7fz5XaS5Aa6d2TNxZd0OQ==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@ionic/core/node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.9.tgz",
- "integrity": "sha512-eOojSEAi/acnsJVYRxnMkPFqcxSMFfrw7r2iD9Q32SGkb/Q9FpUY1UlAu1DH9T7j++gZ0lHjnm4OyH2vCI7l7Q==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@ionic/core/node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.9.tgz",
- "integrity": "sha512-6TZjPHjKZUQKmVKMUowF3ewHxctrRR09eYyvT5eFv8w/fXarEra83A2mHTVJLA5xU91aCNOUnM+DWFMSbQ0Nxw==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@ionic/core/node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.9.tgz",
- "integrity": "sha512-LD2fytxZJZ6xzOKnMbIpgzFOuIKlxVOpiMAXawsAZ2mHBPEYOnLRK5TTEsID6z4eM23DuO88X0Tq1mErHMVq0A==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@ionic/core/node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.9.tgz",
- "integrity": "sha512-FwBHNSOjUTQLP4MG7y6rR6qbGw4MFeQnIBrMe161QGaQoBQLqSUEKlHIiVgF3g/mb3lxlxzJOpIBhaP+C+KP2A==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@ionic/core/node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.9.tgz",
- "integrity": "sha512-cYRpV4650z2I3/s6+5/LONkjIz8MBeqrk+vPXV10ORBnshpn8S32bPqQ2Utv39jCiDcO2eJTuSlPXpnvmaIgRA==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@ionic/core/node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.9.tgz",
- "integrity": "sha512-z4mQK9dAN6byRA/vsSgQiPeuO63wdiDxZ9yg9iyX2QTzKuQM7T4xlBoeUP/J8uiFkqxkcWndWi+W7bXdPbt27Q==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@ionic/core/node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.9.tgz",
- "integrity": "sha512-AyleYRPU7+rgkMWbEh71fQlrzRfeP6SyMnRf9XX4fCdDPAJumdSBqYEcWPMzVQ4ScAl7E4oFfK0GUVn77xSwbw==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@ionic/core/node_modules/@stencil/core": {
- "version": "4.33.1",
- "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.33.1.tgz",
- "integrity": "sha512-12k9xhAJBkpg598it+NRmaYIdEe6TSnsL/v6/KRXDcUyTK11VYwZQej2eHnMWtqot+znJ+GNTqb5YbiXi+5Low==",
- "license": "MIT",
- "bin": {
- "stencil": "bin/stencil"
- },
- "engines": {
- "node": ">=16.0.0",
- "npm": ">=7.10.0"
- },
- "optionalDependencies": {
- "@rollup/rollup-darwin-arm64": "4.34.9",
- "@rollup/rollup-darwin-x64": "4.34.9",
- "@rollup/rollup-linux-arm64-gnu": "4.34.9",
- "@rollup/rollup-linux-arm64-musl": "4.34.9",
- "@rollup/rollup-linux-x64-gnu": "4.34.9",
- "@rollup/rollup-linux-x64-musl": "4.34.9",
- "@rollup/rollup-win32-arm64-msvc": "4.34.9",
- "@rollup/rollup-win32-x64-msvc": "4.34.9"
- }
- },
"node_modules/@ionic/eslint-config": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/@ionic/eslint-config/-/eslint-config-0.3.0.tgz",
@@ -992,12 +865,12 @@
}
},
"node_modules/@ionic/vue": {
- "version": "8.7.0",
- "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.7.0.tgz",
- "integrity": "sha512-lIq8zTIx794QrFUHqXpS02Z0QRPBDNcuX+lIL7dQYg4PXxYwdERppt5MStfXXbx1jNr6YDCOhYMdcuw9emmzGA==",
+ "version": "8.7.1",
+ "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.7.1.tgz",
+ "integrity": "sha512-b/wIsactN870z1t+jRWEemtCtO5QwBg5e49ycWiOjHYPYZd7UBU1lRWSrvzbtMNvBEYbTTWBHg/ewGFL7EFxBw==",
"license": "MIT",
"dependencies": {
- "@ionic/core": "8.7.0",
+ "@ionic/core": "8.7.1",
"@stencil/vue-output-target": "0.10.7",
"ionicons": "^8.0.13"
}
@@ -8168,78 +8041,13 @@
"dev": true
},
"@ionic/core": {
- "version": "8.7.0",
- "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.0.tgz",
- "integrity": "sha512-l/43DXwv3WB2iXfdOQlu0fBY1CP70kek1y75HCwe4C9UlXcSnaLYnr3F/4VLvo1sIjNOmJHxJURpv/ZR7CP4AQ==",
+ "version": "8.7.1",
+ "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.1.tgz",
+ "integrity": "sha512-TSJDPWayn23Dw0gjwvbumo6piDrpZvyVccgMUGyKDrqduvBogzIsPrjPBYfTF4z4Sc/W0HMad17nBskC2+ybqw==",
"requires": {
- "@stencil/core": "4.33.1",
+ "@stencil/core": "4.36.2",
"ionicons": "^8.0.13",
"tslib": "^2.1.0"
- },
- "dependencies": {
- "@rollup/rollup-darwin-arm64": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.9.tgz",
- "integrity": "sha512-0CY3/K54slrzLDjOA7TOjN1NuLKERBgk9nY5V34mhmuu673YNb+7ghaDUs6N0ujXR7fz5XaS5Aa6d2TNxZd0OQ==",
- "optional": true
- },
- "@rollup/rollup-darwin-x64": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.9.tgz",
- "integrity": "sha512-eOojSEAi/acnsJVYRxnMkPFqcxSMFfrw7r2iD9Q32SGkb/Q9FpUY1UlAu1DH9T7j++gZ0lHjnm4OyH2vCI7l7Q==",
- "optional": true
- },
- "@rollup/rollup-linux-arm64-gnu": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.9.tgz",
- "integrity": "sha512-6TZjPHjKZUQKmVKMUowF3ewHxctrRR09eYyvT5eFv8w/fXarEra83A2mHTVJLA5xU91aCNOUnM+DWFMSbQ0Nxw==",
- "optional": true
- },
- "@rollup/rollup-linux-arm64-musl": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.9.tgz",
- "integrity": "sha512-LD2fytxZJZ6xzOKnMbIpgzFOuIKlxVOpiMAXawsAZ2mHBPEYOnLRK5TTEsID6z4eM23DuO88X0Tq1mErHMVq0A==",
- "optional": true
- },
- "@rollup/rollup-linux-x64-gnu": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.9.tgz",
- "integrity": "sha512-FwBHNSOjUTQLP4MG7y6rR6qbGw4MFeQnIBrMe161QGaQoBQLqSUEKlHIiVgF3g/mb3lxlxzJOpIBhaP+C+KP2A==",
- "optional": true
- },
- "@rollup/rollup-linux-x64-musl": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.9.tgz",
- "integrity": "sha512-cYRpV4650z2I3/s6+5/LONkjIz8MBeqrk+vPXV10ORBnshpn8S32bPqQ2Utv39jCiDcO2eJTuSlPXpnvmaIgRA==",
- "optional": true
- },
- "@rollup/rollup-win32-arm64-msvc": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.9.tgz",
- "integrity": "sha512-z4mQK9dAN6byRA/vsSgQiPeuO63wdiDxZ9yg9iyX2QTzKuQM7T4xlBoeUP/J8uiFkqxkcWndWi+W7bXdPbt27Q==",
- "optional": true
- },
- "@rollup/rollup-win32-x64-msvc": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.9.tgz",
- "integrity": "sha512-AyleYRPU7+rgkMWbEh71fQlrzRfeP6SyMnRf9XX4fCdDPAJumdSBqYEcWPMzVQ4ScAl7E4oFfK0GUVn77xSwbw==",
- "optional": true
- },
- "@stencil/core": {
- "version": "4.33.1",
- "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.33.1.tgz",
- "integrity": "sha512-12k9xhAJBkpg598it+NRmaYIdEe6TSnsL/v6/KRXDcUyTK11VYwZQej2eHnMWtqot+znJ+GNTqb5YbiXi+5Low==",
- "requires": {
- "@rollup/rollup-darwin-arm64": "4.34.9",
- "@rollup/rollup-darwin-x64": "4.34.9",
- "@rollup/rollup-linux-arm64-gnu": "4.34.9",
- "@rollup/rollup-linux-arm64-musl": "4.34.9",
- "@rollup/rollup-linux-x64-gnu": "4.34.9",
- "@rollup/rollup-linux-x64-musl": "4.34.9",
- "@rollup/rollup-win32-arm64-msvc": "4.34.9",
- "@rollup/rollup-win32-x64-msvc": "4.34.9"
- }
- }
}
},
"@ionic/eslint-config": {
@@ -8348,11 +8156,11 @@
"requires": {}
},
"@ionic/vue": {
- "version": "8.7.0",
- "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.7.0.tgz",
- "integrity": "sha512-lIq8zTIx794QrFUHqXpS02Z0QRPBDNcuX+lIL7dQYg4PXxYwdERppt5MStfXXbx1jNr6YDCOhYMdcuw9emmzGA==",
+ "version": "8.7.1",
+ "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.7.1.tgz",
+ "integrity": "sha512-b/wIsactN870z1t+jRWEemtCtO5QwBg5e49ycWiOjHYPYZd7UBU1lRWSrvzbtMNvBEYbTTWBHg/ewGFL7EFxBw==",
"requires": {
- "@ionic/core": "8.7.0",
+ "@ionic/core": "8.7.1",
"@stencil/vue-output-target": "0.10.7",
"ionicons": "^8.0.13"
}
diff --git a/packages/vue-router/package.json b/packages/vue-router/package.json
index 8c1aba90212..32ab0f27ade 100644
--- a/packages/vue-router/package.json
+++ b/packages/vue-router/package.json
@@ -1,6 +1,6 @@
{
"name": "@ionic/vue-router",
- "version": "8.7.1",
+ "version": "8.7.2",
"description": "Vue Router integration for @ionic/vue",
"scripts": {
"test.spec": "jest",
@@ -44,7 +44,7 @@
},
"homepage": "https://github.com/ionic-team/ionic-framework#readme",
"dependencies": {
- "@ionic/vue": "^8.7.1"
+ "@ionic/vue": "^8.7.2"
},
"devDependencies": {
"@ionic/eslint-config": "^0.3.0",
diff --git a/packages/vue/CHANGELOG.md b/packages/vue/CHANGELOG.md
index 79ad6fae1e7..f328b2ad4f3 100644
--- a/packages/vue/CHANGELOG.md
+++ b/packages/vue/CHANGELOG.md
@@ -3,6 +3,17 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [8.7.2](https://github.com/ionic-team/ionic-framework/compare/v8.7.1...v8.7.2) (2025-08-06)
+
+
+### Bug Fixes
+
+* **reorder-group:** add children fallback for framework compatibility ([#30593](https://github.com/ionic-team/ionic-framework/issues/30593)) ([1cd81b9](https://github.com/ionic-team/ionic-framework/commit/1cd81b92301378d55bce63a01dfcf95a91c92652)), closes [#30592](https://github.com/ionic-team/ionic-framework/issues/30592)
+
+
+
+
+
## [8.7.1](https://github.com/ionic-team/ionic-framework/compare/v8.7.0...v8.7.1) (2025-07-31)
**Note:** Version bump only for package @ionic/vue
diff --git a/packages/vue/package-lock.json b/packages/vue/package-lock.json
index b1e52b28a13..62e7384173b 100644
--- a/packages/vue/package-lock.json
+++ b/packages/vue/package-lock.json
@@ -1,15 +1,15 @@
{
"name": "@ionic/vue",
- "version": "8.7.1",
+ "version": "8.7.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@ionic/vue",
- "version": "8.7.1",
+ "version": "8.7.2",
"license": "MIT",
"dependencies": {
- "@ionic/core": "^8.7.1",
+ "@ionic/core": "^8.7.2",
"@stencil/vue-output-target": "0.10.7",
"ionicons": "^8.0.13"
},
@@ -222,12 +222,12 @@
"dev": true
},
"node_modules/@ionic/core": {
- "version": "8.7.0",
- "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.0.tgz",
- "integrity": "sha512-l/43DXwv3WB2iXfdOQlu0fBY1CP70kek1y75HCwe4C9UlXcSnaLYnr3F/4VLvo1sIjNOmJHxJURpv/ZR7CP4AQ==",
+ "version": "8.7.1",
+ "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.1.tgz",
+ "integrity": "sha512-TSJDPWayn23Dw0gjwvbumo6piDrpZvyVccgMUGyKDrqduvBogzIsPrjPBYfTF4z4Sc/W0HMad17nBskC2+ybqw==",
"license": "MIT",
"dependencies": {
- "@stencil/core": "4.33.1",
+ "@stencil/core": "4.36.2",
"ionicons": "^8.0.13",
"tslib": "^2.1.0"
}
@@ -674,9 +674,9 @@
]
},
"node_modules/@stencil/core": {
- "version": "4.33.1",
- "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.33.1.tgz",
- "integrity": "sha512-12k9xhAJBkpg598it+NRmaYIdEe6TSnsL/v6/KRXDcUyTK11VYwZQej2eHnMWtqot+znJ+GNTqb5YbiXi+5Low==",
+ "version": "4.36.2",
+ "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.36.2.tgz",
+ "integrity": "sha512-PRFSpxNzX9Oi0Wfh02asztN9Sgev/MacfZwmd+VVyE6ZxW+a/kEpAYZhzGAmE+/aKVOGYuug7R9SulanYGxiDQ==",
"license": "MIT",
"bin": {
"stencil": "bin/stencil"
@@ -2639,133 +2639,6 @@
"@stencil/core": "^4.35.3"
}
},
- "node_modules/ionicons/node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.9.tgz",
- "integrity": "sha512-0CY3/K54slrzLDjOA7TOjN1NuLKERBgk9nY5V34mhmuu673YNb+7ghaDUs6N0ujXR7fz5XaS5Aa6d2TNxZd0OQ==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/ionicons/node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.9.tgz",
- "integrity": "sha512-eOojSEAi/acnsJVYRxnMkPFqcxSMFfrw7r2iD9Q32SGkb/Q9FpUY1UlAu1DH9T7j++gZ0lHjnm4OyH2vCI7l7Q==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/ionicons/node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.9.tgz",
- "integrity": "sha512-6TZjPHjKZUQKmVKMUowF3ewHxctrRR09eYyvT5eFv8w/fXarEra83A2mHTVJLA5xU91aCNOUnM+DWFMSbQ0Nxw==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/ionicons/node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.9.tgz",
- "integrity": "sha512-LD2fytxZJZ6xzOKnMbIpgzFOuIKlxVOpiMAXawsAZ2mHBPEYOnLRK5TTEsID6z4eM23DuO88X0Tq1mErHMVq0A==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/ionicons/node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.9.tgz",
- "integrity": "sha512-FwBHNSOjUTQLP4MG7y6rR6qbGw4MFeQnIBrMe161QGaQoBQLqSUEKlHIiVgF3g/mb3lxlxzJOpIBhaP+C+KP2A==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/ionicons/node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.9.tgz",
- "integrity": "sha512-cYRpV4650z2I3/s6+5/LONkjIz8MBeqrk+vPXV10ORBnshpn8S32bPqQ2Utv39jCiDcO2eJTuSlPXpnvmaIgRA==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/ionicons/node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.9.tgz",
- "integrity": "sha512-z4mQK9dAN6byRA/vsSgQiPeuO63wdiDxZ9yg9iyX2QTzKuQM7T4xlBoeUP/J8uiFkqxkcWndWi+W7bXdPbt27Q==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/ionicons/node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.9.tgz",
- "integrity": "sha512-AyleYRPU7+rgkMWbEh71fQlrzRfeP6SyMnRf9XX4fCdDPAJumdSBqYEcWPMzVQ4ScAl7E4oFfK0GUVn77xSwbw==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/ionicons/node_modules/@stencil/core": {
- "version": "4.36.2",
- "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.36.2.tgz",
- "integrity": "sha512-PRFSpxNzX9Oi0Wfh02asztN9Sgev/MacfZwmd+VVyE6ZxW+a/kEpAYZhzGAmE+/aKVOGYuug7R9SulanYGxiDQ==",
- "license": "MIT",
- "bin": {
- "stencil": "bin/stencil"
- },
- "engines": {
- "node": ">=16.0.0",
- "npm": ">=7.10.0"
- },
- "optionalDependencies": {
- "@rollup/rollup-darwin-arm64": "4.34.9",
- "@rollup/rollup-darwin-x64": "4.34.9",
- "@rollup/rollup-linux-arm64-gnu": "4.34.9",
- "@rollup/rollup-linux-arm64-musl": "4.34.9",
- "@rollup/rollup-linux-x64-gnu": "4.34.9",
- "@rollup/rollup-linux-x64-musl": "4.34.9",
- "@rollup/rollup-win32-arm64-msvc": "4.34.9",
- "@rollup/rollup-win32-x64-msvc": "4.34.9"
- }
- },
"node_modules/is-array-buffer": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz",
diff --git a/packages/vue/package.json b/packages/vue/package.json
index 6aa2a1b669d..693383ebfce 100644
--- a/packages/vue/package.json
+++ b/packages/vue/package.json
@@ -1,6 +1,6 @@
{
"name": "@ionic/vue",
- "version": "8.7.1",
+ "version": "8.7.2",
"description": "Vue specific wrapper for @ionic/core",
"scripts": {
"eslint": "eslint src",
@@ -67,7 +67,7 @@
"vue-router": "^4.0.16"
},
"dependencies": {
- "@ionic/core": "^8.7.1",
+ "@ionic/core": "^8.7.2",
"@stencil/vue-output-target": "0.10.7",
"ionicons": "^8.0.13"
},
diff --git a/packages/vue/test/base/src/router/index.ts b/packages/vue/test/base/src/router/index.ts
index 5e344988313..13d4e919ad6 100644
--- a/packages/vue/test/base/src/router/index.ts
+++ b/packages/vue/test/base/src/router/index.ts
@@ -86,6 +86,10 @@ const routes: Array = [
path: '/components/range',
component: () => import('@/views/Range.vue')
},
+ {
+ path: '/reorder-group',
+ component: () => import('@/views/ReorderGroup.vue')
+ },
{
path: '/nested',
component: () => import('@/views/RouterOutlet.vue'),
diff --git a/packages/vue/test/base/src/views/Home.vue b/packages/vue/test/base/src/views/Home.vue
index 853832bd8c6..d4d88e61a3f 100644
--- a/packages/vue/test/base/src/views/Home.vue
+++ b/packages/vue/test/base/src/views/Home.vue
@@ -29,6 +29,9 @@
Navigation
+
+ Reorder Group
+
Routing
diff --git a/packages/vue/test/base/src/views/ReorderGroup.vue b/packages/vue/test/base/src/views/ReorderGroup.vue
new file mode 100644
index 00000000000..48ccab650ec
--- /dev/null
+++ b/packages/vue/test/base/src/views/ReorderGroup.vue
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+ Reorder Group
+
+
+
+
+
+
+
+ Item 1
+
+
+
+ Item 2
+
+
+
+ Item 3
+
+
+
+
+
+
+