From 830f1295a45817a994475fb2f439956c8537df88 Mon Sep 17 00:00:00 2001 From: Calson Chiatiah Date: Wed, 2 Apr 2025 09:20:58 +0100 Subject: [PATCH 01/42] feat(playwright): add prompts --- packages/e2e-playwright/src/prompts.js | 35 ++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 packages/e2e-playwright/src/prompts.js diff --git a/packages/e2e-playwright/src/prompts.js b/packages/e2e-playwright/src/prompts.js new file mode 100644 index 00000000..d32d07b8 --- /dev/null +++ b/packages/e2e-playwright/src/prompts.js @@ -0,0 +1,35 @@ +import { enforcedDevServerPort } from './shared.js'; + +export default function () { + return [ + { + name: 'port', + type: 'text', + required: true, + default: enforcedDevServerPort, + message: 'Set the port from which to serve the app:', + }, + { + name: 'githubWorkflow', + type: 'text', + required: true, + default: 'y/N', + message: 'Do you want to add a GitHub workflow for your CI?', + }, + { + name: 'installBrowsers', + type: 'text', + required: true, + default: 'y/N', + message: + "Install Playwright browsers (can be done manually via 'npx exec playwright install')?", + }, + { + name: 'enableCodeCoverage', + type: 'text', + required: true, + default: 'y/N', + message: 'Do you want to enable code coverage?', + }, + ]; +} From 2efd733f7131ba62acaee7f780e4965b01de5dc2 Mon Sep 17 00:00:00 2001 From: Calson Chiatiah Date: Wed, 2 Apr 2025 11:14:58 +0100 Subject: [PATCH 02/42] feat(playwright): initial setup --- packages/e2e-playwright/.gitignore | 15 +++++++ packages/e2e-playwright/README.md | 36 +++++++++++++++++ packages/e2e-playwright/package.json | 50 ++++++++++++++++++++++++ packages/e2e-playwright/src/index.js | 1 + packages/e2e-playwright/src/uninstall.js | 10 +++++ 5 files changed, 112 insertions(+) create mode 100644 packages/e2e-playwright/.gitignore create mode 100644 packages/e2e-playwright/README.md create mode 100644 packages/e2e-playwright/package.json create mode 100644 packages/e2e-playwright/src/index.js create mode 100644 packages/e2e-playwright/src/uninstall.js diff --git a/packages/e2e-playwright/.gitignore b/packages/e2e-playwright/.gitignore new file mode 100644 index 00000000..4fe71df3 --- /dev/null +++ b/packages/e2e-playwright/.gitignore @@ -0,0 +1,15 @@ +.DS_Store +.thumbs.db +node_modules +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +dist diff --git a/packages/e2e-playwright/README.md b/packages/e2e-playwright/README.md new file mode 100644 index 00000000..9b9b9eec --- /dev/null +++ b/packages/e2e-playwright/README.md @@ -0,0 +1,36 @@ +Quasar App Extension quasar-playwright +=== + +_Be sure to change this readme as appropriate for your app extension._ + +_Think about the organization of this file and how the information will be beneficial to the user._ + +> Add a short description of your App Extension. What does it do? How is it beneficial? Why would someone want to use it? + +A Quasar playwright app extension + +# Install +```bash +quasar ext add quasar-playwright +``` +Quasar CLI will retrieve it from the NPM registry and install the extension to your project. + + +## Prompts + +> Explain the prompts here + + +# Uninstall +```bash +quasar ext remove quasar-playwright +``` + +# Info +> Add longer information here that will help the user of your app extension. + +# Other Info +> Add other information that's not as important to know + +# Donate +If you appreciate the work that went into this App Extension, please consider [donating to Quasar](https://donate.quasar.dev). diff --git a/packages/e2e-playwright/package.json b/packages/e2e-playwright/package.json new file mode 100644 index 00000000..fb6df53c --- /dev/null +++ b/packages/e2e-playwright/package.json @@ -0,0 +1,50 @@ +{ + "name": "@quasar/quasar-app-extension-testing-e2e-playwright", + "version": "0.0.1", + "description": "A Quasar playwright app extension", + "author": "Calson Chiatiah ", + "license": "MIT", + "type": "module", + "scripts": { + "build:esm": "tsc -p tsconfig.json", + "build:cjs": "tsc -p tsconfig-cjs.json", + "build:types": "tsc --emitDeclarationOnly --outDir dist/types", + "build": "rimraf ./dist && yarn build:esm && yarn build:cjs && yarn build:types", + "build:local": "yarn install && yarn build && rimraf node_modules", + "deploy:alpha": "yarn build && yarn publish --tag alpha", + "deploy:beta": "yarn build && yarn publish --tag beta", + "deploy:latest": "yarn build && yarn publish --tag latest", + "prepare": "husky" + }, + "repository": { + "type": "git", + "url": "https://github.com/n05la3/testing-e2e-playwright" + }, + "main": "dist/cjs/main.js", + "module": "dist/esm/main.js", + "bugs": "", + "homepage": "", + "typings": "dist/types/main.d.ts", + "engines": { + "node": ">= 12.2.0", + "npm": ">= 5.6.0", + "yarn": ">= 1.6.0" + }, + "devDependencies": { + "@eslint/js": "^9.18.0", + "@playwright/experimental-ct-vue": "^1.50.0", + "@playwright/test": "^1.49.1", + "@types/node": "^22.10.7", + "@typescript-eslint/eslint-plugin": "^8.20.0", + "@typescript-eslint/parser": "^8.20.0", + "chokidar": "^4.0.3", + "globals": "^15.14.0", + "lint-staged": "^15.5.0", + "typescript": "^5.7.3", + "typescript-eslint": "^8.20.0" + }, + "dependencies": { + "minimatch": "^10.0.1", + "rimraf": "^6.0.1" + } +} diff --git a/packages/e2e-playwright/src/index.js b/packages/e2e-playwright/src/index.js new file mode 100644 index 00000000..41d11168 --- /dev/null +++ b/packages/e2e-playwright/src/index.js @@ -0,0 +1 @@ +export default function (api) {} diff --git a/packages/e2e-playwright/src/uninstall.js b/packages/e2e-playwright/src/uninstall.js new file mode 100644 index 00000000..699d3247 --- /dev/null +++ b/packages/e2e-playwright/src/uninstall.js @@ -0,0 +1,10 @@ +/** + * Quasar App Extension uninstall script + * + * Docs: https://quasar.dev/app-extensions/development-guide/uninstall-api + */ + +// eslint-disable-next-line @typescript-eslint/no-unused-vars +export default function (api) { + // +} From 782ee1d06d5810ac6b2dee3244a544a00d0aed44 Mon Sep 17 00:00:00 2001 From: Calson Chiatiah Date: Wed, 2 Apr 2025 11:19:03 +0100 Subject: [PATCH 03/42] feat(playwright): setup esm and ejs build --- packages/e2e-playwright/package.json | 9 +++++++++ packages/e2e-playwright/tsconfig-cjs.json | 8 ++++++++ packages/e2e-playwright/tsconfig.json | 20 ++++++++++++++++++++ 3 files changed, 37 insertions(+) create mode 100644 packages/e2e-playwright/tsconfig-cjs.json create mode 100644 packages/e2e-playwright/tsconfig.json diff --git a/packages/e2e-playwright/package.json b/packages/e2e-playwright/package.json index fb6df53c..1a3b6732 100644 --- a/packages/e2e-playwright/package.json +++ b/packages/e2e-playwright/package.json @@ -16,6 +16,15 @@ "deploy:latest": "yarn build && yarn publish --tag latest", "prepare": "husky" }, + "exports": { + ".": { + "import": "./dist/esm/main.js", + "require": "./dist/cjs/main.js", + "types": "./dist/types/main.d.ts" + }, + "./package.json": "./package.json", + "./src/index.js": "./src/index.js" + }, "repository": { "type": "git", "url": "https://github.com/n05la3/testing-e2e-playwright" diff --git a/packages/e2e-playwright/tsconfig-cjs.json b/packages/e2e-playwright/tsconfig-cjs.json new file mode 100644 index 00000000..fbf76d10 --- /dev/null +++ b/packages/e2e-playwright/tsconfig-cjs.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "module": "CommonJS", + "outDir": "dist/cjs", + "moduleResolution": "node" + } +} \ No newline at end of file diff --git a/packages/e2e-playwright/tsconfig.json b/packages/e2e-playwright/tsconfig.json new file mode 100644 index 00000000..a13df162 --- /dev/null +++ b/packages/e2e-playwright/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@utils/*": ["src/utils/*"] + }, + "strict": true, + "sourceMap": true, + "target": "ESNext", + "moduleResolution": "node", + "outDir": "dist/esm", + "skipLibCheck": true, + "esModuleInterop": true, + "module": "ESNext", + "allowJs": true, + "declaration": true, + "declarationDir": "dist/types" + }, + "include": ["src/main.ts", "src/*.js"] +} From 31a22fb4d7f595249df9a0a253f51287652d2492 Mon Sep 17 00:00:00 2001 From: Calson Chiatiah Date: Wed, 2 Apr 2025 11:20:12 +0100 Subject: [PATCH 04/42] chore(playwright): setup eslint and husky --- packages/e2e-playwright/.husky/pre-commit | 1 + packages/e2e-playwright/eslint.config.js | 12 + packages/e2e-playwright/package.json | 3 + yarn.lock | 1061 +++++++++++++++++---- 4 files changed, 909 insertions(+), 168 deletions(-) create mode 100755 packages/e2e-playwright/.husky/pre-commit create mode 100644 packages/e2e-playwright/eslint.config.js diff --git a/packages/e2e-playwright/.husky/pre-commit b/packages/e2e-playwright/.husky/pre-commit new file mode 100755 index 00000000..a9fbf9be --- /dev/null +++ b/packages/e2e-playwright/.husky/pre-commit @@ -0,0 +1 @@ +pnpm lint-staged --quiet diff --git a/packages/e2e-playwright/eslint.config.js b/packages/e2e-playwright/eslint.config.js new file mode 100644 index 00000000..4d0b12c0 --- /dev/null +++ b/packages/e2e-playwright/eslint.config.js @@ -0,0 +1,12 @@ +import globals from 'globals'; +import pluginJs from '@eslint/js'; +import tseslint from 'typescript-eslint'; + +/** @type {import('eslint').Linter.Config[]} */ +export default [ + { files: ['**/*.{js,mjs,cjs,ts}'] }, + { languageOptions: { globals: { ...globals.node } } }, + pluginJs.configs.recommended, + ...tseslint.configs.recommended, +]; + diff --git a/packages/e2e-playwright/package.json b/packages/e2e-playwright/package.json index 1a3b6732..3f4221c2 100644 --- a/packages/e2e-playwright/package.json +++ b/packages/e2e-playwright/package.json @@ -47,7 +47,10 @@ "@typescript-eslint/eslint-plugin": "^8.20.0", "@typescript-eslint/parser": "^8.20.0", "chokidar": "^4.0.3", + "eslint": "^9.18.0", + "eslint-plugin-playwright": "^2.1.0", "globals": "^15.14.0", + "husky": "^9.1.7", "lint-staged": "^15.5.0", "typescript": "^5.7.3", "typescript-eslint": "^8.20.0" diff --git a/yarn.lock b/yarn.lock index 4fcfa493..f676dfed 100644 --- a/yarn.lock +++ b/yarn.lock @@ -487,240 +487,240 @@ resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== -"@esbuild/aix-ppc64@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.3.tgz#014180d9a149cffd95aaeead37179433f5ea5437" - integrity sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ== +"@esbuild/aix-ppc64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz#c33cf6bbee34975626b01b80451cbb72b4c6c91d" + integrity sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ== "@esbuild/android-arm64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== -"@esbuild/android-arm64@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.3.tgz#649e47e04ddb24a27dc05c395724bc5f4c55cbfe" - integrity sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ== +"@esbuild/android-arm64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.1.tgz#ea766015c7d2655164f22100d33d7f0308a28d6d" + integrity sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA== "@esbuild/android-arm@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== -"@esbuild/android-arm@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.3.tgz#8a0f719c8dc28a4a6567ef7328c36ea85f568ff4" - integrity sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A== +"@esbuild/android-arm@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.1.tgz#e84d2bf2fe2e6177a0facda3a575b2139fd3cb9c" + integrity sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q== "@esbuild/android-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== -"@esbuild/android-x64@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.3.tgz#e2ab182d1fd06da9bef0784a13c28a7602d78009" - integrity sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ== +"@esbuild/android-x64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.1.tgz#58337bee3bc6d78d10425e5500bd11370cfdfbed" + integrity sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw== "@esbuild/darwin-arm64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== -"@esbuild/darwin-arm64@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.3.tgz#c7f3166fcece4d158a73dcfe71b2672ca0b1668b" - integrity sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w== +"@esbuild/darwin-arm64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.1.tgz#a46805c1c585d451aa83be72500bd6e8495dd591" + integrity sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ== "@esbuild/darwin-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== -"@esbuild/darwin-x64@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.3.tgz#d8c5342ec1a4bf4b1915643dfe031ba4b173a87a" - integrity sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A== +"@esbuild/darwin-x64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.1.tgz#0643e003bb238c63fc93ddbee7d26a003be3cd98" + integrity sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA== "@esbuild/freebsd-arm64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== -"@esbuild/freebsd-arm64@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.3.tgz#9f7d789e2eb7747d4868817417cc968ffa84f35b" - integrity sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw== +"@esbuild/freebsd-arm64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.1.tgz#cff18da5469c09986b93e87979de5d6872fe8f8e" + integrity sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A== "@esbuild/freebsd-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== -"@esbuild/freebsd-x64@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.3.tgz#8ad35c51d084184a8e9e76bb4356e95350a64709" - integrity sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q== +"@esbuild/freebsd-x64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.1.tgz#362fc09c2de14987621c1878af19203c46365dde" + integrity sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww== "@esbuild/linux-arm64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== -"@esbuild/linux-arm64@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.3.tgz#3af0da3d9186092a9edd4e28fa342f57d9e3cd30" - integrity sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A== +"@esbuild/linux-arm64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.1.tgz#aa90d5b02efc97a271e124e6d1cea490634f7498" + integrity sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ== "@esbuild/linux-arm@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== -"@esbuild/linux-arm@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.3.tgz#e91cafa95e4474b3ae3d54da12e006b782e57225" - integrity sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ== +"@esbuild/linux-arm@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.1.tgz#dfcefcbac60a20918b19569b4b657844d39db35a" + integrity sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ== "@esbuild/linux-ia32@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== -"@esbuild/linux-ia32@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.3.tgz#81025732d85b68ee510161b94acdf7e3007ea177" - integrity sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw== +"@esbuild/linux-ia32@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.1.tgz#6f9527077ccb7953ed2af02e013d4bac69f13754" + integrity sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ== "@esbuild/linux-loong64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== -"@esbuild/linux-loong64@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.3.tgz#3c744e4c8d5e1148cbe60a71a11b58ed8ee5deb8" - integrity sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g== +"@esbuild/linux-loong64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.1.tgz#287d2412a5456e5860c2839d42a4b51284d1697c" + integrity sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg== "@esbuild/linux-mips64el@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== -"@esbuild/linux-mips64el@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.3.tgz#1dfe2a5d63702db9034cc6b10b3087cc0424ec26" - integrity sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag== +"@esbuild/linux-mips64el@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.1.tgz#530574b9e1bc5d20f7a4f44c5f045e26f3783d57" + integrity sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg== "@esbuild/linux-ppc64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== -"@esbuild/linux-ppc64@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.3.tgz#2e85d9764c04a1ebb346dc0813ea05952c9a5c56" - integrity sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg== +"@esbuild/linux-ppc64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.1.tgz#5d7e6b283a0b321ea42c6bc0abeb9eb99c1f5589" + integrity sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg== "@esbuild/linux-riscv64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== -"@esbuild/linux-riscv64@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.3.tgz#a9ea3334556b09f85ccbfead58c803d305092415" - integrity sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA== +"@esbuild/linux-riscv64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.1.tgz#14fa0cd073c26b4ee2465d18cd1e18eea7859fa8" + integrity sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ== "@esbuild/linux-s390x@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== -"@esbuild/linux-s390x@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.3.tgz#f6a7cb67969222b200974de58f105dfe8e99448d" - integrity sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ== +"@esbuild/linux-s390x@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.1.tgz#e677b4b9d1b384098752266ccaa0d52a420dc1aa" + integrity sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ== "@esbuild/linux-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== -"@esbuild/linux-x64@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.3.tgz#a237d3578ecdd184a3066b1f425e314ade0f8033" - integrity sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA== +"@esbuild/linux-x64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.1.tgz#f1c796b78fff5ce393658313e8c58613198d9954" + integrity sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA== -"@esbuild/netbsd-arm64@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.3.tgz#4c15c68d8149614ddb6a56f9c85ae62ccca08259" - integrity sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA== +"@esbuild/netbsd-arm64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.1.tgz#0d280b7dfe3973f111b02d5fe9f3063b92796d29" + integrity sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g== "@esbuild/netbsd-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== -"@esbuild/netbsd-x64@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.3.tgz#12f6856f8c54c2d7d0a8a64a9711c01a743878d5" - integrity sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g== +"@esbuild/netbsd-x64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.1.tgz#be663893931a4bb3f3a009c5cc24fa9681cc71c0" + integrity sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA== -"@esbuild/openbsd-arm64@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.3.tgz#ca078dad4a34df192c60233b058db2ca3d94bc5c" - integrity sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ== +"@esbuild/openbsd-arm64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.1.tgz#d9021b884233673a05dc1cc26de0bf325d824217" + integrity sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg== "@esbuild/openbsd-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== -"@esbuild/openbsd-x64@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.3.tgz#c9178adb60e140e03a881d0791248489c79f95b2" - integrity sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w== +"@esbuild/openbsd-x64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.1.tgz#9f1dc1786ed2e2938c404b06bcc48be9a13250de" + integrity sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw== "@esbuild/sunos-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== -"@esbuild/sunos-x64@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.3.tgz#03765eb6d4214ff27e5230af779e80790d1ee09f" - integrity sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA== +"@esbuild/sunos-x64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.1.tgz#89aac24a4b4115959b3f790192cf130396696c27" + integrity sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg== "@esbuild/win32-arm64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== -"@esbuild/win32-arm64@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.3.tgz#f1c867bd1730a9b8dfc461785ec6462e349411ea" - integrity sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ== +"@esbuild/win32-arm64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.1.tgz#354358647a6ea98ea6d243bf48bdd7a434999582" + integrity sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ== "@esbuild/win32-ia32@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== -"@esbuild/win32-ia32@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.3.tgz#77491f59ef6c9ddf41df70670d5678beb3acc322" - integrity sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew== +"@esbuild/win32-ia32@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.1.tgz#8cea7340f2647eba951a041dc95651e3908cd4cb" + integrity sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A== "@esbuild/win32-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== -"@esbuild/win32-x64@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.3.tgz#b17a2171f9074df9e91bfb07ef99a892ac06412a" - integrity sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg== +"@esbuild/win32-x64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.1.tgz#7d79922cb2d88f9048f06393dbf62d2e4accb584" + integrity sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg== "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.5.1" @@ -729,11 +729,42 @@ dependencies: eslint-visitor-keys "^3.4.3" -"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.6.1": +"@eslint-community/regexpp@^4.10.0": + version "4.10.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.1.tgz#361461e5cb3845d874e61731c11cfedd664d83a0" + integrity sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA== + +"@eslint-community/regexpp@^4.12.1": version "4.12.1" resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== +"@eslint-community/regexpp@^4.6.1": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== + +"@eslint/config-array@^0.19.2": + version "0.19.2" + resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.19.2.tgz#3060b809e111abfc97adb0bb1172778b90cb46aa" + integrity sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w== + dependencies: + "@eslint/object-schema" "^2.1.6" + debug "^4.3.1" + minimatch "^3.1.2" + +"@eslint/config-helpers@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.2.0.tgz#12dc8d65c31c4b6c3ebf0758db6601eb7692ce59" + integrity sha512-yJLLmLexii32mGrhW29qvU3QBVTu0GUmEf/J4XsBtVhp4JkIUFN/BjWqTF63yRvGApIDpZm5fa97LtYtINmfeQ== + +"@eslint/core@^0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.12.0.tgz#5f960c3d57728be9f6c65bd84aa6aa613078798e" + integrity sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg== + dependencies: + "@types/json-schema" "^7.0.15" + "@eslint/eslintrc@^2.1.4": version "2.1.4" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" @@ -749,11 +780,44 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" +"@eslint/eslintrc@^3.3.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.3.1.tgz#e55f7f1dd400600dd066dbba349c4c0bac916964" + integrity sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^10.0.1" + globals "^14.0.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + "@eslint/js@8.57.1": version "8.57.1" resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== +"@eslint/js@9.23.0", "@eslint/js@^9.18.0": + version "9.23.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.23.0.tgz#c09ded4f3dc63b40b933bcaeb853fceddb64da30" + integrity sha512-35MJ8vCPU0ZMxo7zfev2pypqTwWTofFZO6m4KAtdoFhRpLJUpHTZZ+KB3C7Hb1d7bULYwO4lJXGCi5Se+8OMbw== + +"@eslint/object-schema@^2.1.6": + version "2.1.6" + resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.6.tgz#58369ab5b5b3ca117880c0f6c0b0f32f6950f24f" + integrity sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA== + +"@eslint/plugin-kit@^0.2.7": + version "0.2.7" + resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.2.7.tgz#9901d52c136fb8f375906a73dcc382646c3b6a27" + integrity sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g== + dependencies: + "@eslint/core" "^0.12.0" + levn "^0.4.1" + "@gar/promisify@^1.0.1": version "1.1.3" resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" @@ -771,6 +835,19 @@ dependencies: "@hapi/hoek" "^9.0.0" +"@humanfs/core@^0.19.1": + version "0.19.1" + resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77" + integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== + +"@humanfs/node@^0.16.6": + version "0.16.6" + resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.6.tgz#ee2a10eaabd1131987bf0488fd9b820174cd765e" + integrity sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw== + dependencies: + "@humanfs/core" "^0.19.1" + "@humanwhocodes/retry" "^0.3.0" + "@humanwhocodes/config-array@^0.13.0": version "0.13.0" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" @@ -790,6 +867,16 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== +"@humanwhocodes/retry@^0.3.0": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.1.tgz#c72a5c76a9fbaf3488e231b13dc52c0da7bab42a" + integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA== + +"@humanwhocodes/retry@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.2.tgz#1860473de7dfa1546767448f333db80cb0ff2161" + integrity sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ== + "@hutson/parse-repository-url@^3.0.0": version "3.0.2" resolved "https://registry.yarnpkg.com/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz#98c23c950a3d9b6c8f0daed06da6c3af06981340" @@ -2070,71 +2157,160 @@ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== +"@playwright/experimental-ct-core@1.51.1": + version "1.51.1" + resolved "https://registry.yarnpkg.com/@playwright/experimental-ct-core/-/experimental-ct-core-1.51.1.tgz#226960d5a28bc8441c83566610873df97a9420bd" + integrity sha512-kpRZWBT3SMukL1fx8BwEj385Pkgtp86bBKzmrmJU30lWlQiIDFNaIHosgxQC68c8y2mg3Una/lBSHNc2Fotgkw== + dependencies: + playwright "1.51.1" + playwright-core "1.51.1" + vite "^5.4.14 || ^6.0.0" + +"@playwright/experimental-ct-vue@^1.50.0": + version "1.51.1" + resolved "https://registry.yarnpkg.com/@playwright/experimental-ct-vue/-/experimental-ct-vue-1.51.1.tgz#e67db0043c3cb50c70c3e1902e9ca43fa6251a37" + integrity sha512-/VvLxreuqaRbf8I5MMHjgLIdq9cnD7gv7B8aUe9lyWTj3sib+emx3vWgW2GJSgC8wmwKABi8Zx8dbbAd+mOFlQ== + dependencies: + "@playwright/experimental-ct-core" "1.51.1" + "@vitejs/plugin-vue" "^5.2.0" + +"@playwright/test@^1.49.1": + version "1.51.1" + resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.51.1.tgz#75357d513221a7be0baad75f01e966baf9c41a2e" + integrity sha512-nM+kEaTSAoVlXmMPH10017vn3FSiFqr/bh4fKg9vmAdMfd9SDqRZNvPSiAHADc/itWak+qPvMPZQOPwCBW7k7Q== + dependencies: + playwright "1.51.1" + "@polka/url@^1.0.0-next.24": version "1.0.0-next.28" resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.28.tgz#d45e01c4a56f143ee69c54dd6b12eade9e270a73" integrity sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw== +"@rollup/rollup-android-arm-eabi@4.36.0": + version "4.36.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.36.0.tgz#6229c36cddc172c468f53107f2b7aebe2585609b" + integrity sha512-jgrXjjcEwN6XpZXL0HUeOVGfjXhPyxAbbhD0BlXUB+abTOpbPiN5Wb3kOT7yb+uEtATNYF5x5gIfwutmuBA26w== + "@rollup/rollup-android-arm-eabi@4.40.1": version "4.40.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.1.tgz#e1562d360bca73c7bef6feef86098de3a2f1d442" integrity sha512-kxz0YeeCrRUHz3zyqvd7n+TVRlNyTifBsmnmNPtk3hQURUyG9eAB+usz6DAwagMusjx/zb3AjvDUvhFGDAexGw== +"@rollup/rollup-android-arm64@4.36.0": + version "4.36.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.36.0.tgz#d38163692d0729bd64a026c13749ecac06f847e8" + integrity sha512-NyfuLvdPdNUfUNeYKUwPwKsE5SXa2J6bCt2LdB/N+AxShnkpiczi3tcLJrm5mA+eqpy0HmaIY9F6XCa32N5yzg== + "@rollup/rollup-android-arm64@4.40.1": version "4.40.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.1.tgz#37ba63940211673e15dcc5f469a78e34276dbca7" integrity sha512-PPkxTOisoNC6TpnDKatjKkjRMsdaWIhyuMkA4UsBXT9WEZY4uHezBTjs6Vl4PbqQQeu6oION1w2voYZv9yquCw== +"@rollup/rollup-darwin-arm64@4.36.0": + version "4.36.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.36.0.tgz#82601b8ff81f3dbaef28017aa3d0e9709edc99c0" + integrity sha512-JQ1Jk5G4bGrD4pWJQzWsD8I1n1mgPXq33+/vP4sk8j/z/C2siRuxZtaUA7yMTf71TCZTZl/4e1bfzwUmFb3+rw== + "@rollup/rollup-darwin-arm64@4.40.1": version "4.40.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.1.tgz#58b1eb86d997d71dabc5b78903233a3c27438ca0" integrity sha512-VWXGISWFY18v/0JyNUy4A46KCFCb9NVsH+1100XP31lud+TzlezBbz24CYzbnA4x6w4hx+NYCXDfnvDVO6lcAA== +"@rollup/rollup-darwin-x64@4.36.0": + version "4.36.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.36.0.tgz#0e961354fb2bf26d691810ca61dc861d9a1e94b2" + integrity sha512-6c6wMZa1lrtiRsbDziCmjE53YbTkxMYhhnWnSW8R/yqsM7a6mSJ3uAVT0t8Y/DGt7gxUWYuFM4bwWk9XCJrFKA== + "@rollup/rollup-darwin-x64@4.40.1": version "4.40.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.1.tgz#5e22dab3232b1e575d930ce891abb18fe19c58c9" integrity sha512-nIwkXafAI1/QCS7pxSpv/ZtFW6TXcNUEHAIA9EIyw5OzxJZQ1YDrX+CL6JAIQgZ33CInl1R6mHet9Y/UZTg2Bw== +"@rollup/rollup-freebsd-arm64@4.36.0": + version "4.36.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.36.0.tgz#6aee296cd6b8c39158d377c89b7e0cd0851dd7c7" + integrity sha512-KXVsijKeJXOl8QzXTsA+sHVDsFOmMCdBRgFmBb+mfEb/7geR7+C8ypAml4fquUt14ZyVXaw2o1FWhqAfOvA4sg== + "@rollup/rollup-freebsd-arm64@4.40.1": version "4.40.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.1.tgz#04c892d9ff864d66e31419634726ab0bebb33707" integrity sha512-BdrLJ2mHTrIYdaS2I99mriyJfGGenSaP+UwGi1kB9BLOCu9SR8ZpbkmmalKIALnRw24kM7qCN0IOm6L0S44iWw== +"@rollup/rollup-freebsd-x64@4.36.0": + version "4.36.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.36.0.tgz#432e49d93942225ac1b4d98254a6fb6ca0afcd17" + integrity sha512-dVeWq1ebbvByI+ndz4IJcD4a09RJgRYmLccwlQ8bPd4olz3Y213uf1iwvc7ZaxNn2ab7bjc08PrtBgMu6nb4pQ== + "@rollup/rollup-freebsd-x64@4.40.1": version "4.40.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.1.tgz#f4b1e091f7cf5afc9e3a029d70128ad56409ecfb" integrity sha512-VXeo/puqvCG8JBPNZXZf5Dqq7BzElNJzHRRw3vjBE27WujdzuOPecDPc/+1DcdcTptNBep3861jNq0mYkT8Z6Q== +"@rollup/rollup-linux-arm-gnueabihf@4.36.0": + version "4.36.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.36.0.tgz#a66910c6c63b46d45f239528ad5509097f8df885" + integrity sha512-bvXVU42mOVcF4le6XSjscdXjqx8okv4n5vmwgzcmtvFdifQ5U4dXFYaCB87namDRKlUL9ybVtLQ9ztnawaSzvg== + "@rollup/rollup-linux-arm-gnueabihf@4.40.1": version "4.40.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.1.tgz#c8814bb5ce047a81b1fe4a33628dfd4ac52bd864" integrity sha512-ehSKrewwsESPt1TgSE/na9nIhWCosfGSFqv7vwEtjyAqZcvbGIg4JAcV7ZEh2tfj/IlfBeZjgOXm35iOOjadcg== +"@rollup/rollup-linux-arm-musleabihf@4.36.0": + version "4.36.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.36.0.tgz#1cfadc70d44501b0a58615a460cf1b6ec8cfddf3" + integrity sha512-JFIQrDJYrxOnyDQGYkqnNBtjDwTgbasdbUiQvcU8JmGDfValfH1lNpng+4FWlhaVIR4KPkeddYjsVVbmJYvDcg== + "@rollup/rollup-linux-arm-musleabihf@4.40.1": version "4.40.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.1.tgz#5b4e7bd83cbebbf5ffe958802dcfd4ee34bf73a3" integrity sha512-m39iO/aaurh5FVIu/F4/Zsl8xppd76S4qoID8E+dSRQvTyZTOI2gVk3T4oqzfq1PtcvOfAVlwLMK3KRQMaR8lg== +"@rollup/rollup-linux-arm64-gnu@4.36.0": + version "4.36.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.36.0.tgz#d32e42b25216472dfdc5cb7df6a37667766d3855" + integrity sha512-KqjYVh3oM1bj//5X7k79PSCZ6CvaVzb7Qs7VMWS+SlWB5M8p3FqufLP9VNp4CazJ0CsPDLwVD9r3vX7Ci4J56A== + "@rollup/rollup-linux-arm64-gnu@4.40.1": version "4.40.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.1.tgz#141c848e53cee011e82a11777b8a51f1b3e8d77c" integrity sha512-Y+GHnGaku4aVLSgrT0uWe2o2Rq8te9hi+MwqGF9r9ORgXhmHK5Q71N757u0F8yU1OIwUIFy6YiJtKjtyktk5hg== +"@rollup/rollup-linux-arm64-musl@4.36.0": + version "4.36.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.36.0.tgz#d742917d61880941be26ff8d3352d935139188b9" + integrity sha512-QiGnhScND+mAAtfHqeT+cB1S9yFnNQ/EwCg5yE3MzoaZZnIV0RV9O5alJAoJKX/sBONVKeZdMfO8QSaWEygMhw== + "@rollup/rollup-linux-arm64-musl@4.40.1": version "4.40.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.1.tgz#22ebeaf2fa301aa4aa6c84b760e6cd1d1ac7eb1e" integrity sha512-jEwjn3jCA+tQGswK3aEWcD09/7M5wGwc6+flhva7dsQNRZZTe30vkalgIzV4tjkopsTS9Jd7Y1Bsj6a4lzz8gQ== +"@rollup/rollup-linux-loongarch64-gnu@4.36.0": + version "4.36.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.36.0.tgz#9ad12d1a5d3abf4ecb90fbe1a49249608cee8cbb" + integrity sha512-1ZPyEDWF8phd4FQtTzMh8FQwqzvIjLsl6/84gzUxnMNFBtExBtpL51H67mV9xipuxl1AEAerRBgBwFNpkw8+Lg== + "@rollup/rollup-linux-loongarch64-gnu@4.40.1": version "4.40.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.1.tgz#20b77dc78e622f5814ff8e90c14c938ceb8043bc" integrity sha512-ySyWikVhNzv+BV/IDCsrraOAZ3UaC8SZB67FZlqVwXwnFhPihOso9rPOxzZbjp81suB1O2Topw+6Ug3JNegejQ== +"@rollup/rollup-linux-powerpc64le-gnu@4.36.0": + version "4.36.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.36.0.tgz#c3ca6f5ce4a8b785dd450113660d9529a75fdf2a" + integrity sha512-VMPMEIUpPFKpPI9GZMhJrtu8rxnp6mJR3ZzQPykq4xc2GmdHj3Q4cA+7avMyegXy4n1v+Qynr9fR88BmyO74tg== + "@rollup/rollup-linux-powerpc64le-gnu@4.40.1": version "4.40.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.1.tgz#2c90f99c987ef1198d4f8d15d754c286e1f07b13" integrity sha512-BvvA64QxZlh7WZWqDPPdt0GH4bznuL6uOO1pmgPnnv86rpUpc8ZxgZwcEgXvo02GRIZX1hQ0j0pAnhwkhwPqWg== +"@rollup/rollup-linux-riscv64-gnu@4.36.0": + version "4.36.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.36.0.tgz#05eb5e71db5b5b1d1a3428265a63c5f6f8a1e4b8" + integrity sha512-ttE6ayb/kHwNRJGYLpuAvB7SMtOeQnVXEIpMtAvx3kepFQeowVED0n1K9nAdraHUPJ5hydEMxBpIR7o4nrm8uA== + "@rollup/rollup-linux-riscv64-gnu@4.40.1": version "4.40.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.1.tgz#9336fd5e47d7f4760d02aa85f76976176eef53ca" @@ -2145,31 +2321,61 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.1.tgz#d75b4d54d46439bb5c6c13762788f57e798f5670" integrity sha512-n/vQ4xRZXKuIpqukkMXZt9RWdl+2zgGNx7Uda8NtmLJ06NL8jiHxUawbwC+hdSq1rrw/9CghCpEONor+l1e2gA== +"@rollup/rollup-linux-s390x-gnu@4.36.0": + version "4.36.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.36.0.tgz#6fa895f181fa6804bc6ca27c0e9a6823355436dd" + integrity sha512-4a5gf2jpS0AIe7uBjxDeUMNcFmaRTbNv7NxI5xOCs4lhzsVyGR/0qBXduPnoWf6dGC365saTiwag8hP1imTgag== + "@rollup/rollup-linux-s390x-gnu@4.40.1": version "4.40.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.1.tgz#e9f09b802f1291839247399028beaef9ce034c81" integrity sha512-h8d28xzYb98fMQKUz0w2fMc1XuGzLLjdyxVIbhbil4ELfk5/orZlSTpF/xdI9C8K0I8lCkq+1En2RJsawZekkg== +"@rollup/rollup-linux-x64-gnu@4.36.0": + version "4.36.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.36.0.tgz#d2e69f7598c71f03287b763fdbefce4163f07419" + integrity sha512-5KtoW8UWmwFKQ96aQL3LlRXX16IMwyzMq/jSSVIIyAANiE1doaQsx/KRyhAvpHlPjPiSU/AYX/8m+lQ9VToxFQ== + "@rollup/rollup-linux-x64-gnu@4.40.1": version "4.40.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.1.tgz#0413169dc00470667dea8575c1129d4e7a73eb29" integrity sha512-XiK5z70PEFEFqcNj3/zRSz/qX4bp4QIraTy9QjwJAb/Z8GM7kVUsD0Uk8maIPeTyPCP03ChdI+VVmJriKYbRHQ== +"@rollup/rollup-linux-x64-musl@4.36.0": + version "4.36.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.36.0.tgz#9eb0075deaabf5d88a9dc8b61bd7bd122ac64ef9" + integrity sha512-sycrYZPrv2ag4OCvaN5js+f01eoZ2U+RmT5as8vhxiFz+kxwlHrsxOwKPSA8WyS+Wc6Epid9QeI/IkQ9NkgYyQ== + "@rollup/rollup-linux-x64-musl@4.40.1": version "4.40.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.1.tgz#c76fd593323c60ea219439a00da6c6d33ffd0ea6" integrity sha512-2BRORitq5rQ4Da9blVovzNCMaUlyKrzMSvkVR0D4qPuOy/+pMCrh1d7o01RATwVy+6Fa1WBw+da7QPeLWU/1mQ== +"@rollup/rollup-win32-arm64-msvc@4.36.0": + version "4.36.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.36.0.tgz#bfda7178ed8cb8fa8786474a02eae9fc8649a74d" + integrity sha512-qbqt4N7tokFwwSVlWDsjfoHgviS3n/vZ8LK0h1uLG9TYIRuUTJC88E1xb3LM2iqZ/WTqNQjYrtmtGmrmmawB6A== + "@rollup/rollup-win32-arm64-msvc@4.40.1": version "4.40.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.1.tgz#c7724c386eed0bda5ae7143e4081c1910cab349b" integrity sha512-b2bcNm9Kbde03H+q+Jjw9tSfhYkzrDUf2d5MAd1bOJuVplXvFhWz7tRtWvD8/ORZi7qSCy0idW6tf2HgxSXQSg== +"@rollup/rollup-win32-ia32-msvc@4.36.0": + version "4.36.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.36.0.tgz#8e12739b9c43de8f0690b280c676af3de571cee0" + integrity sha512-t+RY0JuRamIocMuQcfwYSOkmdX9dtkr1PbhKW42AMvaDQa+jOdpUYysroTF/nuPpAaQMWp7ye+ndlmmthieJrQ== + "@rollup/rollup-win32-ia32-msvc@4.40.1": version "4.40.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.1.tgz#7749e1b65cb64fe6d41ad1ad9e970a0ccc8ac350" integrity sha512-DfcogW8N7Zg7llVEfpqWMZcaErKfsj9VvmfSyRjCyo4BI3wPEfrzTtJkZG6gKP/Z92wFm6rz2aDO7/JfiR/whA== +"@rollup/rollup-win32-x64-msvc@4.36.0": + version "4.36.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.36.0.tgz#88b23fe29d28fa647030b36e912c1b5b50831b1d" + integrity sha512-aRXd7tRZkWLqGbChgcMMDEHjOKudo1kChb1Jt1IfR8cY/KIpgNviLeJy5FUb9IpSuQj8dU2fAYNMPW/hLKOSTw== + "@rollup/rollup-win32-x64-msvc@4.40.1": version "4.40.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.1.tgz#8078b71fe0d5825dcbf83d52a7dc858b39da165c" @@ -2304,16 +2510,16 @@ dependencies: "@babel/types" "^7.20.7" +"@types/estree@1.0.6", "@types/estree@^1.0.0", "@types/estree@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" + integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== + "@types/estree@1.0.7": version "1.0.7" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.7.tgz#4158d3105276773d5b7695cd4834b1722e4f37a8" integrity sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ== -"@types/estree@^1.0.0": - version "1.0.6" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" - integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== - "@types/graceful-fs@^4.1.3": version "4.1.9" resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" @@ -2349,6 +2555,11 @@ "@types/tough-cookie" "*" parse5 "^7.0.0" +"@types/json-schema@^7.0.15": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + "@types/lodash-es@^4.17.12": version "4.17.12" resolved "https://registry.yarnpkg.com/@types/lodash-es/-/lodash-es-4.17.12.tgz#65f6d1e5f80539aa7cfbfc962de5def0cf4f341b" @@ -2386,11 +2597,18 @@ undici-types "~6.20.0" "@types/node@^20.14.6": - version "20.17.24" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.17.24.tgz#2325476954e6fc8c2f11b9c61e26ba6eb7d3f5b6" - integrity sha512-d7fGCyB96w9BnWQrOsJtpyiSaBcAYYr75bnK6ZRjDbql2cGLj/3GsL5OYmLPNq76l7Gf2q4Rv9J2o6h5CrD9sA== + version "20.14.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.6.tgz#f3c19ffc98c2220e18de259bb172dd4d892a6075" + integrity sha512-JbA0XIJPL1IiNnU7PFxDXyfAwcwVVrOoqyzzyQTyMeVhBzkJVMSkC1LlVsRQ2lpqiY4n6Bb9oCS6lzDKVQxbZw== dependencies: - undici-types "~6.19.2" + undici-types "~5.26.4" + +"@types/node@^22.10.7": + version "22.13.11" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.13.11.tgz#f0ed6b302dcf0f4229d44ea707e77484ad46d234" + integrity sha512-iEUCUJoU0i3VnrCmgoWCXttklWcvoCIx4jzcP22fioIVSdTmjgoEvmAO/QPw6TcS9k5FrNgn4w7q5lGOd1CT5g== + dependencies: + undici-types "~6.20.0" "@types/normalize-package-data@^2.4.0": version "2.4.4" @@ -2456,6 +2674,21 @@ dependencies: "@types/node" "*" +"@typescript-eslint/eslint-plugin@8.27.0", "@typescript-eslint/eslint-plugin@^8.20.0": + version "8.27.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.27.0.tgz#fbef10802365832ee1d1bd5d2117dcec82727a72" + integrity sha512-4henw4zkePi5p252c8ncBLzLce52SEUz2Ebj8faDnuUXz2UuHEONYcJ+G0oaCF+bYCWVZtrGzq3FD7YXetmnSA== + dependencies: + "@eslint-community/regexpp" "^4.10.0" + "@typescript-eslint/scope-manager" "8.27.0" + "@typescript-eslint/type-utils" "8.27.0" + "@typescript-eslint/utils" "8.27.0" + "@typescript-eslint/visitor-keys" "8.27.0" + graphemer "^1.4.0" + ignore "^5.3.1" + natural-compare "^1.4.0" + ts-api-utils "^2.0.1" + "@typescript-eslint/eslint-plugin@^7.13.1": version "7.18.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz#b16d3cf3ee76bf572fdf511e79c248bdec619ea3" @@ -2471,6 +2704,17 @@ natural-compare "^1.4.0" ts-api-utils "^1.3.0" +"@typescript-eslint/parser@8.27.0", "@typescript-eslint/parser@^8.20.0": + version "8.27.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.27.0.tgz#3f6beaa83934467eda34ae82ef04090014df8227" + integrity sha512-XGwIabPallYipmcOk45DpsBSgLC64A0yvdAkrwEzwZ2viqGqRUJ8eEYoPz0CWnutgAFbNMPdsGGvzjSmcWVlEA== + dependencies: + "@typescript-eslint/scope-manager" "8.27.0" + "@typescript-eslint/types" "8.27.0" + "@typescript-eslint/typescript-estree" "8.27.0" + "@typescript-eslint/visitor-keys" "8.27.0" + debug "^4.3.4" + "@typescript-eslint/parser@^7.13.1": version "7.18.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.18.0.tgz#83928d0f1b7f4afa974098c64b5ce6f9051f96a0" @@ -2498,6 +2742,14 @@ "@typescript-eslint/types" "8.26.1" "@typescript-eslint/visitor-keys" "8.26.1" +"@typescript-eslint/scope-manager@8.27.0": + version "8.27.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.27.0.tgz#b51042927067d677fbfc471605cf40d1ffaee482" + integrity sha512-8oI9GwPMQmBryaaxG1tOZdxXVeMDte6NyJA4i7/TWa4fBwgnAXYlIQP+uYOeqAaLJ2JRxlG9CAyL+C+YE9Xknw== + dependencies: + "@typescript-eslint/types" "8.27.0" + "@typescript-eslint/visitor-keys" "8.27.0" + "@typescript-eslint/type-utils@7.18.0": version "7.18.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz#2165ffaee00b1fbbdd2d40aa85232dab6998f53b" @@ -2508,6 +2760,16 @@ debug "^4.3.4" ts-api-utils "^1.3.0" +"@typescript-eslint/type-utils@8.27.0": + version "8.27.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.27.0.tgz#af3c4eefcb64455ee50aae2d7069918467af085c" + integrity sha512-wVArTVcz1oJOIEJxui/nRhV0TXzD/zMSOYi/ggCfNq78EIszddXcJb7r4RCp/oBrjt8n9A0BSxRMKxHftpDxDA== + dependencies: + "@typescript-eslint/typescript-estree" "8.27.0" + "@typescript-eslint/utils" "8.27.0" + debug "^4.3.4" + ts-api-utils "^2.0.1" + "@typescript-eslint/types@7.18.0": version "7.18.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.18.0.tgz#b90a57ccdea71797ffffa0321e744f379ec838c9" @@ -2518,6 +2780,11 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.26.1.tgz#d5978721670cff263348d5062773389231a64132" integrity sha512-n4THUQW27VmQMx+3P+B0Yptl7ydfceUj4ON/AQILAASwgYdZ/2dhfymRMh5egRUrvK5lSmaOm77Ry+lmXPOgBQ== +"@typescript-eslint/types@8.27.0": + version "8.27.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.27.0.tgz#3dd01ced4c81e798d1106fda0904f8d5c91051aa" + integrity sha512-/6cp9yL72yUHAYq9g6DsAU+vVfvQmd1a8KyA81uvfDE21O2DwQ/qxlM4AR8TSdAu+kJLBDrEHKC5/W2/nxsY0A== + "@typescript-eslint/typescript-estree@7.18.0": version "7.18.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz#b5868d486c51ce8f312309ba79bdb9f331b37931" @@ -2546,6 +2813,20 @@ semver "^7.6.0" ts-api-utils "^2.0.1" +"@typescript-eslint/typescript-estree@8.27.0": + version "8.27.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.27.0.tgz#4e02a1056454a84418cc9bce7c00b1c08b03567a" + integrity sha512-BnKq8cqPVoMw71O38a1tEb6iebEgGA80icSxW7g+kndx0o6ot6696HjG7NdgfuAVmVEtwXUr3L8R9ZuVjoQL6A== + dependencies: + "@typescript-eslint/types" "8.27.0" + "@typescript-eslint/visitor-keys" "8.27.0" + debug "^4.3.4" + fast-glob "^3.3.2" + is-glob "^4.0.3" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^2.0.1" + "@typescript-eslint/utils@7.18.0": version "7.18.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.18.0.tgz#bca01cde77f95fc6a8d5b0dbcbfb3d6ca4be451f" @@ -2556,6 +2837,16 @@ "@typescript-eslint/types" "7.18.0" "@typescript-eslint/typescript-estree" "7.18.0" +"@typescript-eslint/utils@8.27.0": + version "8.27.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.27.0.tgz#d9c2a4891c6a85b952a9d5f9656c379ab111cf6d" + integrity sha512-njkodcwH1yvmo31YWgRHNb/x1Xhhq4/m81PhtvmRngD8iHPehxffz1SNCO+kwaePhATC+kOa/ggmvPoPza5i0Q== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@typescript-eslint/scope-manager" "8.27.0" + "@typescript-eslint/types" "8.27.0" + "@typescript-eslint/typescript-estree" "8.27.0" + "@typescript-eslint/utils@^6.0.0 || ^7.0.0 || ^8.0.0": version "8.26.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.26.1.tgz#54cc58469955f25577f659753b71a0e117a0539f" @@ -2582,11 +2873,24 @@ "@typescript-eslint/types" "8.26.1" eslint-visitor-keys "^4.2.0" +"@typescript-eslint/visitor-keys@8.27.0": + version "8.27.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.27.0.tgz#4a13e9d7ad7e311a07ea1b178b4c9f848ce11334" + integrity sha512-WsXQwMkILJvffP6z4U3FYJPlbf/j07HIxmDjZpbNvBJkMfvwXj5ACRkkHwBDvLBbDbtX5TdU64/rcvKJ/vuInQ== + dependencies: + "@typescript-eslint/types" "8.27.0" + eslint-visitor-keys "^4.2.0" + "@ungap/structured-clone@^1.2.0": version "1.3.0" resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz#d06bbb384ebcf6c505fde1c3d0ed4ddffe0aaff8" integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== +"@vitejs/plugin-vue@^5.2.0": + version "5.2.3" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-5.2.3.tgz#71a8fc82d4d2e425af304c35bf389506f674d89b" + integrity sha512-IYSLEQj4LgZZuoVpdSUCw3dIynTWQgPlaRP6iAvMle4My0HdYwr5g5wQAfwOeHQBmYwEkqF70nRpSilr6PoUDg== + "@vitest/expect@3.1.2": version "3.1.2" resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-3.1.2.tgz#b203a7ad2efa6af96c85f6c116216bda259d2bc8" @@ -2889,6 +3193,13 @@ ansi-escapes@^4.2.1, ansi-escapes@^4.3.0, ansi-escapes@^4.3.2: dependencies: type-fest "^0.21.3" +ansi-escapes@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-7.0.0.tgz#00fc19f491bbb18e1d481b97868204f92109bfe7" + integrity sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw== + dependencies: + environment "^1.0.0" + ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" @@ -2928,7 +3239,7 @@ ansi-styles@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== -ansi-styles@^6.1.0: +ansi-styles@^6.0.0, ansi-styles@^6.1.0, ansi-styles@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== @@ -3285,7 +3596,7 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^3.0.3: +braces@^3.0.2, braces@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== @@ -3514,6 +3825,11 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chalk@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.4.1.tgz#1b48bf0963ec158dce2aacf69c093ae2dd2092d8" + integrity sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w== + char-regex@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" @@ -3551,6 +3867,13 @@ check-more-types@2.24.0, check-more-types@^2.24.0: resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600" integrity sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA== +chokidar@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30" + integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== + dependencies: + readdirp "^4.0.1" + chownr@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" @@ -3621,6 +3944,13 @@ cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" +cli-cursor@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-5.0.0.tgz#24a4831ecf5a6b01ddeb32fb71a4b2088b0dce38" + integrity sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw== + dependencies: + restore-cursor "^5.0.0" + cli-table3@~0.6.5: version "0.6.5" resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.5.tgz#013b91351762739c16a9567c21a04632e449bf2f" @@ -3638,6 +3968,14 @@ cli-truncate@^2.1.0: slice-ansi "^3.0.0" string-width "^4.2.0" +cli-truncate@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-4.0.0.tgz#6cc28a2924fee9e25ce91e973db56c7066e6172a" + integrity sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA== + dependencies: + slice-ansi "^5.0.0" + string-width "^7.0.0" + cli-width@^2.0.0: version "2.2.1" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" @@ -3749,7 +4087,7 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -colorette@^2.0.16: +colorette@^2.0.16, colorette@^2.0.20: version "2.0.20" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== @@ -3784,6 +4122,11 @@ commander@^10.0.0: resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== +commander@^13.1.0: + version "13.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-13.1.0.tgz#776167db68c78f38dcce1f9b8d7b8b9a488abf46" + integrity sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw== + commander@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" @@ -4459,6 +4802,11 @@ emittery@^0.13.1: resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== +emoji-regex@^10.3.0: + version "10.4.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.4.0.tgz#03553afea80b3975749cfcb36f776ca268e413d4" + integrity sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw== + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -4506,6 +4854,11 @@ envinfo@^7.7.4: resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.14.0.tgz#26dac5db54418f2a4c1159153a0b2ae980838aae" integrity sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg== +environment@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/environment/-/environment-1.1.0.tgz#8e86c66b180f363c7ab311787e0259665f45a9f1" + integrity sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q== + err-code@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" @@ -4627,35 +4980,35 @@ es6-error@^4.0.1, es6-error@^4.1.1: integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== esbuild@^0.25.0: - version "0.25.3" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.3.tgz#371f7cb41283e5b2191a96047a7a89562965a285" - integrity sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q== + version "0.25.1" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.1.tgz#a16b8d070b6ad4871935277bda6ccfe852e3fa2f" + integrity sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ== optionalDependencies: - "@esbuild/aix-ppc64" "0.25.3" - "@esbuild/android-arm" "0.25.3" - "@esbuild/android-arm64" "0.25.3" - "@esbuild/android-x64" "0.25.3" - "@esbuild/darwin-arm64" "0.25.3" - "@esbuild/darwin-x64" "0.25.3" - "@esbuild/freebsd-arm64" "0.25.3" - "@esbuild/freebsd-x64" "0.25.3" - "@esbuild/linux-arm" "0.25.3" - "@esbuild/linux-arm64" "0.25.3" - "@esbuild/linux-ia32" "0.25.3" - "@esbuild/linux-loong64" "0.25.3" - "@esbuild/linux-mips64el" "0.25.3" - "@esbuild/linux-ppc64" "0.25.3" - "@esbuild/linux-riscv64" "0.25.3" - "@esbuild/linux-s390x" "0.25.3" - "@esbuild/linux-x64" "0.25.3" - "@esbuild/netbsd-arm64" "0.25.3" - "@esbuild/netbsd-x64" "0.25.3" - "@esbuild/openbsd-arm64" "0.25.3" - "@esbuild/openbsd-x64" "0.25.3" - "@esbuild/sunos-x64" "0.25.3" - "@esbuild/win32-arm64" "0.25.3" - "@esbuild/win32-ia32" "0.25.3" - "@esbuild/win32-x64" "0.25.3" + "@esbuild/aix-ppc64" "0.25.1" + "@esbuild/android-arm" "0.25.1" + "@esbuild/android-arm64" "0.25.1" + "@esbuild/android-x64" "0.25.1" + "@esbuild/darwin-arm64" "0.25.1" + "@esbuild/darwin-x64" "0.25.1" + "@esbuild/freebsd-arm64" "0.25.1" + "@esbuild/freebsd-x64" "0.25.1" + "@esbuild/linux-arm" "0.25.1" + "@esbuild/linux-arm64" "0.25.1" + "@esbuild/linux-ia32" "0.25.1" + "@esbuild/linux-loong64" "0.25.1" + "@esbuild/linux-mips64el" "0.25.1" + "@esbuild/linux-ppc64" "0.25.1" + "@esbuild/linux-riscv64" "0.25.1" + "@esbuild/linux-s390x" "0.25.1" + "@esbuild/linux-x64" "0.25.1" + "@esbuild/netbsd-arm64" "0.25.1" + "@esbuild/netbsd-x64" "0.25.1" + "@esbuild/openbsd-arm64" "0.25.1" + "@esbuild/openbsd-x64" "0.25.1" + "@esbuild/sunos-x64" "0.25.1" + "@esbuild/win32-arm64" "0.25.1" + "@esbuild/win32-ia32" "0.25.1" + "@esbuild/win32-x64" "0.25.1" esbuild@~0.21.5: version "0.21.5" @@ -4736,6 +5089,13 @@ eslint-plugin-jest@^28.8.3: dependencies: "@typescript-eslint/utils" "^6.0.0 || ^7.0.0 || ^8.0.0" +eslint-plugin-playwright@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-playwright/-/eslint-plugin-playwright-2.2.0.tgz#d7eda21e670274fc0c006e11ba5cc2c8417b2a6e" + integrity sha512-qSQpAw7RcSzE3zPp8FMGkthaCWovHZ/BsXtpmnGax9vQLIovlh1bsZHEa2+j2lv9DWhnyeLM/qZmp7ffQZfQvg== + dependencies: + globals "^13.23.0" + eslint-scope@^7.2.2: version "7.2.2" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" @@ -4744,6 +5104,14 @@ eslint-scope@^7.2.2: esrecurse "^4.3.0" estraverse "^5.2.0" +eslint-scope@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.3.0.tgz#10cd3a918ffdd722f5f3f7b5b83db9b23c87340d" + integrity sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: version "3.4.3" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" @@ -4798,7 +5166,48 @@ eslint@^8.49.0: strip-ansi "^6.0.1" text-table "^0.2.0" -espree@^10.3.0: +eslint@^9.18.0: + version "9.23.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.23.0.tgz#b88f3ab6dc83bcb927fdb54407c69ffe5f2441a6" + integrity sha512-jV7AbNoFPAY1EkFYpLq5bslU9NLNO8xnEeQXwErNibVryjk67wHVmddTBilc5srIttJDBrB0eMHKZBFbSIABCw== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.12.1" + "@eslint/config-array" "^0.19.2" + "@eslint/config-helpers" "^0.2.0" + "@eslint/core" "^0.12.0" + "@eslint/eslintrc" "^3.3.1" + "@eslint/js" "9.23.0" + "@eslint/plugin-kit" "^0.2.7" + "@humanfs/node" "^0.16.6" + "@humanwhocodes/module-importer" "^1.0.1" + "@humanwhocodes/retry" "^0.4.2" + "@types/estree" "^1.0.6" + "@types/json-schema" "^7.0.15" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.6" + debug "^4.3.2" + escape-string-regexp "^4.0.0" + eslint-scope "^8.3.0" + eslint-visitor-keys "^4.2.0" + espree "^10.3.0" + esquery "^1.5.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^8.0.0" + find-up "^5.0.0" + glob-parent "^6.0.2" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + json-stable-stringify-without-jsonify "^1.0.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + +espree@^10.0.1, espree@^10.3.0: version "10.3.0" resolved "https://registry.yarnpkg.com/espree/-/espree-10.3.0.tgz#29267cf5b0cb98735b65e64ba07e0ed49d1eed8a" integrity sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg== @@ -4821,7 +5230,7 @@ esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.4.2: +esquery@^1.4.2, esquery@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== @@ -4880,6 +5289,11 @@ eventemitter3@^4.0.4: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== +eventemitter3@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" + integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== + execa@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" @@ -4923,6 +5337,21 @@ execa@^0.7.0: signal-exit "^3.0.0" strip-eof "^1.0.0" +execa@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" + integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^8.0.1" + human-signals "^5.0.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^4.1.0" + strip-final-newline "^3.0.0" + executable@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c" @@ -5073,6 +5502,13 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" +file-entry-cache@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" + integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== + dependencies: + flat-cache "^4.0.0" + filelist@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" @@ -5149,7 +5585,20 @@ flat-cache@^3.0.4: keyv "^4.5.3" rimraf "^3.0.2" -flatted@^3.2.9, flatted@^3.3.3: +flat-cache@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" + integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.4" + +flatted@^3.2.9: + version "3.3.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== + +flatted@^3.3.3: version "3.3.3" resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== @@ -5250,6 +5699,11 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== +fsevents@2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + fsevents@^2.3.2, fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" @@ -5301,6 +5755,11 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-east-asian-width@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz#21b4071ee58ed04ee0db653371b55b4299875389" + integrity sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ== + get-func-name@^2.0.1, get-func-name@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" @@ -5367,6 +5826,11 @@ get-stream@^6.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== +get-stream@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" + integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== + get-symbol-description@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz#7bdd54e0befe8ffc9f3b4e203220d9f1e881b6ee" @@ -5481,9 +5945,9 @@ glob@^10.3.7, glob@^10.4.1, glob@^10.4.2: path-scurry "^1.11.1" glob@^11.0.0: - version "11.0.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-11.0.2.tgz#3261e3897bbc603030b041fd77ba636022d51ce0" - integrity sha512-YT7U7Vye+t5fZ/QMkBFrTJ7ZQxInIUjwyAjVj84CYXqgBdv30MFUPGnBR6sQaVq6Is15wYJUsnzTuWaGRBhBAQ== + version "11.0.1" + resolved "https://registry.yarnpkg.com/glob/-/glob-11.0.1.tgz#1c3aef9a59d680e611b53dcd24bb8639cef064d9" + integrity sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw== dependencies: foreground-child "^3.1.0" jackspeak "^4.0.1" @@ -5535,14 +5999,31 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^13.19.0, globals@^13.20.0: +globals@^13.19.0, globals@^13.20.0, globals@^13.23.0: version "13.24.0" resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== dependencies: type-fest "^0.20.2" -globalthis@^1.0.1, globalthis@^1.0.4: +globals@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" + integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== + +globals@^15.14.0: + version "15.15.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-15.15.0.tgz#7c4761299d41c32b075715a4ce1ede7897ff72a8" + integrity sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg== + +globalthis@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +globalthis@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== @@ -5792,6 +6273,11 @@ human-signals@^2.1.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== +human-signals@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" + integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== + humanize-ms@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" @@ -5799,6 +6285,11 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" +husky@^9.1.7: + version "9.1.7" + resolved "https://registry.yarnpkg.com/husky/-/husky-9.1.7.tgz#d46a38035d101b46a70456a850ff4201344c0b2d" + integrity sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA== + iconv-lite@0.6.3, iconv-lite@^0.6.2: version "0.6.3" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" @@ -6136,6 +6627,18 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +is-fullwidth-code-point@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" + integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== + +is-fullwidth-code-point@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz#9609efced7c2f97da7b60145ef481c787c7ba704" + integrity sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA== + dependencies: + get-east-asian-width "^1.0.0" + is-generator-fn@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" @@ -6300,6 +6803,11 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== +is-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== + is-string@^1.0.7, is-string@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.1.1.tgz#92ea3f3d5c5b6e039ca8677e5ac8d07ea773cbb9" @@ -7116,7 +7624,7 @@ jsprim@^2.0.2: json-schema "0.4.0" verror "1.10.0" -keyv@^4.5.3: +keyv@^4.5.3, keyv@^4.5.4: version "4.5.4" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== @@ -7263,11 +7771,32 @@ lighthouse@^5.1.0: yargs "3.32.0" yargs-parser "7.0.0" +lilconfig@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.3.tgz#a1bcfd6257f9585bf5ae14ceeebb7b559025e4c4" + integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw== + lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== +lint-staged@^15.5.0: + version "15.5.0" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-15.5.0.tgz#fa6464cfb06e0faf5bb167f83186e952ff6e569e" + integrity sha512-WyCzSbfYGhK7cU+UuDDkzUiytbfbi0ZdPy2orwtM75P3WTtQBzmG40cCxIa8Ii2+XjfxzLH6Be46tUfWS85Xfg== + dependencies: + chalk "^5.4.1" + commander "^13.1.0" + debug "^4.4.0" + execa "^8.0.1" + lilconfig "^3.1.3" + listr2 "^8.2.5" + micromatch "^4.0.8" + pidtree "^0.6.0" + string-argv "^0.3.2" + yaml "^2.7.0" + listr2@^3.8.3: version "3.14.0" resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.14.0.tgz#23101cc62e1375fd5836b248276d1d2b51fdbe9e" @@ -7282,6 +7811,18 @@ listr2@^3.8.3: through "^2.3.8" wrap-ansi "^7.0.0" +listr2@^8.2.5: + version "8.2.5" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-8.2.5.tgz#5c9db996e1afeb05db0448196d3d5f64fec2593d" + integrity sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ== + dependencies: + cli-truncate "^4.0.0" + colorette "^2.0.20" + eventemitter3 "^5.0.1" + log-update "^6.1.0" + rfdc "^1.4.1" + wrap-ansi "^9.0.0" + load-json-file@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" @@ -7452,6 +7993,17 @@ log-update@^4.0.0: slice-ansi "^4.0.0" wrap-ansi "^6.2.0" +log-update@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-6.1.0.tgz#1a04ff38166f94647ae1af562f4bd6a15b1b7cd4" + integrity sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w== + dependencies: + ansi-escapes "^7.0.0" + cli-cursor "^5.0.0" + slice-ansi "^7.1.0" + strip-ansi "^7.1.0" + wrap-ansi "^9.0.0" + lookup-closest-locale@6.0.4: version "6.0.4" resolved "https://registry.yarnpkg.com/lookup-closest-locale/-/lookup-closest-locale-6.0.4.tgz#1279fed7546a601647bbc980f64423ee990a8590" @@ -7480,9 +8032,9 @@ lru-cache@^10.2.0: integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== lru-cache@^11.0.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.1.0.tgz#afafb060607108132dbc1cf8ae661afb69486117" - integrity sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A== + version "11.0.2" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.0.2.tgz#fbd8e7cf8211f5e7e5d91905c415a3f55755ca39" + integrity sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA== lru-cache@^4.0.0, lru-cache@^4.0.1: version "4.1.5" @@ -7675,7 +8227,15 @@ metaviewport-parser@0.2.0: resolved "https://registry.yarnpkg.com/metaviewport-parser/-/metaviewport-parser-0.2.0.tgz#535c3ce1ccf6223a5025fddc6a1c36505f7e7db1" integrity sha512-qL5NtY18LGs7lvZCkj3ep2H4Pes9rIiSLZRUyfDdvVw7pWFA0eLwmqaIxApD74RGvUrNEtk9e5Wt1rT+VlCvGw== -micromatch@^4.0.4, micromatch@^4.0.7, micromatch@^4.0.8: +micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +micromatch@^4.0.7, micromatch@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== @@ -7705,6 +8265,16 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +mimic-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== + +mimic-function@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/mimic-function/-/mimic-function-5.0.1.tgz#acbe2b3349f99b9deaca7fb70e48b83e94e67076" + integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA== + min-indent@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" @@ -7717,7 +8287,7 @@ minimatch@9.0.1: dependencies: brace-expansion "^2.0.1" -minimatch@^10.0.0: +minimatch@^10.0.0, minimatch@^10.0.1: version "10.0.1" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.0.1.tgz#ce0521856b453c86e25f2c4c0d03e6ff7ddc440b" integrity sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ== @@ -7936,9 +8506,9 @@ mute-stream@^1.0.0: integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== nanoid@^3.3.8: - version "3.3.9" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.9.tgz#e0097d8e026b3343ff053e9ccd407360a03f503a" - integrity sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg== + version "3.3.11" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" + integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== natural-compare@^1.4.0: version "1.4.0" @@ -8197,6 +8767,13 @@ npm-run-path@^4.0.0, npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" +npm-run-path@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" + integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== + dependencies: + path-key "^4.0.0" + npmlog@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" @@ -8316,6 +8893,20 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" +onetime@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" + integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== + dependencies: + mimic-fn "^4.0.0" + +onetime@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-7.0.0.tgz#9f16c92d8c9ef5120e3acd9dd9957cceecc1ab60" + integrity sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ== + dependencies: + mimic-function "^5.0.0" + open@^6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/open/-/open-6.4.0.tgz#5c13e96d0dc894686164f18965ecfe889ecfc8a9" @@ -8634,6 +9225,11 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== +path-key@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== + path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" @@ -8714,6 +9310,11 @@ picomatch@^4.0.2: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== +pidtree@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" + integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== + pify@^2.2.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -8753,6 +9354,20 @@ pkg-dir@^4.1.0, pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" +playwright-core@1.51.1: + version "1.51.1" + resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.51.1.tgz#d57f0393e02416f32a47cf82b27533656a8acce1" + integrity sha512-/crRMj8+j/Nq5s8QcvegseuyeZPxpQCZb6HNk3Sos3BlZyAknRjoyJPFWkpNn8v0+P3WiwqFF8P+zQo4eqiNuw== + +playwright@1.51.1: + version "1.51.1" + resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.51.1.tgz#ae1467ee318083968ad28d6990db59f47a55390f" + integrity sha512-kkx+MB2KQRkyxjYPc3a0wLZZoDczmppyGJIvQ43l+aZihkaVvmu/21kiyaHeHjiFxjxNNFnUncKmcGIyOojsaw== + dependencies: + playwright-core "1.51.1" + optionalDependencies: + fsevents "2.3.2" + possible-typed-array-names@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae" @@ -9135,6 +9750,11 @@ readdir-scoped-modules@^1.0.0: graceful-fs "^4.1.2" once "^1.3.0" +readdirp@^4.0.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d" + integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== + recast@^0.23.9: version "0.23.11" resolved "https://registry.yarnpkg.com/recast/-/recast-0.23.11.tgz#8885570bb28cf773ba1dc600da7f502f7883f73f" @@ -9302,6 +9922,14 @@ restore-cursor@^3.1.0: onetime "^5.1.0" signal-exit "^3.0.2" +restore-cursor@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-5.1.0.tgz#0766d95699efacb14150993f55baf0953ea1ebe7" + integrity sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA== + dependencies: + onetime "^7.0.0" + signal-exit "^4.1.0" + retry@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" @@ -9312,7 +9940,7 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f" integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== -rfdc@^1.3.0: +rfdc@^1.3.0, rfdc@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== @@ -9370,6 +9998,34 @@ robots-parser@^2.0.1: resolved "https://registry.yarnpkg.com/robots-parser/-/robots-parser-2.4.0.tgz#c0e45f66108ad5950adc86b6737349189b41f864" integrity sha512-oO8f2SI04dJk3pbj2KOMJ4G6QfPAgqcGmrYGmansIcpRewIPT2ljWEt5I+ip6EgiyaLo+RXkkUWw74M25HDkMA== +rollup@^4.30.1: + version "4.36.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.36.0.tgz#f40f4db47ba3b4f5846d32a47e580c0ed7cd8f02" + integrity sha512-zwATAXNQxUcd40zgtQG0ZafcRK4g004WtEl7kbuhTWPvf07PsfohXl39jVUvPF7jvNAIkKPQ2XrsDlWuxBd++Q== + dependencies: + "@types/estree" "1.0.6" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.36.0" + "@rollup/rollup-android-arm64" "4.36.0" + "@rollup/rollup-darwin-arm64" "4.36.0" + "@rollup/rollup-darwin-x64" "4.36.0" + "@rollup/rollup-freebsd-arm64" "4.36.0" + "@rollup/rollup-freebsd-x64" "4.36.0" + "@rollup/rollup-linux-arm-gnueabihf" "4.36.0" + "@rollup/rollup-linux-arm-musleabihf" "4.36.0" + "@rollup/rollup-linux-arm64-gnu" "4.36.0" + "@rollup/rollup-linux-arm64-musl" "4.36.0" + "@rollup/rollup-linux-loongarch64-gnu" "4.36.0" + "@rollup/rollup-linux-powerpc64le-gnu" "4.36.0" + "@rollup/rollup-linux-riscv64-gnu" "4.36.0" + "@rollup/rollup-linux-s390x-gnu" "4.36.0" + "@rollup/rollup-linux-x64-gnu" "4.36.0" + "@rollup/rollup-linux-x64-musl" "4.36.0" + "@rollup/rollup-win32-arm64-msvc" "4.36.0" + "@rollup/rollup-win32-ia32-msvc" "4.36.0" + "@rollup/rollup-win32-x64-msvc" "4.36.0" + fsevents "~2.3.2" + rollup@^4.34.9: version "4.40.1" resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.40.1.tgz#03d6c53ebb6a9c2c060ae686a61e72a2472b366f" @@ -9685,6 +10341,22 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" +slice-ansi@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" + integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== + dependencies: + ansi-styles "^6.0.0" + is-fullwidth-code-point "^4.0.0" + +slice-ansi@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-7.1.0.tgz#cd6b4655e298a8d1bdeb04250a433094b347b9a9" + integrity sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg== + dependencies: + ansi-styles "^6.2.1" + is-fullwidth-code-point "^5.0.0" + slide@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" @@ -9986,6 +10658,11 @@ strict-uri-encode@^2.0.0: resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ== +string-argv@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" + integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== + string-length@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" @@ -10038,6 +10715,15 @@ string-width@^5.0.1, string-width@^5.1.2: emoji-regex "^9.2.2" strip-ansi "^7.0.1" +string-width@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.2.0.tgz#b5bb8e2165ce275d4d43476dd2700ad9091db6dc" + integrity sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ== + dependencies: + emoji-regex "^10.3.0" + get-east-asian-width "^1.0.0" + strip-ansi "^7.1.0" + string.prototype.trim@^1.2.10: version "1.2.10" resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz#40b2dd5ee94c959b4dcfb1d65ce72e90da480c81" @@ -10117,7 +10803,7 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" -strip-ansi@^7.0.1: +strip-ansi@^7.0.1, strip-ansi@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== @@ -10144,6 +10830,11 @@ strip-final-newline@^2.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== +strip-final-newline@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" + integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== + strip-indent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" @@ -10466,9 +11157,9 @@ ts-api-utils@^1.3.0: integrity sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw== ts-api-utils@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.0.1.tgz#660729385b625b939aaa58054f45c058f33f10cd" - integrity sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w== + version "2.1.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.1.0.tgz#595f7094e46eed364c13fd23e75f9513d29baf91" + integrity sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ== ts-jest@^29.2.5: version "29.2.6" @@ -10631,7 +11322,16 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== -typescript@^5.4.5: +typescript-eslint@^8.20.0: + version "8.27.0" + resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.27.0.tgz#96cc34213723ec41a0bcaffc808f04c8d3cd64fb" + integrity sha512-ZZ/8+Y0rRUMuW1gJaPtLWe4ryHbsPLzzibk5Sq+IFa2aOH1Vo0gPr1fbA6pOnzBke7zC2Da4w8AyCgxKXo3lqA== + dependencies: + "@typescript-eslint/eslint-plugin" "8.27.0" + "@typescript-eslint/parser" "8.27.0" + "@typescript-eslint/utils" "8.27.0" + +typescript@^5.4.5, typescript@^5.7.3: version "5.8.2" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.8.2.tgz#8170b3702f74b79db2e5a96207c15e65807999e4" integrity sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ== @@ -10671,10 +11371,10 @@ underscore@^1.9.1: resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.7.tgz#970e33963af9a7dda228f17ebe8399e5fbe63a10" integrity sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g== -undici-types@~6.19.2: - version "6.19.8" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" - integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== undici-types@~6.20.0: version "6.20.0" @@ -10884,6 +11584,17 @@ vite-tsconfig-paths@^5.1.4: optionalDependencies: fsevents "~2.3.3" +"vite@^5.4.14 || ^6.0.0": + version "6.2.2" + resolved "https://registry.yarnpkg.com/vite/-/vite-6.2.2.tgz#8098b12a6bfd95abe39399aa7d5faa56545d7a1a" + integrity sha512-yW7PeMM+LkDzc7CgJuRLMW2Jz0FxMOsVJ8Lv3gpgW9WLcb9cTW+121UEr1hvmfR7w3SegR5ItvYyzVz1vxNJgQ== + dependencies: + esbuild "^0.25.0" + postcss "^8.5.3" + rollup "^4.30.1" + optionalDependencies: + fsevents "~2.3.3" + vitest@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/vitest/-/vitest-3.1.2.tgz#63afc16b6da3bea6e39f5387d80719e70634ba66" @@ -11187,6 +11898,15 @@ wrap-ansi@^8.1.0: string-width "^5.0.1" strip-ansi "^7.0.1" +wrap-ansi@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-9.0.0.tgz#1a3dc8b70d85eeb8398ddfb1e4a02cd186e58b3e" + integrity sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q== + dependencies: + ansi-styles "^6.2.1" + string-width "^7.0.0" + strip-ansi "^7.1.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -11334,6 +12054,11 @@ yaml@^1.10.0: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== +yaml@^2.7.0: + version "2.7.1" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.7.1.tgz#44a247d1b88523855679ac7fa7cda6ed7e135cf6" + integrity sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ== + yargs-parser@20.2.4: version "20.2.4" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" From 01a32e87314d2143bf21c25634f3b6c89e6cef6a Mon Sep 17 00:00:00 2001 From: Calson Chiatiah Date: Wed, 2 Apr 2025 11:26:03 +0100 Subject: [PATCH 05/42] feat(playwright): set compatible Quasar version and enforce server port --- packages/e2e-playwright/src/index.js | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/packages/e2e-playwright/src/index.js b/packages/e2e-playwright/src/index.js index 41d11168..692aa531 100644 --- a/packages/e2e-playwright/src/index.js +++ b/packages/e2e-playwright/src/index.js @@ -1 +1,16 @@ -export default function (api) {} +import { enforcedDevServerPort } from './shared.js'; + +export default function (api) { + api.compatibleWith('quasar', '^2.0.0'); + + if (process.env.NODE_ENV !== 'test') { + return; + } + + api.extendQuasarConf(async (conf) => { + // Let's stop Quasar from opening a browser by default + conf.devServer.open = false; + + conf.devServer.port = api.prompts.port ?? enforcedDevServerPort; + }); +} From 1cea57115e6e15b84e2d8585b88df7e63c9bb5f2 Mon Sep 17 00:00:00 2001 From: Calson Chiatiah Date: Wed, 2 Apr 2025 12:44:12 +0100 Subject: [PATCH 06/42] feat(playwright): add scripts to run in watch mode --- .../src/templates/test-watcher.js | 82 +++++++++++++++++ .../src/templates/test-watcher.ts | 89 +++++++++++++++++++ 2 files changed, 171 insertions(+) create mode 100644 packages/e2e-playwright/src/templates/test-watcher.js create mode 100644 packages/e2e-playwright/src/templates/test-watcher.ts diff --git a/packages/e2e-playwright/src/templates/test-watcher.js b/packages/e2e-playwright/src/templates/test-watcher.js new file mode 100644 index 00000000..9a93fc79 --- /dev/null +++ b/packages/e2e-playwright/src/templates/test-watcher.js @@ -0,0 +1,82 @@ +import { spawn } from 'child_process'; +import chokidar from 'chokidar'; + +let testProcess; +let isExiting = false; +let initialRunComplete = false; + +function runTests() { + if (testProcess) { + console.log('Restarting Playwright UI...'); + testProcess.kill('SIGTERM'); + + const timeout = setTimeout(() => { + if (testProcess) { + console.log('Forcefully killing Playwright UI...'); + testProcess.kill('SIGKILL'); + } + }, 2000); + + testProcess.on('exit', () => { + clearTimeout(timeout); + if (!isExiting) { + startNewProcess(); + } + }); + } else { + startNewProcess(); + } +} + +function startNewProcess() { + testProcess = spawn('pnpm', ['exec', 'playwright', 'test', '--ui'], { stdio: 'inherit' }); + + testProcess.on('close', (code) => { + if (code !== 0 && code !== null && !isExiting) { + console.error(`Playwright tests exited with code ${code}`); + } + testProcess = null; + + // Exit if isExiting is true OR if the process exited on its own + if (isExiting || !testProcess) { + if (isExiting) { + console.log("Exiting...") + } + process.exit(0); + } + }); +} + +const watcher = chokidar.watch('tests/**/*.{spec,test}.{js,ts}', { ignoreInitial: true }); + +watcher.on('all', (event, path) => { + if (initialRunComplete && (event === "change" || event === "add" || event === "unlink")) { + console.log(`File ${path} ${event}d, restarting tests...`); + runTests(); + } +}); + +watcher.on('ready', () => { + console.log('Initial scan complete.'); + initialRunComplete = true; + runTests(); + console.log('Watching for changes...'); +}); + +console.log('Starting watcher...'); + +process.on('SIGINT', () => { + console.log('Exiting...'); + isExiting = true; + + if (testProcess) { + testProcess.kill('SIGTERM'); + setTimeout(() => { + if (testProcess) { + testProcess.kill('SIGKILL'); + } + }, 2000); + } else { + process.exit(0); + } +}); \ No newline at end of file diff --git a/packages/e2e-playwright/src/templates/test-watcher.ts b/packages/e2e-playwright/src/templates/test-watcher.ts new file mode 100644 index 00000000..4787e969 --- /dev/null +++ b/packages/e2e-playwright/src/templates/test-watcher.ts @@ -0,0 +1,89 @@ +/** + * Playwright does not yet offer a means to run the tests in a watch mode. + */ + +import { type ChildProcess, spawn } from 'child_process'; +import chokidar from 'chokidar'; + +let testProcess: ChildProcess | undefined; +let isExiting = false; +let initialRunComplete = false; + +function runTests() { + if (!testProcess) { + startNewProcess(); + return + } + + console.log('Restarting Playwright UI...'); + testProcess.kill('SIGTERM'); + + const timeout = setTimeout(() => { + if (testProcess) { + console.log('Forcefully killing Playwright UI...'); + testProcess.kill('SIGKILL'); + } + }, 2000); + + testProcess.on('exit', () => { + clearTimeout(timeout); + if (isExiting) { + return; + } + + startNewProcess(); + }); +} + +function startNewProcess() { + testProcess = spawn('pnpm', ['exec', 'playwright', 'test', '--ui'], { stdio: 'inherit' }); + + testProcess.on('close', (code) => { + if (!code && !isExiting) { + console.error(`Playwright tests exited with code ${code}`); + } + testProcess = undefined; + + if (isExiting) { + process.exit(0); + } + }); +} + +const watcher = chokidar.watch('tests/**/*.{spec,test}.{js,ts}', { ignoreInitial: true }); + +watcher.on('all', (event, path) => { + if (initialRunComplete && (event === "change" || event === "add" || event === "unlink")) { + console.log(`File ${path} ${event}d, restarting tests...`); + runTests(); + } +}); + +watcher.on('ready', () => { + console.log('Initial scan complete.'); + initialRunComplete = true; + runTests(); + console.log('Watching for changes...'); +}); + +console.log('Starting watcher...'); + +process.on('SIGINT', () => { + console.log('Exiting...'); + isExiting = true; + + if (!testProcess) { + process.exit(0); + } + + testProcess.on('close', () => { + process.exit(0) + }) + testProcess.kill('SIGTERM'); + + setTimeout(() => { + if (testProcess) { + testProcess.kill('SIGKILL'); + } + }, 2000); +}); \ No newline at end of file From 5e165044aec3f168b536134606a889745c8f3c9f Mon Sep 17 00:00:00 2001 From: Calson Chiatiah Date: Wed, 2 Apr 2025 13:29:04 +0100 Subject: [PATCH 07/42] feat(playwright): implement AE installation --- packages/e2e-playwright/src/install.js | 240 +++++++++++++++++++++++++ 1 file changed, 240 insertions(+) create mode 100644 packages/e2e-playwright/src/install.js diff --git a/packages/e2e-playwright/src/install.js b/packages/e2e-playwright/src/install.js new file mode 100644 index 00000000..127c38cb --- /dev/null +++ b/packages/e2e-playwright/src/install.js @@ -0,0 +1,240 @@ +import { spawn, spawnSync } from 'child_process'; +import { join, dirname } from 'path'; +import { fileURLToPath } from 'url'; +import { readFile } from 'fs/promises'; +import * as os from 'os'; +import * as fs from 'fs'; +import { existsSync } from 'fs'; +import { enforcedDevServerPort } from './shared.js'; + +async function isUbuntuOrDebian() { + const osType = os.type(); + if (osType !== 'Linux') { + return false; + } + + try { + try { + const osRelease = await fs.readFile('/etc/os-release', 'utf8'); + if (osRelease.includes('ID=ubuntu') || osRelease.includes('ID=debian')) { + return true; + } + } catch { + // + } + + if (existsSync('/etc/debian_version')) { + return true; + } + + try { + const osVersion = await fs.readFile('/etc/os-version', 'utf8'); + if (osVersion.toLowerCase().includes('debian')) { + return true; + } + } catch { + // + } + + return false; + } catch (error) { + console.error('Could not determine Linux Distro', error.message); + return false; + } +} + +// TODO: This install all browsers, consider giving the user the option of selecting specific browsers +async function installPlaywrightBrowsers() { + try { + spawnSync('npx', ['playwright', 'install'], { + stdio: 'inherit', + shell: true, + env: process.env, + }); + } catch (error) { + console.error( + 'Installation failed. Run npx playwright install at any time to install', + error, + ); + process.exit(1); + } +} + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); + +async function runPnpmCommand(command, args = [], options = {}) { + return new Promise((resolve, reject) => { + let pnpmExecutable; + if (process.platform === 'win32') { + pnpmExecutable = 'pnpm.cmd'; + } else { + pnpmExecutable = 'pnpm'; + } + + const pnpmProcess = spawn(pnpmExecutable, [command, ...args], { + stdio: 'inherit', + ...options, + shell: process.platform === 'win32', + }); + + pnpmProcess.on('error', (error) => { + if (error.code === 'ENOENT') { + console.error( + 'Error: pnpm is not installed or not in your PATH. Please install pnpm globally.', + ); + } + reject(error); + }); + + pnpmProcess.on('close', (code) => { + if (code === 0) { + resolve(); + } else { + reject(new Error(`pnpm ${command} exited with code ${code}`)); + } + }); + }); +} + +/** + * Performs a deep merge of objects and returns new object. Does not modify + * objects (immutable) and merges arrays via concatenation. + * based on https://stackoverflow.com/a/49798508 + * + * @param {...object} sources - Objects to merge + * @returns {object} New object with merged key/values + */ + +function __mergeDeep(...sources) { + let result = {}; + for (const source of sources) { + if (source instanceof Array) { + if (!(result instanceof Array)) { + result = []; + } + result = [...result, ...source]; + } else if (source instanceof Object) { + for (let [key, value] of Object.entries(source)) { + if (value instanceof Object && key in result) { + value = __mergeDeep(result[key], value); + } + result = { ...result, [key]: value }; + } + } + } + return result; +} + +// We use devDependencies instead of peerDependencies because devDependencies are usually the latest version +// and peerDependencies could contain a string supporting multiple major versions (e.g. "playwright": "^1.1.12 || ^2.0.0") +const { devDependencies: aeDevDependencies } = JSON.parse( + await readFile(join(__dirname, '..', 'package.json'), 'utf-8'), +); + +function getCompatibleDevDependencies(packageNames) { + const devDependencies = {}; + + for (const packageName of packageNames) { + devDependencies[packageName] = aeDevDependencies[packageName]; + } + + return devDependencies; +} + +let extendPackageJson = { + devDependencies: getCompatibleDevDependencies([ + 'eslint-plugin-playwright', + '@playwright/test', + '@playwright/experimental-ct-vue', + ]), +}; + +async function setUpPlaywright() { + try { + await runPnpmCommand('create', ['playwright']); + } catch (error) { + console.error('Some errors were found', error); + + if (os.type() !== 'Linux') { + throw new Error(); + } + + if (!(await isUbuntuOrDebian())) { + console.error('Your Linux distro is not supported.'); + return; + } + + throw new Error(); + } +} + +function answerIsYes(response) { + return ( + response === 'y' || + response === 'Y' || + response === 'yes' || + response === 'Yes' + ); +} + +export default async function (api) { + setUpPlaywright(); + + try { + const devServerPort = api.prompts.port ?? enforcedDevServerPort; + const supportsTypescript = await api.hasTypescript(); + + if (answerIsYes(api.prompts.githubWorkflow)) { + api.render('./templates/github-workflow'); + } + + const codeCoverageIsEnabled = answerIsYes(api.prompts.enableCodeCoverage); + + const configTemplate = supportsTypescript + ? './templates/typescript' + : './templates/javascript'; + api.render(configTemplate, { + devServerPort, + codeCoverageIsEnabled, + }); + + api.render('./templates/base', { + shouldSupportTypeScript: supportsTypescript, + }); + + const testEnvCommand = `cross-env NODE_ENV=test`; + + const scripts = { + scripts: { + test: 'echo "See package.json => scripts for available tests." && exit 0', + 'test:e2e': `${testEnvCommand} playwright test --ui`, + 'test:e2e:ci': `${testEnvCommand} playwright test`, + }, + }; + + // Playwirght only offers native support for component testing with Vite + if (api.hasPackage('@quasar/app-vite')) { + scripts.scripts['test:component'] = + `${testEnvCommand} playwright test -c playwright-ct.config.ts --ui`; + scripts.scripts['test:component:ci'] = + `${testEnvCommand} playwright test -c playwright-ct.config.ts`; + } + extendPackageJson = __mergeDeep(extendPackageJson, scripts); + api.extendPackageJson(extendPackageJson); + + if (answerIsYes(api.prompts.installBrowsers)) { + installPlaywrightBrowsers(); + } + + if (await api.hasLint()) { + api.onExitLog( + 'Check out https://github.com/quasarframework/quasar-testing/tree/dev/packages/e2e-cypress to see how to add proper Cypress linting configuration to your project.', + ); + } + } catch (error) { + console.error('An error occurred while installing the extension:', error); + + process.exit(1); + } +} From 266a27007a9b9f3a7c3d7b8c50d3d8bb00b0d7f0 Mon Sep 17 00:00:00 2001 From: Calson Chiatiah Date: Wed, 2 Apr 2025 13:37:09 +0100 Subject: [PATCH 08/42] feat(playwright): add files to `.gitignore` file during installation --- packages/e2e-playwright/src/install.js | 27 ++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/packages/e2e-playwright/src/install.js b/packages/e2e-playwright/src/install.js index 127c38cb..47637bcb 100644 --- a/packages/e2e-playwright/src/install.js +++ b/packages/e2e-playwright/src/install.js @@ -169,6 +169,23 @@ async function setUpPlaywright() { } } +function appendIfNotExists(filePath, searchText, appendText) { + try { + const content = fs.readFileSync(filePath, 'utf8'); + + if (content.includes(searchText)) { + return; + } + fs.appendFileSync(filePath, appendText, 'utf8'); + } catch (error) { + if (error.code === 'ENOENT') { + fs.appendFileSync(filePath, appendText, 'utf8'); + return; + } + console.error(`Error processing file ${filePath}:`, error); + } +} + function answerIsYes(response) { return ( response === 'y' || @@ -223,6 +240,16 @@ export default async function (api) { extendPackageJson = __mergeDeep(extendPackageJson, scripts); api.extendPackageJson(extendPackageJson); + const gitignorePath = api.resolve.app('.gitignore'); + + const playwrightCommentStart = '\n# Playwright'; + const playwrightGitignore = `\n${playwrightCommentStart}\n/test-results/\n/playwright-report/\n/blob-report/n/playwright/.cache/\n/playwright/.cache/\n`; + appendIfNotExists( + gitignorePath, + playwrightCommentStart, + playwrightGitignore, + ); + if (answerIsYes(api.prompts.installBrowsers)) { installPlaywrightBrowsers(); } From ac0d28895ff526c508af763176645bf2f5be9790 Mon Sep 17 00:00:00 2001 From: Calson Chiatiah Date: Wed, 2 Apr 2025 14:00:28 +0100 Subject: [PATCH 09/42] feat(client): control the installation instead of depending on Playwright --- packages/e2e-playwright/src/install.js | 99 +------------------------- 1 file changed, 3 insertions(+), 96 deletions(-) diff --git a/packages/e2e-playwright/src/install.js b/packages/e2e-playwright/src/install.js index 47637bcb..502ba612 100644 --- a/packages/e2e-playwright/src/install.js +++ b/packages/e2e-playwright/src/install.js @@ -1,48 +1,10 @@ -import { spawn, spawnSync } from 'child_process'; +import { spawnSync } from 'child_process'; import { join, dirname } from 'path'; import { fileURLToPath } from 'url'; import { readFile } from 'fs/promises'; -import * as os from 'os'; import * as fs from 'fs'; -import { existsSync } from 'fs'; import { enforcedDevServerPort } from './shared.js'; -async function isUbuntuOrDebian() { - const osType = os.type(); - if (osType !== 'Linux') { - return false; - } - - try { - try { - const osRelease = await fs.readFile('/etc/os-release', 'utf8'); - if (osRelease.includes('ID=ubuntu') || osRelease.includes('ID=debian')) { - return true; - } - } catch { - // - } - - if (existsSync('/etc/debian_version')) { - return true; - } - - try { - const osVersion = await fs.readFile('/etc/os-version', 'utf8'); - if (osVersion.toLowerCase().includes('debian')) { - return true; - } - } catch { - // - } - - return false; - } catch (error) { - console.error('Could not determine Linux Distro', error.message); - return false; - } -} - // TODO: This install all browsers, consider giving the user the option of selecting specific browsers async function installPlaywrightBrowsers() { try { @@ -63,40 +25,6 @@ async function installPlaywrightBrowsers() { const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); -async function runPnpmCommand(command, args = [], options = {}) { - return new Promise((resolve, reject) => { - let pnpmExecutable; - if (process.platform === 'win32') { - pnpmExecutable = 'pnpm.cmd'; - } else { - pnpmExecutable = 'pnpm'; - } - - const pnpmProcess = spawn(pnpmExecutable, [command, ...args], { - stdio: 'inherit', - ...options, - shell: process.platform === 'win32', - }); - - pnpmProcess.on('error', (error) => { - if (error.code === 'ENOENT') { - console.error( - 'Error: pnpm is not installed or not in your PATH. Please install pnpm globally.', - ); - } - reject(error); - }); - - pnpmProcess.on('close', (code) => { - if (code === 0) { - resolve(); - } else { - reject(new Error(`pnpm ${command} exited with code ${code}`)); - } - }); - }); -} - /** * Performs a deep merge of objects and returns new object. Does not modify * objects (immutable) and merges arrays via concatenation. @@ -150,26 +78,7 @@ let extendPackageJson = { ]), }; -async function setUpPlaywright() { - try { - await runPnpmCommand('create', ['playwright']); - } catch (error) { - console.error('Some errors were found', error); - - if (os.type() !== 'Linux') { - throw new Error(); - } - - if (!(await isUbuntuOrDebian())) { - console.error('Your Linux distro is not supported.'); - return; - } - - throw new Error(); - } -} - -function appendIfNotExists(filePath, searchText, appendText) { +function appendToFileIfNotExists(filePath, searchText, appendText) { try { const content = fs.readFileSync(filePath, 'utf8'); @@ -196,8 +105,6 @@ function answerIsYes(response) { } export default async function (api) { - setUpPlaywright(); - try { const devServerPort = api.prompts.port ?? enforcedDevServerPort; const supportsTypescript = await api.hasTypescript(); @@ -244,7 +151,7 @@ export default async function (api) { const playwrightCommentStart = '\n# Playwright'; const playwrightGitignore = `\n${playwrightCommentStart}\n/test-results/\n/playwright-report/\n/blob-report/n/playwright/.cache/\n/playwright/.cache/\n`; - appendIfNotExists( + appendToFileIfNotExists( gitignorePath, playwrightCommentStart, playwrightGitignore, From aa24800b62a0dcb16a7fe6e282f4f1659903421d Mon Sep 17 00:00:00 2001 From: Calson Chiatiah Date: Wed, 2 Apr 2025 14:00:52 +0100 Subject: [PATCH 10/42] feat(playwright): add sample workflow file --- .../.github/workflows/playwright.yml | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 packages/e2e-playwright/src/templates/github-workflow/.github/workflows/playwright.yml diff --git a/packages/e2e-playwright/src/templates/github-workflow/.github/workflows/playwright.yml b/packages/e2e-playwright/src/templates/github-workflow/.github/workflows/playwright.yml new file mode 100644 index 00000000..c18fe4c5 --- /dev/null +++ b/packages/e2e-playwright/src/templates/github-workflow/.github/workflows/playwright.yml @@ -0,0 +1,27 @@ +name: Playwright Tests +on: + push: + branches: [main, master] + pull_request: + branches: [main, master] +jobs: + test: + timeout-minutes: 60 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 22.x + - name: Install dependencies + run: npm install -g pnpm && pnpm install + - name: Install Playwright Browsers + run: pnpm exec playwright install --with-deps + - name: Run Playwright tests + run: pnpm exec playwright test + - uses: actions/upload-artifact@v4 + if: ${{ !cancelled() }} + with: + name: playwright-report + path: playwright-report/ + retention-days: 30 From f69d73829277ec3515c7b2287f6f78b7d81df085 Mon Sep 17 00:00:00 2001 From: Calson Chiatiah Date: Wed, 2 Apr 2025 14:01:56 +0100 Subject: [PATCH 11/42] feat(playwright): add Playwright configs for component and e2e testing --- .../javascript/playwright-ct.config.js | 83 +++++++++++++++++++ .../templates/javascript/playwright.config.js | 80 ++++++++++++++++++ 2 files changed, 163 insertions(+) create mode 100644 packages/e2e-playwright/src/templates/javascript/playwright-ct.config.js create mode 100644 packages/e2e-playwright/src/templates/javascript/playwright.config.js diff --git a/packages/e2e-playwright/src/templates/javascript/playwright-ct.config.js b/packages/e2e-playwright/src/templates/javascript/playwright-ct.config.js new file mode 100644 index 00000000..1d04ac72 --- /dev/null +++ b/packages/e2e-playwright/src/templates/javascript/playwright-ct.config.js @@ -0,0 +1,83 @@ +// @ts-check +import { defineConfig, devices } from '@playwright/experimental-ct-vue'; +import vue from '@vitejs/plugin-vue'; +import { quasar, transformAssetUrls } from '@quasar/vite-plugin'; +// import { fileURLToPath } from 'node:url'; +// import AutoImport from 'unplugin-auto-import/vite'; +// import Components from 'unplugin-vue-components/vite'; + +/** + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + testDir: './src/components/__tests__', + /* The base directory, relative to the config file, for snapshot files created with toMatchSnapshot and toHaveScreenshot. */ + snapshotDir: './__snapshots__', + /* Maximum time one test can run for. */ + timeout: 10 * 1000, + /* Run tests in files in parallel */ + fullyParallel: true, + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + /* Retry on CI only */ + retries: process.env.CI ? 2 : 0, + /* Opt out of parallel tests on CI. */ + workers: process.env.CI ? 1 : undefined, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: 'html', + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: 'on-first-retry', + + /* Port to use for Playwright component endpoint. */ + ctPort: 3100, + + ctViteConfig: { + plugins: [ + vue({ template: { transformAssetUrls } }), + // AutoImport({ + // imports: [ + // 'vue', + // 'vue-router', + // '@vueuse/head', + // 'pinia', + // 'quasar', + // { + // '@/store': ['useStore'], + // }, + // ], + // dts: 'src/auto-imports.d.ts', + // eslintrc: { + // enabled: true, + // }, + // }), + // Components({ + // dirs: ['src/components'], + // extensions: ['vue'], + // }), + quasar({ + // sassVariables: fileURLToPath( + // new URL('./src/quasar-variables.sass', import.meta.url), + // ), + }), + ], + }, + }, + + /* Configure projects for major browsers */ + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + { + name: 'firefox', + use: { ...devices['Desktop Firefox'] }, + }, + { + name: 'webkit', + use: { ...devices['Desktop Safari'] }, + }, + ], +}); diff --git a/packages/e2e-playwright/src/templates/javascript/playwright.config.js b/packages/e2e-playwright/src/templates/javascript/playwright.config.js new file mode 100644 index 00000000..947e9c52 --- /dev/null +++ b/packages/e2e-playwright/src/templates/javascript/playwright.config.js @@ -0,0 +1,80 @@ +// @ts-check +import { defineConfig, devices } from '@playwright/test'; + +/** + * Read environment variables from file. + * https://github.com/motdotla/dotenv + */ +// import dotenv from 'dotenv'; +// import path from 'path'; +// dotenv.config({ path: path.resolve(__dirname, '.env') }); + +/** + * @see https://playwright.dev/docs/test-configuration + */ +export default defineConfig({ + testDir: './tests', + /* Run tests in files in parallel */ + fullyParallel: true, + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + /* Retry on CI only */ + retries: process.env.CI ? 2 : 0, + /* Opt out of parallel tests on CI. */ + workers: process.env.CI ? 1 : undefined, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: 'html', + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + /* Base URL to use in actions like `await page.goto('/')`. */ + baseURL: 'http://localhost:<%= devServerPort %>', + + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: 'on-first-retry', + }, + + /* Configure projects for major browsers */ + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + + { + name: 'firefox', + use: { ...devices['Desktop Firefox'] }, + }, + + { + name: 'webkit', + use: { ...devices['Desktop Safari'] }, + }, + + /* Test against mobile viewports. */ + // { + // name: 'Mobile Chrome', + // use: { ...devices['Pixel 5'] }, + // }, + // { + // name: 'Mobile Safari', + // use: { ...devices['iPhone 12'] }, + // }, + + /* Test against branded browsers. */ + // { + // name: 'Microsoft Edge', + // use: { ...devices['Desktop Edge'], channel: 'msedge' }, + // }, + // { + // name: 'Google Chrome', + // use: { ...devices['Desktop Chrome'], channel: 'chrome' }, + // }, + ], + + /* Run your local dev server before starting the tests */ + webServer: { + command: 'quasar dev -p <%= devServerPort %>', + url: 'http://localhost:<%= devServerPort %>', + reuseExistingServer: !process.env.CI, + }, +}); From 85516b3b0a27184d06bd60739f79dc2b8f3cfeb8 Mon Sep 17 00:00:00 2001 From: Calson Chiatiah Date: Wed, 2 Apr 2025 14:03:03 +0100 Subject: [PATCH 12/42] feat(playwright): add color utility --- .../src/utils/color-assertions.ts | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 packages/e2e-playwright/src/utils/color-assertions.ts diff --git a/packages/e2e-playwright/src/utils/color-assertions.ts b/packages/e2e-playwright/src/utils/color-assertions.ts new file mode 100644 index 00000000..29ba6cce --- /dev/null +++ b/packages/e2e-playwright/src/utils/color-assertions.ts @@ -0,0 +1,45 @@ +import { expect, Locator } from '@playwright/test'; + +export async function expertStyle( + locator: Locator, + property: 'color' | 'background-color', + expectedStyle: string, +) { + const page = locator.page(); + + const actualStyle = await page.evaluate( + ({ selector, property }) => { + const element = document.querySelector(selector); + if (!element || !(element instanceof HTMLElement)) { + return; + } + + const computedStyle = getComputedStyle(element); + return computedStyle.getPropertyValue(property); + }, + { + selector: await locator.evaluate((el) => { + el.id = 'temp-element'; + + return `#temp-element`; + }), + property, + }, + ); + + expect(actualStyle).toBe(expectedStyle); +} + +export function expectColor(locator: Locator, expectedColor: string) { + return expertStyle(locator, 'color', expectedColor); +} + +export function backgroundColor(locator: Locator, expectedBackgrouind: string) { + return expertStyle(locator, 'background-color', expectedBackgrouind); +} + +// test('Testing if it works', async ({ page, toHaveColor, toHaveBackgroundColor }) => { +// await page.setContent('
Hello
'); +// await toHaveColor(page.locator('div'), 'rgb(255, 0, 0)'); +// await toHaveBackgroundColor(page.locator('div'), 'rgb(0, 0, 255)'); +// }); From 0b67beaa4233132ae1c6a641afa624ca5b284295 Mon Sep 17 00:00:00 2001 From: Calson Chiatiah Date: Wed, 2 Apr 2025 14:19:20 +0100 Subject: [PATCH 13/42] feat(playwright): add portal utils --- .../e2e-playwright/src/utils/portal-helper.ts | 54 +++++++++++++++++++ packages/e2e-playwright/src/utils/portals.ts | 37 +++++++++++++ .../e2e-playwright/src/utils/select-date.ts | 41 ++++++++++++++ 3 files changed, 132 insertions(+) create mode 100644 packages/e2e-playwright/src/utils/portal-helper.ts create mode 100644 packages/e2e-playwright/src/utils/portals.ts create mode 100644 packages/e2e-playwright/src/utils/select-date.ts diff --git a/packages/e2e-playwright/src/utils/portal-helper.ts b/packages/e2e-playwright/src/utils/portal-helper.ts new file mode 100644 index 00000000..42aa3c76 --- /dev/null +++ b/packages/e2e-playwright/src/utils/portal-helper.ts @@ -0,0 +1,54 @@ +import { expect, Locator, Page } from '@playwright/test'; + +export type WithinPortalCallback = ( + locator: Locator, +) => T | Promise; + +export interface WithinPortalDerivateOptions { + dataTest?: string; + persistent?: boolean; + selector?: string; + fn: WithinPortalCallback; +} + +export async function portalDerivateCommand( + page: Locator | Page, + selectorDefault: string, + selectorSuffixes: string | string[], + fnOrOptions: WithinPortalCallback | WithinPortalDerivateOptions, +): Promise { + const selectorSuffixesArray = Array.isArray(selectorSuffixes) + ? selectorSuffixes + : [selectorSuffixes]; + + const { + dataTest = '', + persistent = false, + selector = selectorDefault, + } = typeof fnOrOptions === 'function' ? {} : fnOrOptions; + + const fn = typeof fnOrOptions === 'function' ? fnOrOptions : fnOrOptions.fn; + + const portalSelector = selectorSuffixesArray + .map((selectorSuffix) => { + // This is the selector used by getTestById(), it is likely not going to change anytime soon because of the number of projects that will break + // So we should be fine using it here this way. + const testId = `[data-testid="${dataTest}"]`; + + return dataTest + ? `${testId}${selectorSuffix}` + : `${selector}${selectorSuffix}`; + }) + .join(','); + + const locator = page.locator(portalSelector); + + await expect(locator).toHaveCount(1); + await fn(locator.first()); + + if (!persistent) { + await expect(locator).not.toBeVisible(); + } + + return locator; +} diff --git a/packages/e2e-playwright/src/utils/portals.ts b/packages/e2e-playwright/src/utils/portals.ts new file mode 100644 index 00000000..3e3dd9b8 --- /dev/null +++ b/packages/e2e-playwright/src/utils/portals.ts @@ -0,0 +1,37 @@ +import { Locator, Page } from '@playwright/test'; +import { + portalDerivateCommand, + WithinPortalCallback, + WithinPortalDerivateOptions, +} from './portal-helper.js'; + +export async function withinDialog( + page: Page, + fnOrOptions: WithinPortalCallback | WithinPortalDerivateOptions, +) { + return portalDerivateCommand(page, '.q-dialog', '', fnOrOptions); +} + +export async function withinMenu( + page: Page, + fnOrOptions: WithinPortalCallback | WithinPortalDerivateOptions, +) { + return portalDerivateCommand( + page, + '.q-menu', + [':not([role])', '[role=menu]'], + fnOrOptions, + ); +} + +export async function withinSelectMenu( + subject: Page | Locator, + fnOrOptions: WithinPortalCallback | WithinPortalDerivateOptions, +) { + return portalDerivateCommand( + subject, + '.q-menu', + '[role=listbox]', + fnOrOptions, + ); +} diff --git a/packages/e2e-playwright/src/utils/select-date.ts b/packages/e2e-playwright/src/utils/select-date.ts new file mode 100644 index 00000000..339e38be --- /dev/null +++ b/packages/e2e-playwright/src/utils/select-date.ts @@ -0,0 +1,41 @@ +import { Locator } from '@playwright/test'; + +export async function selectDate(subject: Locator, value: Date | string) { + const hasQDateClass = await subject.evaluate((el) => + el.classList.contains('q-date'), + ); + + if (!hasQDateClass) { + throw new Error('Subject is not a QDate'); + } + + const targetDate = typeof value === 'string' ? new Date(value) : value; + + await subject + .locator('.q-date__navigation div:not(.q-date__arrow)') + .last() + .waitFor(); + const yearSelector = subject + .locator('.q-date__navigation div:not(.q-date__arrow)') + .last(); + const monthSelector = subject + .locator('.q-date__navigation div:not(.q-date__arrow)') + .first(); + + const targetYear = targetDate.getFullYear(); + const targetMonth = targetDate.getMonth(); + const targetDay = targetDate.getDate(); + + const currentYear = await yearSelector.textContent(); + if (currentYear !== targetYear.toString()) { + await yearSelector.click(); + await subject.locator(`text=${targetYear}`).click(); + } + + await monthSelector.click(); + await subject.locator('.q-date__months-item').nth(targetMonth).click(); + + await subject + .locator('.q-date__calendar-item--in:has-text("' + targetDay + '")') + .click(); +} From 5355a2c65572ed4758104ab1a03f08010dc7b329 Mon Sep 17 00:00:00 2001 From: Calson Chiatiah Date: Wed, 2 Apr 2025 14:19:52 +0100 Subject: [PATCH 14/42] fix(playwright): add default port --- packages/e2e-playwright/src/shared.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 packages/e2e-playwright/src/shared.js diff --git a/packages/e2e-playwright/src/shared.js b/packages/e2e-playwright/src/shared.js new file mode 100644 index 00000000..394b34a2 --- /dev/null +++ b/packages/e2e-playwright/src/shared.js @@ -0,0 +1 @@ +export const enforcedDevServerPort = 8080; From 2cfc3f346226ab5f185032ba8cbe06194af1d466 Mon Sep 17 00:00:00 2001 From: Calson Chiatiah Date: Wed, 2 Apr 2025 14:20:26 +0100 Subject: [PATCH 15/42] feat(playwright): add color assertions utils --- .../src/utils/color-assertions.ts | 6 -- packages/e2e-playwright/src/utils/select.ts | 87 +++++++++++++++++++ 2 files changed, 87 insertions(+), 6 deletions(-) create mode 100644 packages/e2e-playwright/src/utils/select.ts diff --git a/packages/e2e-playwright/src/utils/color-assertions.ts b/packages/e2e-playwright/src/utils/color-assertions.ts index 29ba6cce..e90eb479 100644 --- a/packages/e2e-playwright/src/utils/color-assertions.ts +++ b/packages/e2e-playwright/src/utils/color-assertions.ts @@ -37,9 +37,3 @@ export function expectColor(locator: Locator, expectedColor: string) { export function backgroundColor(locator: Locator, expectedBackgrouind: string) { return expertStyle(locator, 'background-color', expectedBackgrouind); } - -// test('Testing if it works', async ({ page, toHaveColor, toHaveBackgroundColor }) => { -// await page.setContent('
Hello
'); -// await toHaveColor(page.locator('div'), 'rgb(255, 0, 0)'); -// await toHaveBackgroundColor(page.locator('div'), 'rgb(0, 0, 255)'); -// }); diff --git a/packages/e2e-playwright/src/utils/select.ts b/packages/e2e-playwright/src/utils/select.ts new file mode 100644 index 00000000..89317ad1 --- /dev/null +++ b/packages/e2e-playwright/src/utils/select.ts @@ -0,0 +1,87 @@ +import { expect, Locator } from '@playwright/test'; + +async function isCheckBasedComponent(element: Locator): Promise { + const className = await element.getAttribute('class'); + return ['q-checkbox', 'q-toggle', 'q-radio'].some((item) => + className?.includes(item), + ); +} + +export async function selectQSelectOption( + element: Locator, + valueOrTextOrIndex: string | number | Array, +) { + const hasNativeSelect = await element.evaluate((el) => + el.classList.contains('q-field__native'), + ); + // Handle .q-field__native elements by finding parent .q-select + if (hasNativeSelect) { + const parentQSelect = element.locator( + 'xpath=ancestor::*[contains(@class, "q-select")][1]', + ); + if (await parentQSelect.count()) { + element = parentQSelect; + } + } + + const isMultiple = await element.evaluate((el) => + el.classList.contains('q-select--multiple'), + ); + const values = Array.isArray(valueOrTextOrIndex) + ? valueOrTextOrIndex + : [valueOrTextOrIndex]; + + if (values.length === 0) { + throw new Error('Playwright: select requires at least one value'); + } + + await element.click(); + const menu = element.page().locator('.q-menu:visible'); + + for (const value of values) { + let option: Locator; + if (typeof value === 'string') { + option = menu.locator(`.q-item[role=option]:has-text("${value}")`); + } else { + option = menu.locator('.q-item[role=option]').nth(value); + } + + await option.waitFor(); + await option.click(); + + if (!isMultiple) { + break; + } + } +} + +export async function checkQuasarComponent(element: Locator) { + const isCheckBased = await isCheckBasedComponent(element); + if (!isCheckBased) { + await element.check(); + return; + } + const checked = await element.getAttribute('aria-checked'); + if (checked !== 'true') { + await element.click(); + } +} + +export async function uncheckQuasarComponent(element: Locator) { + const isCheckBased = await isCheckBasedComponent(element); + if (!isCheckBased) { + await element.uncheck(); + return; + } + const checked = await element.getAttribute('aria-checked'); + if (checked !== 'false') { + await element.click(); + } +} + +export async function expectQuasarChecked(element: Locator, expected: boolean) { + await expect(element).toHaveAttribute( + 'aria-checked', + expected ? 'true' : 'false', + ); +} From a67b8da376af6f75189cddf0c9cfe610f7e0f3a0 Mon Sep 17 00:00:00 2001 From: Calson Chiatiah Date: Wed, 2 Apr 2025 14:21:14 +0100 Subject: [PATCH 16/42] feat(playwright): add test route utils --- packages/e2e-playwright/src/utils/test-route.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 packages/e2e-playwright/src/utils/test-route.ts diff --git a/packages/e2e-playwright/src/utils/test-route.ts b/packages/e2e-playwright/src/utils/test-route.ts new file mode 100644 index 00000000..d16b7ac1 --- /dev/null +++ b/packages/e2e-playwright/src/utils/test-route.ts @@ -0,0 +1,15 @@ +import { expect, type Page } from "@playwright/test"; +import { minimatch } from "minimatch"; + +export async function testRoute(page: Page, route: string) { + await expect.poll(async () => { + const url = page.url(); + const parsedUrl = new URL(url); + const usesHashModeRouter = parsedUrl.hash.length > 0; + + const target = usesHashModeRouter ? parsedUrl.hash : parsedUrl.pathname; + const pattern = usesHashModeRouter ? `#/${route}` : `/${route}`; + + return minimatch(target, pattern, { nocomment: true }); + }).toBe(true); +} \ No newline at end of file From 6018c124e21f3e1cb544d7d37da1988a536dd9d6 Mon Sep 17 00:00:00 2001 From: Calson Chiatiah Date: Wed, 2 Apr 2025 14:23:14 +0100 Subject: [PATCH 17/42] feat(playwright): export utils for library use --- packages/e2e-playwright/src/main.ts | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 packages/e2e-playwright/src/main.ts diff --git a/packages/e2e-playwright/src/main.ts b/packages/e2e-playwright/src/main.ts new file mode 100644 index 00000000..dc4cc367 --- /dev/null +++ b/packages/e2e-playwright/src/main.ts @@ -0,0 +1,5 @@ +export * from './utils/portals.js'; +export * from './utils/select-date.js'; +export * from './utils/test-route.js'; +export * from './utils/color-assertions.js'; +export * from './utils/select.js'; From 43b3c48a8bdf1f9f85a1603fdaa3c81c8cd1245d Mon Sep 17 00:00:00 2001 From: Calson Chiatiah Date: Wed, 2 Apr 2025 14:23:52 +0100 Subject: [PATCH 18/42] feat(playwright): add components for test --- .../base/src/components/QuasarButton.vue | 19 +++++ .../src/components/QuasarCheckComponents.vue | 26 +++++++ .../base/src/components/QuasarDark.vue | 32 +++++++++ .../base/src/components/QuasarDate.vue | 42 +++++++++++ .../base/src/components/QuasarDialog.vue | 72 +++++++++++++++++++ .../base/src/components/QuasarDrawer.vue | 34 +++++++++ .../base/src/components/QuasarMenu.vue | 22 ++++++ .../base/src/components/QuasarPageSticky.vue | 21 ++++++ .../base/src/components/QuasarSelect.vue | 55 ++++++++++++++ .../base/src/components/QuasarTooltip.vue | 29 ++++++++ .../base/src/components/color-assertions.vue | 3 + 11 files changed, 355 insertions(+) create mode 100644 packages/e2e-playwright/src/templates/base/src/components/QuasarButton.vue create mode 100644 packages/e2e-playwright/src/templates/base/src/components/QuasarCheckComponents.vue create mode 100644 packages/e2e-playwright/src/templates/base/src/components/QuasarDark.vue create mode 100644 packages/e2e-playwright/src/templates/base/src/components/QuasarDate.vue create mode 100644 packages/e2e-playwright/src/templates/base/src/components/QuasarDialog.vue create mode 100644 packages/e2e-playwright/src/templates/base/src/components/QuasarDrawer.vue create mode 100644 packages/e2e-playwright/src/templates/base/src/components/QuasarMenu.vue create mode 100644 packages/e2e-playwright/src/templates/base/src/components/QuasarPageSticky.vue create mode 100644 packages/e2e-playwright/src/templates/base/src/components/QuasarSelect.vue create mode 100644 packages/e2e-playwright/src/templates/base/src/components/QuasarTooltip.vue create mode 100644 packages/e2e-playwright/src/templates/base/src/components/color-assertions.vue diff --git a/packages/e2e-playwright/src/templates/base/src/components/QuasarButton.vue b/packages/e2e-playwright/src/templates/base/src/components/QuasarButton.vue new file mode 100644 index 00000000..f0d70ae6 --- /dev/null +++ b/packages/e2e-playwright/src/templates/base/src/components/QuasarButton.vue @@ -0,0 +1,19 @@ + + + lang="ts"<% } %>> +import { defineComponent } from 'vue'; + +export default defineComponent({ + name: 'QuasarButton', + emits: { test: () => true }, +}); + diff --git a/packages/e2e-playwright/src/templates/base/src/components/QuasarCheckComponents.vue b/packages/e2e-playwright/src/templates/base/src/components/QuasarCheckComponents.vue new file mode 100644 index 00000000..b819f74b --- /dev/null +++ b/packages/e2e-playwright/src/templates/base/src/components/QuasarCheckComponents.vue @@ -0,0 +1,26 @@ + + + lang="ts"<% } %>> +import { defineComponent, ref } from 'vue'; + +export default defineComponent({ + name: 'QuasarCheckboxAndToggle', + setup() { + const checked = ref(); + const toggled = ref(); + const selected = ref(); + + return { + checked, + toggled, + selected, + }; + }, +}); + diff --git a/packages/e2e-playwright/src/templates/base/src/components/QuasarDark.vue b/packages/e2e-playwright/src/templates/base/src/components/QuasarDark.vue new file mode 100644 index 00000000..969e1923 --- /dev/null +++ b/packages/e2e-playwright/src/templates/base/src/components/QuasarDark.vue @@ -0,0 +1,32 @@ + + + lang="ts"<% } %>> +import { defineComponent } from 'vue'; +import { useQuasar } from 'quasar'; + +export default defineComponent({ + name: 'QuasarDark', + setup() { + const $q = useQuasar(); + + // TODO: Refactor the Cypress test so that it does not need to test on the instance. Let's avoid such + // tests in e2e and component tests. It's preferable to have buttons that perform the task than to directly + // call those methods on the instance. Moreover, Playwright does not encourage nor support access to the instance. + // See https://kentcdodds.com/blog/testing-implementation-details + function toggleNightMode() { + $q.dark.set(!$q.dark.isActive); + } + + return { + toggleNightMode + }; + }, +}); + diff --git a/packages/e2e-playwright/src/templates/base/src/components/QuasarDate.vue b/packages/e2e-playwright/src/templates/base/src/components/QuasarDate.vue new file mode 100644 index 00000000..91b709ed --- /dev/null +++ b/packages/e2e-playwright/src/templates/base/src/components/QuasarDate.vue @@ -0,0 +1,42 @@ + + + lang="ts"<% } %>> +<% if (shouldSupportTypeScript) { %>import type { QDialog } from 'quasar'; +import type { Ref } from 'vue';<% } %> +import { defineComponent, ref } from 'vue'; + +export default defineComponent({ + name: 'QuasarDate', + setup() { + const date = ref(''); + const dateDialogRef = ref()<% if (shouldSupportTypeScript) { %> as Ref<% } %>; + + return { + date, + dateDialogRef, + }; + }, +}); + diff --git a/packages/e2e-playwright/src/templates/base/src/components/QuasarDialog.vue b/packages/e2e-playwright/src/templates/base/src/components/QuasarDialog.vue new file mode 100644 index 00000000..6b034db4 --- /dev/null +++ b/packages/e2e-playwright/src/templates/base/src/components/QuasarDialog.vue @@ -0,0 +1,72 @@ + + + lang="ts"<% } %>> +import { useDialogPluginComponent } from 'quasar'; +import { defineComponent } from 'vue'; + +export default defineComponent({ + name: 'QuasarDialog', + props: { + message: { + type: String, + required: true, + }, + }, + + // REQUIRED; need to specify some events that your + // component will emit through useDialogPluginComponent() + emits: useDialogPluginComponent.emits, + + setup() { + // REQUIRED; must be called inside of setup() + const { dialogRef, onDialogHide, onDialogOK, onDialogCancel } = + useDialogPluginComponent(); + // dialogRef - Vue ref to be applied to QDialog + // onDialogHide - Function to be used as handler for @hide on QDialog + // onDialogOK - Function to call to settle dialog with "ok" outcome + // example: onDialogOK() - no payload + // example: onDialogOK({ /*.../* }) - with payload + // onDialogCancel - Function to call to settle dialog with "cancel" outcome + + return { + // This is REQUIRED; + // Need to inject these (from useDialogPluginComponent() call) + // into the vue scope for the vue html template + dialogRef, + onDialogHide, + + // other methods that we used in our vue html template; + // these are part of our example (so not required) + onOKClick() { + // on OK, it is REQUIRED to + // call onDialogOK (with optional payload) + onDialogOK(); + // or with payload: onDialogOK({ ... }) + // ...and it will also hide the dialog automatically + }, + + // we can passthrough onDialogCancel directly + onCancelClick: onDialogCancel, + }; + }, +}); + diff --git a/packages/e2e-playwright/src/templates/base/src/components/QuasarDrawer.vue b/packages/e2e-playwright/src/templates/base/src/components/QuasarDrawer.vue new file mode 100644 index 00000000..e6cfdca1 --- /dev/null +++ b/packages/e2e-playwright/src/templates/base/src/components/QuasarDrawer.vue @@ -0,0 +1,34 @@ + + + lang="ts"<% } %>> +import { ref, defineComponent } from 'vue'; + +export default defineComponent({ + name: 'QuasarDrawer', + setup() { + const showDrawer = ref(true); + + return { + showDrawer, + }; + }, +}); + diff --git a/packages/e2e-playwright/src/templates/base/src/components/QuasarMenu.vue b/packages/e2e-playwright/src/templates/base/src/components/QuasarMenu.vue new file mode 100644 index 00000000..681574b0 --- /dev/null +++ b/packages/e2e-playwright/src/templates/base/src/components/QuasarMenu.vue @@ -0,0 +1,22 @@ + + + lang="ts"<% } %>> +import { defineComponent } from 'vue'; + +export default defineComponent({ + name: 'QuasarMenu', +}); + diff --git a/packages/e2e-playwright/src/templates/base/src/components/QuasarPageSticky.vue b/packages/e2e-playwright/src/templates/base/src/components/QuasarPageSticky.vue new file mode 100644 index 00000000..42c5e789 --- /dev/null +++ b/packages/e2e-playwright/src/templates/base/src/components/QuasarPageSticky.vue @@ -0,0 +1,21 @@ + + + lang="ts"<% } %>> +import { defineComponent } from 'vue'; + +export default defineComponent({ + name: 'QuasarPageSticky', + props: { + title: { + type: String, + required: true, + }, + }, +}); + diff --git a/packages/e2e-playwright/src/templates/base/src/components/QuasarSelect.vue b/packages/e2e-playwright/src/templates/base/src/components/QuasarSelect.vue new file mode 100644 index 00000000..4e012486 --- /dev/null +++ b/packages/e2e-playwright/src/templates/base/src/components/QuasarSelect.vue @@ -0,0 +1,55 @@ + + + lang="ts"<% } %>> +import { defineComponent, ref } from 'vue'; + +const syncOptions = ['Option 1', 'Option 2', 'Option 3']; + +export default defineComponent({ + name: 'QuasarSelect', + props: { + loadOptionsAsync: { + type: Boolean, + default: false, + }, + disable: { + type: Boolean, + default: false, + }, + }, + setup(props) { + const selected = ref(); + const loading = ref(false); + + const options = ref(); + + if (props.loadOptionsAsync) { + loading.value = true; + setTimeout(() => { + options.value = syncOptions; + loading.value = false; + }, 2000); + } else { + options.value = syncOptions; + } + + return { + loading, + selected, + options, + }; + }, +}); + diff --git a/packages/e2e-playwright/src/templates/base/src/components/QuasarTooltip.vue b/packages/e2e-playwright/src/templates/base/src/components/QuasarTooltip.vue new file mode 100644 index 00000000..64d7a460 --- /dev/null +++ b/packages/e2e-playwright/src/templates/base/src/components/QuasarTooltip.vue @@ -0,0 +1,29 @@ + + + lang="ts"<% } %>> +import { ref, defineComponent } from 'vue'; + +export default defineComponent({ + name: 'QuasarTooltip', + setup() { + const showTooltip = ref(true); + + return { + showTooltip, + }; + }, +}); + diff --git a/packages/e2e-playwright/src/templates/base/src/components/color-assertions.vue b/packages/e2e-playwright/src/templates/base/src/components/color-assertions.vue new file mode 100644 index 00000000..841cd639 --- /dev/null +++ b/packages/e2e-playwright/src/templates/base/src/components/color-assertions.vue @@ -0,0 +1,3 @@ + From 952f859b0e857ae84025006fa074d0d99b0900d2 Mon Sep 17 00:00:00 2001 From: Calson Chiatiah Date: Wed, 2 Apr 2025 14:33:50 +0100 Subject: [PATCH 19/42] feat(playwright): add more component templates and config files --- .../src/components/QuasarCheckComponents.vue | 8 +- .../base/src/components/QuasarDark.vue | 19 +++++ .../base/src/components/QuasarDate.vue | 5 +- .../base/src/components/QuasarDialog.vue | 1 + .../base/src/components/QuasarDrawer.vue | 3 +- .../base/src/components/QuasarMenu.vue | 4 +- .../base/src/components/QuasarPageSticky.vue | 2 +- .../base/src/components/QuasarSelect.vue | 3 +- .../base/src/components/QuasarTooltip.vue | 1 + .../typescript/playwright-ct.config.ts | 82 +++++++++++++++++++ .../templates/typescript/playwright.config.ts | 79 ++++++++++++++++++ 11 files changed, 196 insertions(+), 11 deletions(-) create mode 100644 packages/e2e-playwright/src/templates/typescript/playwright-ct.config.ts create mode 100644 packages/e2e-playwright/src/templates/typescript/playwright.config.ts diff --git a/packages/e2e-cypress/src/templates/base/src/components/QuasarCheckComponents.vue b/packages/e2e-cypress/src/templates/base/src/components/QuasarCheckComponents.vue index 2f6cab85..b819f74b 100644 --- a/packages/e2e-cypress/src/templates/base/src/components/QuasarCheckComponents.vue +++ b/packages/e2e-cypress/src/templates/base/src/components/QuasarCheckComponents.vue @@ -1,9 +1,9 @@ lang="ts"<% } %>> diff --git a/packages/e2e-cypress/src/templates/base/src/components/QuasarDark.vue b/packages/e2e-cypress/src/templates/base/src/components/QuasarDark.vue index 63ca1f0f..969e1923 100644 --- a/packages/e2e-cypress/src/templates/base/src/components/QuasarDark.vue +++ b/packages/e2e-cypress/src/templates/base/src/components/QuasarDark.vue @@ -1,13 +1,32 @@ lang="ts"<% } %>> import { defineComponent } from 'vue'; +import { useQuasar } from 'quasar'; export default defineComponent({ name: 'QuasarDark', + setup() { + const $q = useQuasar(); + + // TODO: Refactor the Cypress test so that it does not need to test on the instance. Let's avoid such + // tests in e2e and component tests. It's preferable to have buttons that perform the task than to directly + // call those methods on the instance. Moreover, Playwright does not encourage nor support access to the instance. + // See https://kentcdodds.com/blog/testing-implementation-details + function toggleNightMode() { + $q.dark.set(!$q.dark.isActive); + } + + return { + toggleNightMode + }; + }, }); diff --git a/packages/e2e-cypress/src/templates/base/src/components/QuasarDate.vue b/packages/e2e-cypress/src/templates/base/src/components/QuasarDate.vue index b6a20f78..91b709ed 100644 --- a/packages/e2e-cypress/src/templates/base/src/components/QuasarDate.vue +++ b/packages/e2e-cypress/src/templates/base/src/components/QuasarDate.vue @@ -1,11 +1,12 @@