]> git.ipfire.org Git - thirdparty/vuejs/create-vue.git/commitdiff
feat: add Playwright for end-to-end testing (#76)
authorMax Schmitt <max@schmitt.mx>
Mon, 26 Sep 2022 11:55:30 +0000 (13:55 +0200)
committerGitHub <noreply@github.com>
Mon, 26 Sep 2022 11:55:30 +0000 (19:55 +0800)
13 files changed:
index.ts
pnpm-lock.yaml
scripts/snapshot.mjs
scripts/test.mjs
template/config/playwright/_gitignore [new file with mode: 0644]
template/config/playwright/e2e/vue.spec.js [new file with mode: 0644]
template/config/playwright/e2e/vue.spec.ts [new file with mode: 0644]
template/config/playwright/package.json [new file with mode: 0644]
template/config/playwright/playwright.config.js [new file with mode: 0644]
template/config/playwright/playwright.config.ts [new file with mode: 0644]
template/config/vitest/package.json
utils/generateReadme.ts
utils/renderTemplate.ts

index 921fc227eb0c392455b05b7c8a0e2b4b03a781ed..44a910697a9823e372e38fd299ea19a0392a3247 100755 (executable)
--- a/index.ts
+++ b/index.ts
@@ -68,6 +68,7 @@ async function init() {
   // --with-tests / --tests (equals to `--vitest --cypress`)
   // --vitest
   // --cypress
+  // --playwright
   // --eslint
   // --eslint-with-prettier (only support prettier through eslint for simplicity)
   // --force (for force overwriting)
@@ -92,6 +93,7 @@ async function init() {
       argv.tests ??
       argv.vitest ??
       argv.cypress ??
+      argv.playwright ??
       argv.eslint
     ) === 'boolean'
 
@@ -110,6 +112,7 @@ async function init() {
     needsPinia?: boolean
     needsVitest?: boolean
     needsCypress?: boolean
+    needsPlaywright?: boolean
     needsEslint?: boolean
     needsPrettier?: boolean
   } = {}
@@ -124,6 +127,7 @@ async function init() {
     // - Install Vue Router for SPA development?
     // - Install Pinia for state management?
     // - Add Cypress for testing?
+    // - Add Playwright for end-to-end testing?
     // - Add ESLint for code quality?
     // - Add Prettier for code formatting?
     result = await prompts(
@@ -212,6 +216,19 @@ async function init() {
           active: 'Yes',
           inactive: 'No'
         },
+        {
+          name: 'needsPlaywright',
+          type: (prev, values) => {
+            if (isFeatureFlagsUsed || values.needsCypress) {
+              return null
+            }
+            return 'toggle'
+          },
+          message: 'Add Playwright for End-to-End testing?',
+          initial: false,
+          active: 'Yes',
+          inactive: 'No'
+        },
         {
           name: 'needsEslint',
           type: () => (isFeatureFlagsUsed ? null : 'toggle'),
@@ -256,6 +273,7 @@ async function init() {
     needsRouter = argv.router,
     needsPinia = argv.pinia,
     needsCypress = argv.cypress || argv.tests,
+    needsPlaywright = argv.playwright,
     needsVitest = argv.vitest || argv.tests,
     needsEslint = argv.eslint || argv['eslint-with-prettier'],
     needsPrettier = argv['eslint-with-prettier']
@@ -306,6 +324,9 @@ async function init() {
   if (needsCypressCT) {
     render('config/cypress-ct')
   }
+  if (needsPlaywright) {
+    render('config/playwright')
+  }
   if (needsTypeScript) {
     render('config/typescript')
 
@@ -408,6 +429,7 @@ async function init() {
       needsTypeScript,
       needsVitest,
       needsCypress,
+      needsPlaywright,
       needsCypressCT,
       needsEslint
     })
index e0376be7ffc2f04f35166aa216778b1c42393821..6abd6a17f85137b63ed5b708e3dbab6063474c6e 100644 (file)
@@ -23,8 +23,8 @@ importers:
       '@types/prompts': 2.0.14
       '@vue/create-eslint-config': 0.1.3
       '@vue/tsconfig': 0.1.3
-      esbuild: 0.14.53
-      esbuild-plugin-license: 1.2.2_esbuild@0.14.53
+      esbuild: 0.14.54
+      esbuild-plugin-license: 1.2.2_esbuild@0.14.54
       husky: 8.0.1
       kolorist: 1.5.1
       lint-staged: 13.0.3
@@ -124,6 +124,23 @@ importers:
       start-server-and-test: 1.14.0
       vite: 3.0.9
 
+  playground/jsx-pinia-playwright:
+    specifiers:
+      '@playwright/test': ^1.25.1
+      '@vitejs/plugin-vue': ^3.0.3
+      '@vitejs/plugin-vue-jsx': ^2.0.1
+      pinia: ^2.0.21
+      vite: ^3.0.9
+      vue: ^3.2.38
+    dependencies:
+      pinia: 2.0.21_vue@3.2.38
+      vue: 3.2.38
+    devDependencies:
+      '@playwright/test': 1.25.1
+      '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
+      '@vitejs/plugin-vue-jsx': 2.0.1_vite@3.0.9+vue@3.2.38
+      vite: 3.0.9
+
   playground/jsx-pinia-vitest:
     specifiers:
       '@vitejs/plugin-vue': ^3.0.3
@@ -143,7 +160,7 @@ importers:
       '@vue/test-utils': 2.0.2_vue@3.2.38
       jsdom: 20.0.0
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
+      vitest: 0.23.1_jsdom@20.0.0
 
   playground/jsx-pinia-vitest-cypress:
     specifiers:
@@ -168,7 +185,30 @@ importers:
       jsdom: 20.0.0
       start-server-and-test: 1.14.0
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
+      vitest: 0.23.1_jsdom@20.0.0
+
+  playground/jsx-pinia-vitest-playwright:
+    specifiers:
+      '@playwright/test': ^1.25.1
+      '@vitejs/plugin-vue': ^3.0.3
+      '@vitejs/plugin-vue-jsx': ^2.0.1
+      '@vue/test-utils': ^2.0.2
+      jsdom: ^20.0.0
+      pinia: ^2.0.21
+      vite: ^3.0.9
+      vitest: ^0.23.0
+      vue: ^3.2.38
+    dependencies:
+      pinia: 2.0.21_vue@3.2.38
+      vue: 3.2.38
+    devDependencies:
+      '@playwright/test': 1.25.1
+      '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
+      '@vitejs/plugin-vue-jsx': 2.0.1_vite@3.0.9+vue@3.2.38
+      '@vue/test-utils': 2.0.2_vue@3.2.38
+      jsdom: 20.0.0
+      vite: 3.0.9
+      vitest: 0.23.1_jsdom@20.0.0
 
   playground/jsx-pinia-with-tests:
     specifiers:
@@ -193,7 +233,22 @@ importers:
       jsdom: 20.0.0
       start-server-and-test: 1.14.0
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
+      vitest: 0.23.1_jsdom@20.0.0
+
+  playground/jsx-playwright:
+    specifiers:
+      '@playwright/test': ^1.25.1
+      '@vitejs/plugin-vue': ^3.0.3
+      '@vitejs/plugin-vue-jsx': ^2.0.1
+      vite: ^3.0.9
+      vue: ^3.2.38
+    dependencies:
+      vue: 3.2.38
+    devDependencies:
+      '@playwright/test': 1.25.1
+      '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
+      '@vitejs/plugin-vue-jsx': 2.0.1_vite@3.0.9+vue@3.2.38
+      vite: 3.0.9
 
   playground/jsx-router:
     specifiers:
@@ -267,6 +322,25 @@ importers:
       start-server-and-test: 1.14.0
       vite: 3.0.9
 
+  playground/jsx-router-pinia-playwright:
+    specifiers:
+      '@playwright/test': ^1.25.1
+      '@vitejs/plugin-vue': ^3.0.3
+      '@vitejs/plugin-vue-jsx': ^2.0.1
+      pinia: ^2.0.21
+      vite: ^3.0.9
+      vue: ^3.2.38
+      vue-router: ^4.1.5
+    dependencies:
+      pinia: 2.0.21_vue@3.2.38
+      vue: 3.2.38
+      vue-router: 4.1.5_vue@3.2.38
+    devDependencies:
+      '@playwright/test': 1.25.1
+      '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
+      '@vitejs/plugin-vue-jsx': 2.0.1_vite@3.0.9+vue@3.2.38
+      vite: 3.0.9
+
   playground/jsx-router-pinia-vitest:
     specifiers:
       '@vitejs/plugin-vue': ^3.0.3
@@ -288,7 +362,7 @@ importers:
       '@vue/test-utils': 2.0.2_vue@3.2.38
       jsdom: 20.0.0
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
+      vitest: 0.23.1_jsdom@20.0.0
 
   playground/jsx-router-pinia-vitest-cypress:
     specifiers:
@@ -315,7 +389,32 @@ importers:
       jsdom: 20.0.0
       start-server-and-test: 1.14.0
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
+      vitest: 0.23.1_jsdom@20.0.0
+
+  playground/jsx-router-pinia-vitest-playwright:
+    specifiers:
+      '@playwright/test': ^1.25.1
+      '@vitejs/plugin-vue': ^3.0.3
+      '@vitejs/plugin-vue-jsx': ^2.0.1
+      '@vue/test-utils': ^2.0.2
+      jsdom: ^20.0.0
+      pinia: ^2.0.21
+      vite: ^3.0.9
+      vitest: ^0.23.0
+      vue: ^3.2.38
+      vue-router: ^4.1.5
+    dependencies:
+      pinia: 2.0.21_vue@3.2.38
+      vue: 3.2.38
+      vue-router: 4.1.5_vue@3.2.38
+    devDependencies:
+      '@playwright/test': 1.25.1
+      '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
+      '@vitejs/plugin-vue-jsx': 2.0.1_vite@3.0.9+vue@3.2.38
+      '@vue/test-utils': 2.0.2_vue@3.2.38
+      jsdom: 20.0.0
+      vite: 3.0.9
+      vitest: 0.23.1_jsdom@20.0.0
 
   playground/jsx-router-pinia-with-tests:
     specifiers:
@@ -342,7 +441,24 @@ importers:
       jsdom: 20.0.0
       start-server-and-test: 1.14.0
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
+      vitest: 0.23.1_jsdom@20.0.0
+
+  playground/jsx-router-playwright:
+    specifiers:
+      '@playwright/test': ^1.25.1
+      '@vitejs/plugin-vue': ^3.0.3
+      '@vitejs/plugin-vue-jsx': ^2.0.1
+      vite: ^3.0.9
+      vue: ^3.2.38
+      vue-router: ^4.1.5
+    dependencies:
+      vue: 3.2.38
+      vue-router: 4.1.5_vue@3.2.38
+    devDependencies:
+      '@playwright/test': 1.25.1
+      '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
+      '@vitejs/plugin-vue-jsx': 2.0.1_vite@3.0.9+vue@3.2.38
+      vite: 3.0.9
 
   playground/jsx-router-vitest:
     specifiers:
@@ -363,7 +479,7 @@ importers:
       '@vue/test-utils': 2.0.2_vue@3.2.38
       jsdom: 20.0.0
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
+      vitest: 0.23.1_jsdom@20.0.0
 
   playground/jsx-router-vitest-cypress:
     specifiers:
@@ -388,7 +504,30 @@ importers:
       jsdom: 20.0.0
       start-server-and-test: 1.14.0
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
+      vitest: 0.23.1_jsdom@20.0.0
+
+  playground/jsx-router-vitest-playwright:
+    specifiers:
+      '@playwright/test': ^1.25.1
+      '@vitejs/plugin-vue': ^3.0.3
+      '@vitejs/plugin-vue-jsx': ^2.0.1
+      '@vue/test-utils': ^2.0.2
+      jsdom: ^20.0.0
+      vite: ^3.0.9
+      vitest: ^0.23.0
+      vue: ^3.2.38
+      vue-router: ^4.1.5
+    dependencies:
+      vue: 3.2.38
+      vue-router: 4.1.5_vue@3.2.38
+    devDependencies:
+      '@playwright/test': 1.25.1
+      '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
+      '@vitejs/plugin-vue-jsx': 2.0.1_vite@3.0.9+vue@3.2.38
+      '@vue/test-utils': 2.0.2_vue@3.2.38
+      jsdom: 20.0.0
+      vite: 3.0.9
+      vitest: 0.23.1_jsdom@20.0.0
 
   playground/jsx-router-with-tests:
     specifiers:
@@ -413,7 +552,7 @@ importers:
       jsdom: 20.0.0
       start-server-and-test: 1.14.0
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
+      vitest: 0.23.1_jsdom@20.0.0
 
   playground/jsx-vitest:
     specifiers:
@@ -432,7 +571,7 @@ importers:
       '@vue/test-utils': 2.0.2_vue@3.2.38
       jsdom: 20.0.0
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
+      vitest: 0.23.1_jsdom@20.0.0
 
   playground/jsx-vitest-cypress:
     specifiers:
@@ -455,7 +594,28 @@ importers:
       jsdom: 20.0.0
       start-server-and-test: 1.14.0
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
+      vitest: 0.23.1_jsdom@20.0.0
+
+  playground/jsx-vitest-playwright:
+    specifiers:
+      '@playwright/test': ^1.25.1
+      '@vitejs/plugin-vue': ^3.0.3
+      '@vitejs/plugin-vue-jsx': ^2.0.1
+      '@vue/test-utils': ^2.0.2
+      jsdom: ^20.0.0
+      vite: ^3.0.9
+      vitest: ^0.23.0
+      vue: ^3.2.38
+    dependencies:
+      vue: 3.2.38
+    devDependencies:
+      '@playwright/test': 1.25.1
+      '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
+      '@vitejs/plugin-vue-jsx': 2.0.1_vite@3.0.9+vue@3.2.38
+      '@vue/test-utils': 2.0.2_vue@3.2.38
+      jsdom: 20.0.0
+      vite: 3.0.9
+      vitest: 0.23.1_jsdom@20.0.0
 
   playground/jsx-with-tests:
     specifiers:
@@ -478,7 +638,7 @@ importers:
       jsdom: 20.0.0
       start-server-and-test: 1.14.0
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
+      vitest: 0.23.1_jsdom@20.0.0
 
   playground/pinia:
     specifiers:
@@ -510,6 +670,21 @@ importers:
       start-server-and-test: 1.14.0
       vite: 3.0.9
 
+  playground/pinia-playwright:
+    specifiers:
+      '@playwright/test': ^1.25.1
+      '@vitejs/plugin-vue': ^3.0.3
+      pinia: ^2.0.21
+      vite: ^3.0.9
+      vue: ^3.2.38
+    dependencies:
+      pinia: 2.0.21_vue@3.2.38
+      vue: 3.2.38
+    devDependencies:
+      '@playwright/test': 1.25.1
+      '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
+      vite: 3.0.9
+
   playground/pinia-vitest:
     specifiers:
       '@vitejs/plugin-vue': ^3.0.3
@@ -527,7 +702,7 @@ importers:
       '@vue/test-utils': 2.0.2_vue@3.2.38
       jsdom: 20.0.0
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
+      vitest: 0.23.1_jsdom@20.0.0
 
   playground/pinia-vitest-cypress:
     specifiers:
@@ -550,7 +725,28 @@ importers:
       jsdom: 20.0.0
       start-server-and-test: 1.14.0
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
+      vitest: 0.23.1_jsdom@20.0.0
+
+  playground/pinia-vitest-playwright:
+    specifiers:
+      '@playwright/test': ^1.25.1
+      '@vitejs/plugin-vue': ^3.0.3
+      '@vue/test-utils': ^2.0.2
+      jsdom: ^20.0.0
+      pinia: ^2.0.21
+      vite: ^3.0.9
+      vitest: ^0.23.0
+      vue: ^3.2.38
+    dependencies:
+      pinia: 2.0.21_vue@3.2.38
+      vue: 3.2.38
+    devDependencies:
+      '@playwright/test': 1.25.1
+      '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
+      '@vue/test-utils': 2.0.2_vue@3.2.38
+      jsdom: 20.0.0
+      vite: 3.0.9
+      vitest: 0.23.1_jsdom@20.0.0
 
   playground/pinia-with-tests:
     specifiers:
@@ -573,7 +769,20 @@ importers:
       jsdom: 20.0.0
       start-server-and-test: 1.14.0
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
+      vitest: 0.23.1_jsdom@20.0.0
+
+  playground/playwright:
+    specifiers:
+      '@playwright/test': ^1.25.1
+      '@vitejs/plugin-vue': ^3.0.3
+      vite: ^3.0.9
+      vue: ^3.2.38
+    dependencies:
+      vue: 3.2.38
+    devDependencies:
+      '@playwright/test': 1.25.1
+      '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
+      vite: 3.0.9
 
   playground/router:
     specifiers:
@@ -639,6 +848,23 @@ importers:
       start-server-and-test: 1.14.0
       vite: 3.0.9
 
+  playground/router-pinia-playwright:
+    specifiers:
+      '@playwright/test': ^1.25.1
+      '@vitejs/plugin-vue': ^3.0.3
+      pinia: ^2.0.21
+      vite: ^3.0.9
+      vue: ^3.2.38
+      vue-router: ^4.1.5
+    dependencies:
+      pinia: 2.0.21_vue@3.2.38
+      vue: 3.2.38
+      vue-router: 4.1.5_vue@3.2.38
+    devDependencies:
+      '@playwright/test': 1.25.1
+      '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
+      vite: 3.0.9
+
   playground/router-pinia-vitest:
     specifiers:
       '@vitejs/plugin-vue': ^3.0.3
@@ -658,7 +884,7 @@ importers:
       '@vue/test-utils': 2.0.2_vue@3.2.38
       jsdom: 20.0.0
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
+      vitest: 0.23.1_jsdom@20.0.0
 
   playground/router-pinia-vitest-cypress:
     specifiers:
@@ -683,7 +909,30 @@ importers:
       jsdom: 20.0.0
       start-server-and-test: 1.14.0
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
+      vitest: 0.23.1_jsdom@20.0.0
+
+  playground/router-pinia-vitest-playwright:
+    specifiers:
+      '@playwright/test': ^1.25.1
+      '@vitejs/plugin-vue': ^3.0.3
+      '@vue/test-utils': ^2.0.2
+      jsdom: ^20.0.0
+      pinia: ^2.0.21
+      vite: ^3.0.9
+      vitest: ^0.23.0
+      vue: ^3.2.38
+      vue-router: ^4.1.5
+    dependencies:
+      pinia: 2.0.21_vue@3.2.38
+      vue: 3.2.38
+      vue-router: 4.1.5_vue@3.2.38
+    devDependencies:
+      '@playwright/test': 1.25.1
+      '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
+      '@vue/test-utils': 2.0.2_vue@3.2.38
+      jsdom: 20.0.0
+      vite: 3.0.9
+      vitest: 0.23.1_jsdom@20.0.0
 
   playground/router-pinia-with-tests:
     specifiers:
@@ -708,7 +957,22 @@ importers:
       jsdom: 20.0.0
       start-server-and-test: 1.14.0
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
+      vitest: 0.23.1_jsdom@20.0.0
+
+  playground/router-playwright:
+    specifiers:
+      '@playwright/test': ^1.25.1
+      '@vitejs/plugin-vue': ^3.0.3
+      vite: ^3.0.9
+      vue: ^3.2.38
+      vue-router: ^4.1.5
+    dependencies:
+      vue: 3.2.38
+      vue-router: 4.1.5_vue@3.2.38
+    devDependencies:
+      '@playwright/test': 1.25.1
+      '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
+      vite: 3.0.9
 
   playground/router-vitest:
     specifiers:
@@ -727,7 +991,7 @@ importers:
       '@vue/test-utils': 2.0.2_vue@3.2.38
       jsdom: 20.0.0
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
+      vitest: 0.23.1_jsdom@20.0.0
 
   playground/router-vitest-cypress:
     specifiers:
@@ -750,7 +1014,28 @@ importers:
       jsdom: 20.0.0
       start-server-and-test: 1.14.0
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
+      vitest: 0.23.1_jsdom@20.0.0
+
+  playground/router-vitest-playwright:
+    specifiers:
+      '@playwright/test': ^1.25.1
+      '@vitejs/plugin-vue': ^3.0.3
+      '@vue/test-utils': ^2.0.2
+      jsdom: ^20.0.0
+      vite: ^3.0.9
+      vitest: ^0.23.0
+      vue: ^3.2.38
+      vue-router: ^4.1.5
+    dependencies:
+      vue: 3.2.38
+      vue-router: 4.1.5_vue@3.2.38
+    devDependencies:
+      '@playwright/test': 1.25.1
+      '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
+      '@vue/test-utils': 2.0.2_vue@3.2.38
+      jsdom: 20.0.0
+      vite: 3.0.9
+      vitest: 0.23.1_jsdom@20.0.0
 
   playground/router-with-tests:
     specifiers:
@@ -773,7 +1058,7 @@ importers:
       jsdom: 20.0.0
       start-server-and-test: 1.14.0
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
+      vitest: 0.23.1_jsdom@20.0.0
 
   playground/typescript:
     specifiers:
@@ -925,40 +1210,34 @@ importers:
       vite: 3.0.9
       vue-tsc: 0.40.7_typescript@4.7.4
 
-  playground/typescript-jsx-pinia-vitest:
+  playground/typescript-jsx-pinia-playwright:
     specifiers:
-      '@types/jsdom': ^20.0.0
+      '@playwright/test': ^1.25.1
       '@types/node': ^16.11.56
       '@vitejs/plugin-vue': ^3.0.3
       '@vitejs/plugin-vue-jsx': ^2.0.1
-      '@vue/test-utils': ^2.0.2
       '@vue/tsconfig': ^0.1.3
-      jsdom: ^20.0.0
       npm-run-all: ^4.1.5
       pinia: ^2.0.21
       typescript: ~4.7.4
       vite: ^3.0.9
-      vitest: ^0.23.0
       vue: ^3.2.38
       vue-tsc: ^0.40.7
     dependencies:
       pinia: 2.0.21_fl6vay66s5mfyioevoftbjhvcm
       vue: 3.2.38
     devDependencies:
-      '@types/jsdom': 20.0.0
+      '@playwright/test': 1.25.1
       '@types/node': 16.11.56
       '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
       '@vitejs/plugin-vue-jsx': 2.0.1_vite@3.0.9+vue@3.2.38
-      '@vue/test-utils': 2.0.2_vue@3.2.38
       '@vue/tsconfig': 0.1.3_@types+node@16.11.56
-      jsdom: 20.0.0
       npm-run-all: 4.1.5
       typescript: 4.7.4
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
       vue-tsc: 0.40.7_typescript@4.7.4
 
-  playground/typescript-jsx-pinia-vitest-cypress:
+  playground/typescript-jsx-pinia-vitest:
     specifiers:
       '@types/jsdom': ^20.0.0
       '@types/node': ^16.11.56
@@ -966,11 +1245,9 @@ importers:
       '@vitejs/plugin-vue-jsx': ^2.0.1
       '@vue/test-utils': ^2.0.2
       '@vue/tsconfig': ^0.1.3
-      cypress: ^10.7.0
       jsdom: ^20.0.0
       npm-run-all: ^4.1.5
       pinia: ^2.0.21
-      start-server-and-test: ^1.14.0
       typescript: ~4.7.4
       vite: ^3.0.9
       vitest: ^0.23.0
@@ -986,16 +1263,14 @@ importers:
       '@vitejs/plugin-vue-jsx': 2.0.1_vite@3.0.9+vue@3.2.38
       '@vue/test-utils': 2.0.2_vue@3.2.38
       '@vue/tsconfig': 0.1.3_@types+node@16.11.56
-      cypress: 10.7.0
       jsdom: 20.0.0
       npm-run-all: 4.1.5
-      start-server-and-test: 1.14.0
       typescript: 4.7.4
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
+      vitest: 0.23.1_jsdom@20.0.0
       vue-tsc: 0.40.7_typescript@4.7.4
 
-  playground/typescript-jsx-pinia-with-tests:
+  playground/typescript-jsx-pinia-vitest-cypress:
     specifiers:
       '@types/jsdom': ^20.0.0
       '@types/node': ^16.11.56
@@ -1029,20 +1304,117 @@ importers:
       start-server-and-test: 1.14.0
       typescript: 4.7.4
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
+      vitest: 0.23.1_jsdom@20.0.0
       vue-tsc: 0.40.7_typescript@4.7.4
 
-  playground/typescript-jsx-router:
+  playground/typescript-jsx-pinia-vitest-playwright:
     specifiers:
+      '@playwright/test': ^1.25.1
+      '@types/jsdom': ^20.0.0
       '@types/node': ^16.11.56
       '@vitejs/plugin-vue': ^3.0.3
       '@vitejs/plugin-vue-jsx': ^2.0.1
+      '@vue/test-utils': ^2.0.2
       '@vue/tsconfig': ^0.1.3
+      jsdom: ^20.0.0
       npm-run-all: ^4.1.5
+      pinia: ^2.0.21
       typescript: ~4.7.4
       vite: ^3.0.9
+      vitest: ^0.23.0
       vue: ^3.2.38
-      vue-router: ^4.1.5
+      vue-tsc: ^0.40.7
+    dependencies:
+      pinia: 2.0.21_fl6vay66s5mfyioevoftbjhvcm
+      vue: 3.2.38
+    devDependencies:
+      '@playwright/test': 1.25.1
+      '@types/jsdom': 20.0.0
+      '@types/node': 16.11.56
+      '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
+      '@vitejs/plugin-vue-jsx': 2.0.1_vite@3.0.9+vue@3.2.38
+      '@vue/test-utils': 2.0.2_vue@3.2.38
+      '@vue/tsconfig': 0.1.3_@types+node@16.11.56
+      jsdom: 20.0.0
+      npm-run-all: 4.1.5
+      typescript: 4.7.4
+      vite: 3.0.9
+      vitest: 0.23.1_jsdom@20.0.0
+      vue-tsc: 0.40.7_typescript@4.7.4
+
+  playground/typescript-jsx-pinia-with-tests:
+    specifiers:
+      '@types/jsdom': ^20.0.0
+      '@types/node': ^16.11.56
+      '@vitejs/plugin-vue': ^3.0.3
+      '@vitejs/plugin-vue-jsx': ^2.0.1
+      '@vue/test-utils': ^2.0.2
+      '@vue/tsconfig': ^0.1.3
+      cypress: ^10.7.0
+      jsdom: ^20.0.0
+      npm-run-all: ^4.1.5
+      pinia: ^2.0.21
+      start-server-and-test: ^1.14.0
+      typescript: ~4.7.4
+      vite: ^3.0.9
+      vitest: ^0.23.0
+      vue: ^3.2.38
+      vue-tsc: ^0.40.7
+    dependencies:
+      pinia: 2.0.21_fl6vay66s5mfyioevoftbjhvcm
+      vue: 3.2.38
+    devDependencies:
+      '@types/jsdom': 20.0.0
+      '@types/node': 16.11.56
+      '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
+      '@vitejs/plugin-vue-jsx': 2.0.1_vite@3.0.9+vue@3.2.38
+      '@vue/test-utils': 2.0.2_vue@3.2.38
+      '@vue/tsconfig': 0.1.3_@types+node@16.11.56
+      cypress: 10.7.0
+      jsdom: 20.0.0
+      npm-run-all: 4.1.5
+      start-server-and-test: 1.14.0
+      typescript: 4.7.4
+      vite: 3.0.9
+      vitest: 0.23.1_jsdom@20.0.0
+      vue-tsc: 0.40.7_typescript@4.7.4
+
+  playground/typescript-jsx-playwright:
+    specifiers:
+      '@playwright/test': ^1.25.1
+      '@types/node': ^16.11.56
+      '@vitejs/plugin-vue': ^3.0.3
+      '@vitejs/plugin-vue-jsx': ^2.0.1
+      '@vue/tsconfig': ^0.1.3
+      npm-run-all: ^4.1.5
+      typescript: ~4.7.4
+      vite: ^3.0.9
+      vue: ^3.2.38
+      vue-tsc: ^0.40.7
+    dependencies:
+      vue: 3.2.38
+    devDependencies:
+      '@playwright/test': 1.25.1
+      '@types/node': 16.11.56
+      '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
+      '@vitejs/plugin-vue-jsx': 2.0.1_vite@3.0.9+vue@3.2.38
+      '@vue/tsconfig': 0.1.3_@types+node@16.11.56
+      npm-run-all: 4.1.5
+      typescript: 4.7.4
+      vite: 3.0.9
+      vue-tsc: 0.40.7_typescript@4.7.4
+
+  playground/typescript-jsx-router:
+    specifiers:
+      '@types/node': ^16.11.56
+      '@vitejs/plugin-vue': ^3.0.3
+      '@vitejs/plugin-vue-jsx': ^2.0.1
+      '@vue/tsconfig': ^0.1.3
+      npm-run-all: ^4.1.5
+      typescript: ~4.7.4
+      vite: ^3.0.9
+      vue: ^3.2.38
+      vue-router: ^4.1.5
       vue-tsc: ^0.40.7
     dependencies:
       vue: 3.2.38
@@ -1144,6 +1516,35 @@ importers:
       vite: 3.0.9
       vue-tsc: 0.40.7_typescript@4.7.4
 
+  playground/typescript-jsx-router-pinia-playwright:
+    specifiers:
+      '@playwright/test': ^1.25.1
+      '@types/node': ^16.11.56
+      '@vitejs/plugin-vue': ^3.0.3
+      '@vitejs/plugin-vue-jsx': ^2.0.1
+      '@vue/tsconfig': ^0.1.3
+      npm-run-all: ^4.1.5
+      pinia: ^2.0.21
+      typescript: ~4.7.4
+      vite: ^3.0.9
+      vue: ^3.2.38
+      vue-router: ^4.1.5
+      vue-tsc: ^0.40.7
+    dependencies:
+      pinia: 2.0.21_fl6vay66s5mfyioevoftbjhvcm
+      vue: 3.2.38
+      vue-router: 4.1.5_vue@3.2.38
+    devDependencies:
+      '@playwright/test': 1.25.1
+      '@types/node': 16.11.56
+      '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
+      '@vitejs/plugin-vue-jsx': 2.0.1_vite@3.0.9+vue@3.2.38
+      '@vue/tsconfig': 0.1.3_@types+node@16.11.56
+      npm-run-all: 4.1.5
+      typescript: 4.7.4
+      vite: 3.0.9
+      vue-tsc: 0.40.7_typescript@4.7.4
+
   playground/typescript-jsx-router-pinia-vitest:
     specifiers:
       '@types/jsdom': ^20.0.0
@@ -1176,7 +1577,7 @@ importers:
       npm-run-all: 4.1.5
       typescript: 4.7.4
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
+      vitest: 0.23.1_jsdom@20.0.0
       vue-tsc: 0.40.7_typescript@4.7.4
 
   playground/typescript-jsx-router-pinia-vitest-cypress:
@@ -1203,156 +1604,530 @@ importers:
       vue: 3.2.38
       vue-router: 4.1.5_vue@3.2.38
     devDependencies:
-      '@types/jsdom': 20.0.0
+      '@types/jsdom': 20.0.0
+      '@types/node': 16.11.56
+      '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
+      '@vitejs/plugin-vue-jsx': 2.0.1_vite@3.0.9+vue@3.2.38
+      '@vue/test-utils': 2.0.2_vue@3.2.38
+      '@vue/tsconfig': 0.1.3_@types+node@16.11.56
+      cypress: 10.7.0
+      jsdom: 20.0.0
+      npm-run-all: 4.1.5
+      start-server-and-test: 1.14.0
+      typescript: 4.7.4
+      vite: 3.0.9
+      vitest: 0.23.1_jsdom@20.0.0
+      vue-tsc: 0.40.7_typescript@4.7.4
+
+  playground/typescript-jsx-router-pinia-vitest-playwright:
+    specifiers:
+      '@playwright/test': ^1.25.1
+      '@types/jsdom': ^20.0.0
+      '@types/node': ^16.11.56
+      '@vitejs/plugin-vue': ^3.0.3
+      '@vitejs/plugin-vue-jsx': ^2.0.1
+      '@vue/test-utils': ^2.0.2
+      '@vue/tsconfig': ^0.1.3
+      jsdom: ^20.0.0
+      npm-run-all: ^4.1.5
+      pinia: ^2.0.21
+      typescript: ~4.7.4
+      vite: ^3.0.9
+      vitest: ^0.23.0
+      vue: ^3.2.38
+      vue-router: ^4.1.5
+      vue-tsc: ^0.40.7
+    dependencies:
+      pinia: 2.0.21_fl6vay66s5mfyioevoftbjhvcm
+      vue: 3.2.38
+      vue-router: 4.1.5_vue@3.2.38
+    devDependencies:
+      '@playwright/test': 1.25.1
+      '@types/jsdom': 20.0.0
+      '@types/node': 16.11.56
+      '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
+      '@vitejs/plugin-vue-jsx': 2.0.1_vite@3.0.9+vue@3.2.38
+      '@vue/test-utils': 2.0.2_vue@3.2.38
+      '@vue/tsconfig': 0.1.3_@types+node@16.11.56
+      jsdom: 20.0.0
+      npm-run-all: 4.1.5
+      typescript: 4.7.4
+      vite: 3.0.9
+      vitest: 0.23.1_jsdom@20.0.0
+      vue-tsc: 0.40.7_typescript@4.7.4
+
+  playground/typescript-jsx-router-pinia-with-tests:
+    specifiers:
+      '@types/jsdom': ^20.0.0
+      '@types/node': ^16.11.56
+      '@vitejs/plugin-vue': ^3.0.3
+      '@vitejs/plugin-vue-jsx': ^2.0.1
+      '@vue/test-utils': ^2.0.2
+      '@vue/tsconfig': ^0.1.3
+      cypress: ^10.7.0
+      jsdom: ^20.0.0
+      npm-run-all: ^4.1.5
+      pinia: ^2.0.21
+      start-server-and-test: ^1.14.0
+      typescript: ~4.7.4
+      vite: ^3.0.9
+      vitest: ^0.23.0
+      vue: ^3.2.38
+      vue-router: ^4.1.5
+      vue-tsc: ^0.40.7
+    dependencies:
+      pinia: 2.0.21_fl6vay66s5mfyioevoftbjhvcm
+      vue: 3.2.38
+      vue-router: 4.1.5_vue@3.2.38
+    devDependencies:
+      '@types/jsdom': 20.0.0
+      '@types/node': 16.11.56
+      '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
+      '@vitejs/plugin-vue-jsx': 2.0.1_vite@3.0.9+vue@3.2.38
+      '@vue/test-utils': 2.0.2_vue@3.2.38
+      '@vue/tsconfig': 0.1.3_@types+node@16.11.56
+      cypress: 10.7.0
+      jsdom: 20.0.0
+      npm-run-all: 4.1.5
+      start-server-and-test: 1.14.0
+      typescript: 4.7.4
+      vite: 3.0.9
+      vitest: 0.23.1_jsdom@20.0.0
+      vue-tsc: 0.40.7_typescript@4.7.4
+
+  playground/typescript-jsx-router-playwright:
+    specifiers:
+      '@playwright/test': ^1.25.1
+      '@types/node': ^16.11.56
+      '@vitejs/plugin-vue': ^3.0.3
+      '@vitejs/plugin-vue-jsx': ^2.0.1
+      '@vue/tsconfig': ^0.1.3
+      npm-run-all: ^4.1.5
+      typescript: ~4.7.4
+      vite: ^3.0.9
+      vue: ^3.2.38
+      vue-router: ^4.1.5
+      vue-tsc: ^0.40.7
+    dependencies:
+      vue: 3.2.38
+      vue-router: 4.1.5_vue@3.2.38
+    devDependencies:
+      '@playwright/test': 1.25.1
+      '@types/node': 16.11.56
+      '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
+      '@vitejs/plugin-vue-jsx': 2.0.1_vite@3.0.9+vue@3.2.38
+      '@vue/tsconfig': 0.1.3_@types+node@16.11.56
+      npm-run-all: 4.1.5
+      typescript: 4.7.4
+      vite: 3.0.9
+      vue-tsc: 0.40.7_typescript@4.7.4
+
+  playground/typescript-jsx-router-vitest:
+    specifiers:
+      '@types/jsdom': ^20.0.0
+      '@types/node': ^16.11.56
+      '@vitejs/plugin-vue': ^3.0.3
+      '@vitejs/plugin-vue-jsx': ^2.0.1
+      '@vue/test-utils': ^2.0.2
+      '@vue/tsconfig': ^0.1.3
+      jsdom: ^20.0.0
+      npm-run-all: ^4.1.5
+      typescript: ~4.7.4
+      vite: ^3.0.9
+      vitest: ^0.23.0
+      vue: ^3.2.38
+      vue-router: ^4.1.5
+      vue-tsc: ^0.40.7
+    dependencies:
+      vue: 3.2.38
+      vue-router: 4.1.5_vue@3.2.38
+    devDependencies:
+      '@types/jsdom': 20.0.0
+      '@types/node': 16.11.56
+      '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
+      '@vitejs/plugin-vue-jsx': 2.0.1_vite@3.0.9+vue@3.2.38
+      '@vue/test-utils': 2.0.2_vue@3.2.38
+      '@vue/tsconfig': 0.1.3_@types+node@16.11.56
+      jsdom: 20.0.0
+      npm-run-all: 4.1.5
+      typescript: 4.7.4
+      vite: 3.0.9
+      vitest: 0.23.1_jsdom@20.0.0
+      vue-tsc: 0.40.7_typescript@4.7.4
+
+  playground/typescript-jsx-router-vitest-cypress:
+    specifiers:
+      '@types/jsdom': ^20.0.0
+      '@types/node': ^16.11.56
+      '@vitejs/plugin-vue': ^3.0.3
+      '@vitejs/plugin-vue-jsx': ^2.0.1
+      '@vue/test-utils': ^2.0.2
+      '@vue/tsconfig': ^0.1.3
+      cypress: ^10.7.0
+      jsdom: ^20.0.0
+      npm-run-all: ^4.1.5
+      start-server-and-test: ^1.14.0
+      typescript: ~4.7.4
+      vite: ^3.0.9
+      vitest: ^0.23.0
+      vue: ^3.2.38
+      vue-router: ^4.1.5
+      vue-tsc: ^0.40.7
+    dependencies:
+      vue: 3.2.38
+      vue-router: 4.1.5_vue@3.2.38
+    devDependencies:
+      '@types/jsdom': 20.0.0
+      '@types/node': 16.11.56
+      '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
+      '@vitejs/plugin-vue-jsx': 2.0.1_vite@3.0.9+vue@3.2.38
+      '@vue/test-utils': 2.0.2_vue@3.2.38
+      '@vue/tsconfig': 0.1.3_@types+node@16.11.56
+      cypress: 10.7.0
+      jsdom: 20.0.0
+      npm-run-all: 4.1.5
+      start-server-and-test: 1.14.0
+      typescript: 4.7.4
+      vite: 3.0.9
+      vitest: 0.23.1_jsdom@20.0.0
+      vue-tsc: 0.40.7_typescript@4.7.4
+
+  playground/typescript-jsx-router-vitest-playwright:
+    specifiers:
+      '@playwright/test': ^1.25.1
+      '@types/jsdom': ^20.0.0
+      '@types/node': ^16.11.56
+      '@vitejs/plugin-vue': ^3.0.3
+      '@vitejs/plugin-vue-jsx': ^2.0.1
+      '@vue/test-utils': ^2.0.2
+      '@vue/tsconfig': ^0.1.3
+      jsdom: ^20.0.0
+      npm-run-all: ^4.1.5
+      typescript: ~4.7.4
+      vite: ^3.0.9
+      vitest: ^0.23.0
+      vue: ^3.2.38
+      vue-router: ^4.1.5
+      vue-tsc: ^0.40.7
+    dependencies:
+      vue: 3.2.38
+      vue-router: 4.1.5_vue@3.2.38
+    devDependencies:
+      '@playwright/test': 1.25.1
+      '@types/jsdom': 20.0.0
+      '@types/node': 16.11.56
+      '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
+      '@vitejs/plugin-vue-jsx': 2.0.1_vite@3.0.9+vue@3.2.38
+      '@vue/test-utils': 2.0.2_vue@3.2.38
+      '@vue/tsconfig': 0.1.3_@types+node@16.11.56
+      jsdom: 20.0.0
+      npm-run-all: 4.1.5
+      typescript: 4.7.4
+      vite: 3.0.9
+      vitest: 0.23.1_jsdom@20.0.0
+      vue-tsc: 0.40.7_typescript@4.7.4
+
+  playground/typescript-jsx-router-with-tests:
+    specifiers:
+      '@types/jsdom': ^20.0.0
+      '@types/node': ^16.11.56
+      '@vitejs/plugin-vue': ^3.0.3
+      '@vitejs/plugin-vue-jsx': ^2.0.1
+      '@vue/test-utils': ^2.0.2
+      '@vue/tsconfig': ^0.1.3
+      cypress: ^10.7.0
+      jsdom: ^20.0.0
+      npm-run-all: ^4.1.5
+      start-server-and-test: ^1.14.0
+      typescript: ~4.7.4
+      vite: ^3.0.9
+      vitest: ^0.23.0
+      vue: ^3.2.38
+      vue-router: ^4.1.5
+      vue-tsc: ^0.40.7
+    dependencies:
+      vue: 3.2.38
+      vue-router: 4.1.5_vue@3.2.38
+    devDependencies:
+      '@types/jsdom': 20.0.0
+      '@types/node': 16.11.56
+      '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
+      '@vitejs/plugin-vue-jsx': 2.0.1_vite@3.0.9+vue@3.2.38
+      '@vue/test-utils': 2.0.2_vue@3.2.38
+      '@vue/tsconfig': 0.1.3_@types+node@16.11.56
+      cypress: 10.7.0
+      jsdom: 20.0.0
+      npm-run-all: 4.1.5
+      start-server-and-test: 1.14.0
+      typescript: 4.7.4
+      vite: 3.0.9
+      vitest: 0.23.1_jsdom@20.0.0
+      vue-tsc: 0.40.7_typescript@4.7.4
+
+  playground/typescript-jsx-vitest:
+    specifiers:
+      '@types/jsdom': ^20.0.0
+      '@types/node': ^16.11.56
+      '@vitejs/plugin-vue': ^3.0.3
+      '@vitejs/plugin-vue-jsx': ^2.0.1
+      '@vue/test-utils': ^2.0.2
+      '@vue/tsconfig': ^0.1.3
+      jsdom: ^20.0.0
+      npm-run-all: ^4.1.5
+      typescript: ~4.7.4
+      vite: ^3.0.9
+      vitest: ^0.23.0
+      vue: ^3.2.38
+      vue-tsc: ^0.40.7
+    dependencies:
+      vue: 3.2.38
+    devDependencies:
+      '@types/jsdom': 20.0.0
+      '@types/node': 16.11.56
+      '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
+      '@vitejs/plugin-vue-jsx': 2.0.1_vite@3.0.9+vue@3.2.38
+      '@vue/test-utils': 2.0.2_vue@3.2.38
+      '@vue/tsconfig': 0.1.3_@types+node@16.11.56
+      jsdom: 20.0.0
+      npm-run-all: 4.1.5
+      typescript: 4.7.4
+      vite: 3.0.9
+      vitest: 0.23.1_jsdom@20.0.0
+      vue-tsc: 0.40.7_typescript@4.7.4
+
+  playground/typescript-jsx-vitest-cypress:
+    specifiers:
+      '@types/jsdom': ^20.0.0
+      '@types/node': ^16.11.56
+      '@vitejs/plugin-vue': ^3.0.3
+      '@vitejs/plugin-vue-jsx': ^2.0.1
+      '@vue/test-utils': ^2.0.2
+      '@vue/tsconfig': ^0.1.3
+      cypress: ^10.7.0
+      jsdom: ^20.0.0
+      npm-run-all: ^4.1.5
+      start-server-and-test: ^1.14.0
+      typescript: ~4.7.4
+      vite: ^3.0.9
+      vitest: ^0.23.0
+      vue: ^3.2.38
+      vue-tsc: ^0.40.7
+    dependencies:
+      vue: 3.2.38
+    devDependencies:
+      '@types/jsdom': 20.0.0
+      '@types/node': 16.11.56
+      '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
+      '@vitejs/plugin-vue-jsx': 2.0.1_vite@3.0.9+vue@3.2.38
+      '@vue/test-utils': 2.0.2_vue@3.2.38
+      '@vue/tsconfig': 0.1.3_@types+node@16.11.56
+      cypress: 10.7.0
+      jsdom: 20.0.0
+      npm-run-all: 4.1.5
+      start-server-and-test: 1.14.0
+      typescript: 4.7.4
+      vite: 3.0.9
+      vitest: 0.23.1_jsdom@20.0.0
+      vue-tsc: 0.40.7_typescript@4.7.4
+
+  playground/typescript-jsx-vitest-playwright:
+    specifiers:
+      '@playwright/test': ^1.25.1
+      '@types/jsdom': ^20.0.0
+      '@types/node': ^16.11.56
+      '@vitejs/plugin-vue': ^3.0.3
+      '@vitejs/plugin-vue-jsx': ^2.0.1
+      '@vue/test-utils': ^2.0.2
+      '@vue/tsconfig': ^0.1.3
+      jsdom: ^20.0.0
+      npm-run-all: ^4.1.5
+      typescript: ~4.7.4
+      vite: ^3.0.9
+      vitest: ^0.23.0
+      vue: ^3.2.38
+      vue-tsc: ^0.40.7
+    dependencies:
+      vue: 3.2.38
+    devDependencies:
+      '@playwright/test': 1.25.1
+      '@types/jsdom': 20.0.0
+      '@types/node': 16.11.56
+      '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
+      '@vitejs/plugin-vue-jsx': 2.0.1_vite@3.0.9+vue@3.2.38
+      '@vue/test-utils': 2.0.2_vue@3.2.38
+      '@vue/tsconfig': 0.1.3_@types+node@16.11.56
+      jsdom: 20.0.0
+      npm-run-all: 4.1.5
+      typescript: 4.7.4
+      vite: 3.0.9
+      vitest: 0.23.1_jsdom@20.0.0
+      vue-tsc: 0.40.7_typescript@4.7.4
+
+  playground/typescript-jsx-with-tests:
+    specifiers:
+      '@types/jsdom': ^20.0.0
+      '@types/node': ^16.11.56
+      '@vitejs/plugin-vue': ^3.0.3
+      '@vitejs/plugin-vue-jsx': ^2.0.1
+      '@vue/test-utils': ^2.0.2
+      '@vue/tsconfig': ^0.1.3
+      cypress: ^10.7.0
+      jsdom: ^20.0.0
+      npm-run-all: ^4.1.5
+      start-server-and-test: ^1.14.0
+      typescript: ~4.7.4
+      vite: ^3.0.9
+      vitest: ^0.23.0
+      vue: ^3.2.38
+      vue-tsc: ^0.40.7
+    dependencies:
+      vue: 3.2.38
+    devDependencies:
+      '@types/jsdom': 20.0.0
+      '@types/node': 16.11.56
+      '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
+      '@vitejs/plugin-vue-jsx': 2.0.1_vite@3.0.9+vue@3.2.38
+      '@vue/test-utils': 2.0.2_vue@3.2.38
+      '@vue/tsconfig': 0.1.3_@types+node@16.11.56
+      cypress: 10.7.0
+      jsdom: 20.0.0
+      npm-run-all: 4.1.5
+      start-server-and-test: 1.14.0
+      typescript: 4.7.4
+      vite: 3.0.9
+      vitest: 0.23.1_jsdom@20.0.0
+      vue-tsc: 0.40.7_typescript@4.7.4
+
+  playground/typescript-pinia:
+    specifiers:
+      '@types/node': ^16.11.56
+      '@vitejs/plugin-vue': ^3.0.3
+      '@vue/tsconfig': ^0.1.3
+      npm-run-all: ^4.1.5
+      pinia: ^2.0.21
+      typescript: ~4.7.4
+      vite: ^3.0.9
+      vue: ^3.2.38
+      vue-tsc: ^0.40.7
+    dependencies:
+      pinia: 2.0.21_fl6vay66s5mfyioevoftbjhvcm
+      vue: 3.2.38
+    devDependencies:
       '@types/node': 16.11.56
       '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
-      '@vitejs/plugin-vue-jsx': 2.0.1_vite@3.0.9+vue@3.2.38
-      '@vue/test-utils': 2.0.2_vue@3.2.38
       '@vue/tsconfig': 0.1.3_@types+node@16.11.56
-      cypress: 10.7.0
-      jsdom: 20.0.0
       npm-run-all: 4.1.5
-      start-server-and-test: 1.14.0
       typescript: 4.7.4
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
       vue-tsc: 0.40.7_typescript@4.7.4
 
-  playground/typescript-jsx-router-pinia-with-tests:
+  playground/typescript-pinia-cypress:
     specifiers:
-      '@types/jsdom': ^20.0.0
       '@types/node': ^16.11.56
       '@vitejs/plugin-vue': ^3.0.3
-      '@vitejs/plugin-vue-jsx': ^2.0.1
-      '@vue/test-utils': ^2.0.2
       '@vue/tsconfig': ^0.1.3
       cypress: ^10.7.0
-      jsdom: ^20.0.0
       npm-run-all: ^4.1.5
       pinia: ^2.0.21
       start-server-and-test: ^1.14.0
       typescript: ~4.7.4
       vite: ^3.0.9
-      vitest: ^0.23.0
       vue: ^3.2.38
-      vue-router: ^4.1.5
       vue-tsc: ^0.40.7
     dependencies:
       pinia: 2.0.21_fl6vay66s5mfyioevoftbjhvcm
       vue: 3.2.38
-      vue-router: 4.1.5_vue@3.2.38
     devDependencies:
-      '@types/jsdom': 20.0.0
       '@types/node': 16.11.56
       '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
-      '@vitejs/plugin-vue-jsx': 2.0.1_vite@3.0.9+vue@3.2.38
-      '@vue/test-utils': 2.0.2_vue@3.2.38
       '@vue/tsconfig': 0.1.3_@types+node@16.11.56
       cypress: 10.7.0
-      jsdom: 20.0.0
       npm-run-all: 4.1.5
       start-server-and-test: 1.14.0
       typescript: 4.7.4
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
       vue-tsc: 0.40.7_typescript@4.7.4
 
-  playground/typescript-jsx-router-vitest:
+  playground/typescript-pinia-playwright:
     specifiers:
-      '@types/jsdom': ^20.0.0
+      '@playwright/test': ^1.25.1
       '@types/node': ^16.11.56
       '@vitejs/plugin-vue': ^3.0.3
-      '@vitejs/plugin-vue-jsx': ^2.0.1
-      '@vue/test-utils': ^2.0.2
       '@vue/tsconfig': ^0.1.3
-      jsdom: ^20.0.0
       npm-run-all: ^4.1.5
+      pinia: ^2.0.21
       typescript: ~4.7.4
       vite: ^3.0.9
-      vitest: ^0.23.0
       vue: ^3.2.38
-      vue-router: ^4.1.5
       vue-tsc: ^0.40.7
     dependencies:
+      pinia: 2.0.21_fl6vay66s5mfyioevoftbjhvcm
       vue: 3.2.38
-      vue-router: 4.1.5_vue@3.2.38
     devDependencies:
-      '@types/jsdom': 20.0.0
+      '@playwright/test': 1.25.1
       '@types/node': 16.11.56
       '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
-      '@vitejs/plugin-vue-jsx': 2.0.1_vite@3.0.9+vue@3.2.38
-      '@vue/test-utils': 2.0.2_vue@3.2.38
       '@vue/tsconfig': 0.1.3_@types+node@16.11.56
-      jsdom: 20.0.0
       npm-run-all: 4.1.5
       typescript: 4.7.4
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
       vue-tsc: 0.40.7_typescript@4.7.4
 
-  playground/typescript-jsx-router-vitest-cypress:
+  playground/typescript-pinia-vitest:
     specifiers:
       '@types/jsdom': ^20.0.0
       '@types/node': ^16.11.56
       '@vitejs/plugin-vue': ^3.0.3
-      '@vitejs/plugin-vue-jsx': ^2.0.1
       '@vue/test-utils': ^2.0.2
       '@vue/tsconfig': ^0.1.3
-      cypress: ^10.7.0
       jsdom: ^20.0.0
       npm-run-all: ^4.1.5
-      start-server-and-test: ^1.14.0
+      pinia: ^2.0.21
       typescript: ~4.7.4
       vite: ^3.0.9
       vitest: ^0.23.0
       vue: ^3.2.38
-      vue-router: ^4.1.5
       vue-tsc: ^0.40.7
     dependencies:
+      pinia: 2.0.21_fl6vay66s5mfyioevoftbjhvcm
       vue: 3.2.38
-      vue-router: 4.1.5_vue@3.2.38
     devDependencies:
       '@types/jsdom': 20.0.0
       '@types/node': 16.11.56
       '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
-      '@vitejs/plugin-vue-jsx': 2.0.1_vite@3.0.9+vue@3.2.38
       '@vue/test-utils': 2.0.2_vue@3.2.38
       '@vue/tsconfig': 0.1.3_@types+node@16.11.56
-      cypress: 10.7.0
       jsdom: 20.0.0
       npm-run-all: 4.1.5
-      start-server-and-test: 1.14.0
       typescript: 4.7.4
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
+      vitest: 0.23.1_jsdom@20.0.0
       vue-tsc: 0.40.7_typescript@4.7.4
 
-  playground/typescript-jsx-router-with-tests:
+  playground/typescript-pinia-vitest-cypress:
     specifiers:
       '@types/jsdom': ^20.0.0
       '@types/node': ^16.11.56
       '@vitejs/plugin-vue': ^3.0.3
-      '@vitejs/plugin-vue-jsx': ^2.0.1
       '@vue/test-utils': ^2.0.2
       '@vue/tsconfig': ^0.1.3
       cypress: ^10.7.0
       jsdom: ^20.0.0
       npm-run-all: ^4.1.5
+      pinia: ^2.0.21
       start-server-and-test: ^1.14.0
       typescript: ~4.7.4
       vite: ^3.0.9
       vitest: ^0.23.0
       vue: ^3.2.38
-      vue-router: ^4.1.5
       vue-tsc: ^0.40.7
     dependencies:
+      pinia: 2.0.21_fl6vay66s5mfyioevoftbjhvcm
       vue: 3.2.38
-      vue-router: 4.1.5_vue@3.2.38
     devDependencies:
       '@types/jsdom': 20.0.0
       '@types/node': 16.11.56
       '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
-      '@vitejs/plugin-vue-jsx': 2.0.1_vite@3.0.9+vue@3.2.38
       '@vue/test-utils': 2.0.2_vue@3.2.38
       '@vue/tsconfig': 0.1.3_@types+node@16.11.56
       cypress: 10.7.0
@@ -1361,51 +2136,53 @@ importers:
       start-server-and-test: 1.14.0
       typescript: 4.7.4
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
+      vitest: 0.23.1_jsdom@20.0.0
       vue-tsc: 0.40.7_typescript@4.7.4
 
-  playground/typescript-jsx-vitest:
+  playground/typescript-pinia-vitest-playwright:
     specifiers:
+      '@playwright/test': ^1.25.1
       '@types/jsdom': ^20.0.0
       '@types/node': ^16.11.56
       '@vitejs/plugin-vue': ^3.0.3
-      '@vitejs/plugin-vue-jsx': ^2.0.1
       '@vue/test-utils': ^2.0.2
       '@vue/tsconfig': ^0.1.3
       jsdom: ^20.0.0
       npm-run-all: ^4.1.5
+      pinia: ^2.0.21
       typescript: ~4.7.4
       vite: ^3.0.9
       vitest: ^0.23.0
       vue: ^3.2.38
       vue-tsc: ^0.40.7
     dependencies:
+      pinia: 2.0.21_fl6vay66s5mfyioevoftbjhvcm
       vue: 3.2.38
     devDependencies:
+      '@playwright/test': 1.25.1
       '@types/jsdom': 20.0.0
       '@types/node': 16.11.56
       '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
-      '@vitejs/plugin-vue-jsx': 2.0.1_vite@3.0.9+vue@3.2.38
       '@vue/test-utils': 2.0.2_vue@3.2.38
       '@vue/tsconfig': 0.1.3_@types+node@16.11.56
       jsdom: 20.0.0
       npm-run-all: 4.1.5
       typescript: 4.7.4
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
+      vitest: 0.23.1_jsdom@20.0.0
       vue-tsc: 0.40.7_typescript@4.7.4
 
-  playground/typescript-jsx-vitest-cypress:
+  playground/typescript-pinia-with-tests:
     specifiers:
       '@types/jsdom': ^20.0.0
       '@types/node': ^16.11.56
       '@vitejs/plugin-vue': ^3.0.3
-      '@vitejs/plugin-vue-jsx': ^2.0.1
       '@vue/test-utils': ^2.0.2
       '@vue/tsconfig': ^0.1.3
       cypress: ^10.7.0
       jsdom: ^20.0.0
       npm-run-all: ^4.1.5
+      pinia: ^2.0.21
       start-server-and-test: ^1.14.0
       typescript: ~4.7.4
       vite: ^3.0.9
@@ -1413,12 +2190,12 @@ importers:
       vue: ^3.2.38
       vue-tsc: ^0.40.7
     dependencies:
+      pinia: 2.0.21_fl6vay66s5mfyioevoftbjhvcm
       vue: 3.2.38
     devDependencies:
       '@types/jsdom': 20.0.0
       '@types/node': 16.11.56
       '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
-      '@vitejs/plugin-vue-jsx': 2.0.1_vite@3.0.9+vue@3.2.38
       '@vue/test-utils': 2.0.2_vue@3.2.38
       '@vue/tsconfig': 0.1.3_@types+node@16.11.56
       cypress: 10.7.0
@@ -1427,58 +2204,46 @@ importers:
       start-server-and-test: 1.14.0
       typescript: 4.7.4
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
+      vitest: 0.23.1_jsdom@20.0.0
       vue-tsc: 0.40.7_typescript@4.7.4
 
-  playground/typescript-jsx-with-tests:
+  playground/typescript-playwright:
     specifiers:
-      '@types/jsdom': ^20.0.0
+      '@playwright/test': ^1.25.1
       '@types/node': ^16.11.56
       '@vitejs/plugin-vue': ^3.0.3
-      '@vitejs/plugin-vue-jsx': ^2.0.1
-      '@vue/test-utils': ^2.0.2
       '@vue/tsconfig': ^0.1.3
-      cypress: ^10.7.0
-      jsdom: ^20.0.0
       npm-run-all: ^4.1.5
-      start-server-and-test: ^1.14.0
       typescript: ~4.7.4
       vite: ^3.0.9
-      vitest: ^0.23.0
       vue: ^3.2.38
       vue-tsc: ^0.40.7
     dependencies:
       vue: 3.2.38
     devDependencies:
-      '@types/jsdom': 20.0.0
+      '@playwright/test': 1.25.1
       '@types/node': 16.11.56
       '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
-      '@vitejs/plugin-vue-jsx': 2.0.1_vite@3.0.9+vue@3.2.38
-      '@vue/test-utils': 2.0.2_vue@3.2.38
       '@vue/tsconfig': 0.1.3_@types+node@16.11.56
-      cypress: 10.7.0
-      jsdom: 20.0.0
       npm-run-all: 4.1.5
-      start-server-and-test: 1.14.0
       typescript: 4.7.4
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
       vue-tsc: 0.40.7_typescript@4.7.4
 
-  playground/typescript-pinia:
+  playground/typescript-router:
     specifiers:
       '@types/node': ^16.11.56
       '@vitejs/plugin-vue': ^3.0.3
       '@vue/tsconfig': ^0.1.3
       npm-run-all: ^4.1.5
-      pinia: ^2.0.21
       typescript: ~4.7.4
       vite: ^3.0.9
       vue: ^3.2.38
+      vue-router: ^4.1.5
       vue-tsc: ^0.40.7
     dependencies:
-      pinia: 2.0.21_fl6vay66s5mfyioevoftbjhvcm
       vue: 3.2.38
+      vue-router: 4.1.5_vue@3.2.38
     devDependencies:
       '@types/node': 16.11.56
       '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
@@ -1488,22 +2253,22 @@ importers:
       vite: 3.0.9
       vue-tsc: 0.40.7_typescript@4.7.4
 
-  playground/typescript-pinia-cypress:
+  playground/typescript-router-cypress:
     specifiers:
       '@types/node': ^16.11.56
       '@vitejs/plugin-vue': ^3.0.3
       '@vue/tsconfig': ^0.1.3
       cypress: ^10.7.0
       npm-run-all: ^4.1.5
-      pinia: ^2.0.21
       start-server-and-test: ^1.14.0
       typescript: ~4.7.4
       vite: ^3.0.9
       vue: ^3.2.38
+      vue-router: ^4.1.5
       vue-tsc: ^0.40.7
     dependencies:
-      pinia: 2.0.21_fl6vay66s5mfyioevoftbjhvcm
       vue: 3.2.38
+      vue-router: 4.1.5_vue@3.2.38
     devDependencies:
       '@types/node': 16.11.56
       '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
@@ -1515,166 +2280,171 @@ importers:
       vite: 3.0.9
       vue-tsc: 0.40.7_typescript@4.7.4
 
-  playground/typescript-pinia-vitest:
+  playground/typescript-router-pinia:
     specifiers:
-      '@types/jsdom': ^20.0.0
       '@types/node': ^16.11.56
       '@vitejs/plugin-vue': ^3.0.3
-      '@vue/test-utils': ^2.0.2
       '@vue/tsconfig': ^0.1.3
-      jsdom: ^20.0.0
       npm-run-all: ^4.1.5
       pinia: ^2.0.21
       typescript: ~4.7.4
       vite: ^3.0.9
-      vitest: ^0.23.0
       vue: ^3.2.38
+      vue-router: ^4.1.5
       vue-tsc: ^0.40.7
     dependencies:
       pinia: 2.0.21_fl6vay66s5mfyioevoftbjhvcm
       vue: 3.2.38
+      vue-router: 4.1.5_vue@3.2.38
     devDependencies:
-      '@types/jsdom': 20.0.0
       '@types/node': 16.11.56
       '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
-      '@vue/test-utils': 2.0.2_vue@3.2.38
       '@vue/tsconfig': 0.1.3_@types+node@16.11.56
-      jsdom: 20.0.0
       npm-run-all: 4.1.5
       typescript: 4.7.4
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
       vue-tsc: 0.40.7_typescript@4.7.4
 
-  playground/typescript-pinia-vitest-cypress:
+  playground/typescript-router-pinia-cypress:
     specifiers:
-      '@types/jsdom': ^20.0.0
       '@types/node': ^16.11.56
       '@vitejs/plugin-vue': ^3.0.3
-      '@vue/test-utils': ^2.0.2
       '@vue/tsconfig': ^0.1.3
       cypress: ^10.7.0
-      jsdom: ^20.0.0
       npm-run-all: ^4.1.5
       pinia: ^2.0.21
       start-server-and-test: ^1.14.0
       typescript: ~4.7.4
       vite: ^3.0.9
-      vitest: ^0.23.0
       vue: ^3.2.38
+      vue-router: ^4.1.5
       vue-tsc: ^0.40.7
     dependencies:
       pinia: 2.0.21_fl6vay66s5mfyioevoftbjhvcm
       vue: 3.2.38
+      vue-router: 4.1.5_vue@3.2.38
     devDependencies:
-      '@types/jsdom': 20.0.0
       '@types/node': 16.11.56
       '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
-      '@vue/test-utils': 2.0.2_vue@3.2.38
       '@vue/tsconfig': 0.1.3_@types+node@16.11.56
       cypress: 10.7.0
-      jsdom: 20.0.0
       npm-run-all: 4.1.5
       start-server-and-test: 1.14.0
       typescript: 4.7.4
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
       vue-tsc: 0.40.7_typescript@4.7.4
 
-  playground/typescript-pinia-with-tests:
+  playground/typescript-router-pinia-playwright:
     specifiers:
-      '@types/jsdom': ^20.0.0
+      '@playwright/test': ^1.25.1
       '@types/node': ^16.11.56
       '@vitejs/plugin-vue': ^3.0.3
-      '@vue/test-utils': ^2.0.2
       '@vue/tsconfig': ^0.1.3
-      cypress: ^10.7.0
-      jsdom: ^20.0.0
       npm-run-all: ^4.1.5
       pinia: ^2.0.21
-      start-server-and-test: ^1.14.0
       typescript: ~4.7.4
       vite: ^3.0.9
-      vitest: ^0.23.0
       vue: ^3.2.38
+      vue-router: ^4.1.5
       vue-tsc: ^0.40.7
     dependencies:
       pinia: 2.0.21_fl6vay66s5mfyioevoftbjhvcm
       vue: 3.2.38
+      vue-router: 4.1.5_vue@3.2.38
     devDependencies:
-      '@types/jsdom': 20.0.0
+      '@playwright/test': 1.25.1
       '@types/node': 16.11.56
       '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
-      '@vue/test-utils': 2.0.2_vue@3.2.38
       '@vue/tsconfig': 0.1.3_@types+node@16.11.56
-      cypress: 10.7.0
-      jsdom: 20.0.0
       npm-run-all: 4.1.5
-      start-server-and-test: 1.14.0
       typescript: 4.7.4
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
       vue-tsc: 0.40.7_typescript@4.7.4
 
-  playground/typescript-router:
+  playground/typescript-router-pinia-vitest:
     specifiers:
+      '@types/jsdom': ^20.0.0
       '@types/node': ^16.11.56
       '@vitejs/plugin-vue': ^3.0.3
+      '@vue/test-utils': ^2.0.2
       '@vue/tsconfig': ^0.1.3
+      jsdom: ^20.0.0
       npm-run-all: ^4.1.5
+      pinia: ^2.0.21
       typescript: ~4.7.4
       vite: ^3.0.9
+      vitest: ^0.23.0
       vue: ^3.2.38
       vue-router: ^4.1.5
       vue-tsc: ^0.40.7
     dependencies:
+      pinia: 2.0.21_fl6vay66s5mfyioevoftbjhvcm
       vue: 3.2.38
       vue-router: 4.1.5_vue@3.2.38
     devDependencies:
+      '@types/jsdom': 20.0.0
       '@types/node': 16.11.56
       '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
+      '@vue/test-utils': 2.0.2_vue@3.2.38
       '@vue/tsconfig': 0.1.3_@types+node@16.11.56
+      jsdom: 20.0.0
       npm-run-all: 4.1.5
       typescript: 4.7.4
       vite: 3.0.9
+      vitest: 0.23.1_jsdom@20.0.0
       vue-tsc: 0.40.7_typescript@4.7.4
 
-  playground/typescript-router-cypress:
+  playground/typescript-router-pinia-vitest-cypress:
     specifiers:
+      '@types/jsdom': ^20.0.0
       '@types/node': ^16.11.56
       '@vitejs/plugin-vue': ^3.0.3
+      '@vue/test-utils': ^2.0.2
       '@vue/tsconfig': ^0.1.3
       cypress: ^10.7.0
+      jsdom: ^20.0.0
       npm-run-all: ^4.1.5
+      pinia: ^2.0.21
       start-server-and-test: ^1.14.0
       typescript: ~4.7.4
       vite: ^3.0.9
+      vitest: ^0.23.0
       vue: ^3.2.38
       vue-router: ^4.1.5
       vue-tsc: ^0.40.7
     dependencies:
+      pinia: 2.0.21_fl6vay66s5mfyioevoftbjhvcm
       vue: 3.2.38
       vue-router: 4.1.5_vue@3.2.38
     devDependencies:
+      '@types/jsdom': 20.0.0
       '@types/node': 16.11.56
       '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
+      '@vue/test-utils': 2.0.2_vue@3.2.38
       '@vue/tsconfig': 0.1.3_@types+node@16.11.56
       cypress: 10.7.0
+      jsdom: 20.0.0
       npm-run-all: 4.1.5
       start-server-and-test: 1.14.0
       typescript: 4.7.4
       vite: 3.0.9
+      vitest: 0.23.1_jsdom@20.0.0
       vue-tsc: 0.40.7_typescript@4.7.4
 
-  playground/typescript-router-pinia:
+  playground/typescript-router-pinia-vitest-playwright:
     specifiers:
+      '@playwright/test': ^1.25.1
+      '@types/jsdom': ^20.0.0
       '@types/node': ^16.11.56
       '@vitejs/plugin-vue': ^3.0.3
+      '@vue/test-utils': ^2.0.2
       '@vue/tsconfig': ^0.1.3
+      jsdom: ^20.0.0
       npm-run-all: ^4.1.5
       pinia: ^2.0.21
       typescript: ~4.7.4
       vite: ^3.0.9
+      vitest: ^0.23.0
       vue: ^3.2.38
       vue-router: ^4.1.5
       vue-tsc: ^0.40.7
@@ -1683,25 +2453,34 @@ importers:
       vue: 3.2.38
       vue-router: 4.1.5_vue@3.2.38
     devDependencies:
+      '@playwright/test': 1.25.1
+      '@types/jsdom': 20.0.0
       '@types/node': 16.11.56
       '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
+      '@vue/test-utils': 2.0.2_vue@3.2.38
       '@vue/tsconfig': 0.1.3_@types+node@16.11.56
+      jsdom: 20.0.0
       npm-run-all: 4.1.5
       typescript: 4.7.4
       vite: 3.0.9
+      vitest: 0.23.1_jsdom@20.0.0
       vue-tsc: 0.40.7_typescript@4.7.4
 
-  playground/typescript-router-pinia-cypress:
+  playground/typescript-router-pinia-with-tests:
     specifiers:
+      '@types/jsdom': ^20.0.0
       '@types/node': ^16.11.56
       '@vitejs/plugin-vue': ^3.0.3
+      '@vue/test-utils': ^2.0.2
       '@vue/tsconfig': ^0.1.3
       cypress: ^10.7.0
+      jsdom: ^20.0.0
       npm-run-all: ^4.1.5
       pinia: ^2.0.21
       start-server-and-test: ^1.14.0
       typescript: ~4.7.4
       vite: ^3.0.9
+      vitest: ^0.23.0
       vue: ^3.2.38
       vue-router: ^4.1.5
       vue-tsc: ^0.40.7
@@ -1710,61 +2489,54 @@ importers:
       vue: 3.2.38
       vue-router: 4.1.5_vue@3.2.38
     devDependencies:
+      '@types/jsdom': 20.0.0
       '@types/node': 16.11.56
       '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
+      '@vue/test-utils': 2.0.2_vue@3.2.38
       '@vue/tsconfig': 0.1.3_@types+node@16.11.56
       cypress: 10.7.0
+      jsdom: 20.0.0
       npm-run-all: 4.1.5
       start-server-and-test: 1.14.0
       typescript: 4.7.4
       vite: 3.0.9
+      vitest: 0.23.1_jsdom@20.0.0
       vue-tsc: 0.40.7_typescript@4.7.4
 
-  playground/typescript-router-pinia-vitest:
+  playground/typescript-router-playwright:
     specifiers:
-      '@types/jsdom': ^20.0.0
+      '@playwright/test': ^1.25.1
       '@types/node': ^16.11.56
       '@vitejs/plugin-vue': ^3.0.3
-      '@vue/test-utils': ^2.0.2
       '@vue/tsconfig': ^0.1.3
-      jsdom: ^20.0.0
       npm-run-all: ^4.1.5
-      pinia: ^2.0.21
       typescript: ~4.7.4
       vite: ^3.0.9
-      vitest: ^0.23.0
       vue: ^3.2.38
       vue-router: ^4.1.5
       vue-tsc: ^0.40.7
     dependencies:
-      pinia: 2.0.21_fl6vay66s5mfyioevoftbjhvcm
       vue: 3.2.38
       vue-router: 4.1.5_vue@3.2.38
     devDependencies:
-      '@types/jsdom': 20.0.0
+      '@playwright/test': 1.25.1
       '@types/node': 16.11.56
       '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
-      '@vue/test-utils': 2.0.2_vue@3.2.38
       '@vue/tsconfig': 0.1.3_@types+node@16.11.56
-      jsdom: 20.0.0
       npm-run-all: 4.1.5
       typescript: 4.7.4
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
       vue-tsc: 0.40.7_typescript@4.7.4
 
-  playground/typescript-router-pinia-vitest-cypress:
+  playground/typescript-router-vitest:
     specifiers:
       '@types/jsdom': ^20.0.0
       '@types/node': ^16.11.56
       '@vitejs/plugin-vue': ^3.0.3
       '@vue/test-utils': ^2.0.2
       '@vue/tsconfig': ^0.1.3
-      cypress: ^10.7.0
       jsdom: ^20.0.0
       npm-run-all: ^4.1.5
-      pinia: ^2.0.21
-      start-server-and-test: ^1.14.0
       typescript: ~4.7.4
       vite: ^3.0.9
       vitest: ^0.23.0
@@ -1772,7 +2544,6 @@ importers:
       vue-router: ^4.1.5
       vue-tsc: ^0.40.7
     dependencies:
-      pinia: 2.0.21_fl6vay66s5mfyioevoftbjhvcm
       vue: 3.2.38
       vue-router: 4.1.5_vue@3.2.38
     devDependencies:
@@ -1781,16 +2552,14 @@ importers:
       '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
       '@vue/test-utils': 2.0.2_vue@3.2.38
       '@vue/tsconfig': 0.1.3_@types+node@16.11.56
-      cypress: 10.7.0
       jsdom: 20.0.0
       npm-run-all: 4.1.5
-      start-server-and-test: 1.14.0
       typescript: 4.7.4
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
+      vitest: 0.23.1_jsdom@20.0.0
       vue-tsc: 0.40.7_typescript@4.7.4
 
-  playground/typescript-router-pinia-with-tests:
+  playground/typescript-router-vitest-cypress:
     specifiers:
       '@types/jsdom': ^20.0.0
       '@types/node': ^16.11.56
@@ -1800,7 +2569,6 @@ importers:
       cypress: ^10.7.0
       jsdom: ^20.0.0
       npm-run-all: ^4.1.5
-      pinia: ^2.0.21
       start-server-and-test: ^1.14.0
       typescript: ~4.7.4
       vite: ^3.0.9
@@ -1809,7 +2577,6 @@ importers:
       vue-router: ^4.1.5
       vue-tsc: ^0.40.7
     dependencies:
-      pinia: 2.0.21_fl6vay66s5mfyioevoftbjhvcm
       vue: 3.2.38
       vue-router: 4.1.5_vue@3.2.38
     devDependencies:
@@ -1824,11 +2591,12 @@ importers:
       start-server-and-test: 1.14.0
       typescript: 4.7.4
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
+      vitest: 0.23.1_jsdom@20.0.0
       vue-tsc: 0.40.7_typescript@4.7.4
 
-  playground/typescript-router-vitest:
+  playground/typescript-router-vitest-playwright:
     specifiers:
+      '@playwright/test': ^1.25.1
       '@types/jsdom': ^20.0.0
       '@types/node': ^16.11.56
       '@vitejs/plugin-vue': ^3.0.3
@@ -1846,6 +2614,7 @@ importers:
       vue: 3.2.38
       vue-router: 4.1.5_vue@3.2.38
     devDependencies:
+      '@playwright/test': 1.25.1
       '@types/jsdom': 20.0.0
       '@types/node': 16.11.56
       '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
@@ -1855,10 +2624,10 @@ importers:
       npm-run-all: 4.1.5
       typescript: 4.7.4
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
+      vitest: 0.23.1_jsdom@20.0.0
       vue-tsc: 0.40.7_typescript@4.7.4
 
-  playground/typescript-router-vitest-cypress:
+  playground/typescript-router-with-tests:
     specifiers:
       '@types/jsdom': ^20.0.0
       '@types/node': ^16.11.56
@@ -1890,53 +2659,49 @@ importers:
       start-server-and-test: 1.14.0
       typescript: 4.7.4
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
+      vitest: 0.23.1_jsdom@20.0.0
       vue-tsc: 0.40.7_typescript@4.7.4
 
-  playground/typescript-router-with-tests:
+  playground/typescript-vitest:
     specifiers:
       '@types/jsdom': ^20.0.0
       '@types/node': ^16.11.56
       '@vitejs/plugin-vue': ^3.0.3
       '@vue/test-utils': ^2.0.2
       '@vue/tsconfig': ^0.1.3
-      cypress: ^10.7.0
       jsdom: ^20.0.0
       npm-run-all: ^4.1.5
-      start-server-and-test: ^1.14.0
       typescript: ~4.7.4
       vite: ^3.0.9
       vitest: ^0.23.0
       vue: ^3.2.38
-      vue-router: ^4.1.5
       vue-tsc: ^0.40.7
     dependencies:
       vue: 3.2.38
-      vue-router: 4.1.5_vue@3.2.38
     devDependencies:
       '@types/jsdom': 20.0.0
       '@types/node': 16.11.56
       '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
       '@vue/test-utils': 2.0.2_vue@3.2.38
       '@vue/tsconfig': 0.1.3_@types+node@16.11.56
-      cypress: 10.7.0
       jsdom: 20.0.0
       npm-run-all: 4.1.5
-      start-server-and-test: 1.14.0
       typescript: 4.7.4
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
+      vitest: 0.23.1_jsdom@20.0.0
       vue-tsc: 0.40.7_typescript@4.7.4
 
-  playground/typescript-vitest:
+  playground/typescript-vitest-cypress:
     specifiers:
       '@types/jsdom': ^20.0.0
       '@types/node': ^16.11.56
       '@vitejs/plugin-vue': ^3.0.3
       '@vue/test-utils': ^2.0.2
       '@vue/tsconfig': ^0.1.3
+      cypress: ^10.7.0
       jsdom: ^20.0.0
       npm-run-all: ^4.1.5
+      start-server-and-test: ^1.14.0
       typescript: ~4.7.4
       vite: ^3.0.9
       vitest: ^0.23.0
@@ -1950,24 +2715,25 @@ importers:
       '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
       '@vue/test-utils': 2.0.2_vue@3.2.38
       '@vue/tsconfig': 0.1.3_@types+node@16.11.56
+      cypress: 10.7.0
       jsdom: 20.0.0
       npm-run-all: 4.1.5
+      start-server-and-test: 1.14.0
       typescript: 4.7.4
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
+      vitest: 0.23.1_jsdom@20.0.0
       vue-tsc: 0.40.7_typescript@4.7.4
 
-  playground/typescript-vitest-cypress:
+  playground/typescript-vitest-playwright:
     specifiers:
+      '@playwright/test': ^1.25.1
       '@types/jsdom': ^20.0.0
       '@types/node': ^16.11.56
       '@vitejs/plugin-vue': ^3.0.3
       '@vue/test-utils': ^2.0.2
       '@vue/tsconfig': ^0.1.3
-      cypress: ^10.7.0
       jsdom: ^20.0.0
       npm-run-all: ^4.1.5
-      start-server-and-test: ^1.14.0
       typescript: ~4.7.4
       vite: ^3.0.9
       vitest: ^0.23.0
@@ -1976,18 +2742,17 @@ importers:
     dependencies:
       vue: 3.2.38
     devDependencies:
+      '@playwright/test': 1.25.1
       '@types/jsdom': 20.0.0
       '@types/node': 16.11.56
       '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
       '@vue/test-utils': 2.0.2_vue@3.2.38
       '@vue/tsconfig': 0.1.3_@types+node@16.11.56
-      cypress: 10.7.0
       jsdom: 20.0.0
       npm-run-all: 4.1.5
-      start-server-and-test: 1.14.0
       typescript: 4.7.4
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
+      vitest: 0.23.1_jsdom@20.0.0
       vue-tsc: 0.40.7_typescript@4.7.4
 
   playground/typescript-with-tests:
@@ -2020,7 +2785,7 @@ importers:
       start-server-and-test: 1.14.0
       typescript: 4.7.4
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
+      vitest: 0.23.1_jsdom@20.0.0
       vue-tsc: 0.40.7_typescript@4.7.4
 
   playground/vitest:
@@ -2038,7 +2803,7 @@ importers:
       '@vue/test-utils': 2.0.2_vue@3.2.38
       jsdom: 20.0.0
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
+      vitest: 0.23.1_jsdom@20.0.0
 
   playground/vitest-cypress:
     specifiers:
@@ -2059,7 +2824,26 @@ importers:
       jsdom: 20.0.0
       start-server-and-test: 1.14.0
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
+      vitest: 0.23.1_jsdom@20.0.0
+
+  playground/vitest-playwright:
+    specifiers:
+      '@playwright/test': ^1.25.1
+      '@vitejs/plugin-vue': ^3.0.3
+      '@vue/test-utils': ^2.0.2
+      jsdom: ^20.0.0
+      vite: ^3.0.9
+      vitest: ^0.23.0
+      vue: ^3.2.38
+    dependencies:
+      vue: 3.2.38
+    devDependencies:
+      '@playwright/test': 1.25.1
+      '@vitejs/plugin-vue': 3.0.3_vite@3.0.9+vue@3.2.38
+      '@vue/test-utils': 2.0.2_vue@3.2.38
+      jsdom: 20.0.0
+      vite: 3.0.9
+      vitest: 0.23.1_jsdom@20.0.0
 
   playground/with-tests:
     specifiers:
@@ -2080,7 +2864,7 @@ importers:
       jsdom: 20.0.0
       start-server-and-test: 1.14.0
       vite: 3.0.9
-      vitest: 0.23.0_jsdom@20.0.0
+      vitest: 0.23.1_jsdom@20.0.0
 
   template/base:
     specifiers:
@@ -2129,6 +2913,12 @@ importers:
       pinia: 2.0.21_vue@3.2.38
       vue: 3.2.38
 
+  template/config/playwright:
+    specifiers:
+      '@playwright/test': ^1.25.1
+    devDependencies:
+      '@playwright/test': 1.25.1
+
   template/config/router:
     specifiers:
       vue: ^3.2.38
@@ -2160,7 +2950,7 @@ importers:
     devDependencies:
       '@vue/test-utils': 2.0.2_vue@3.2.38
       jsdom: 20.0.0
-      vitest: 0.23.0_jsdom@20.0.0
+      vitest: 0.23.1_jsdom@20.0.0
 
   template/tsconfig/base:
     specifiers:
@@ -2184,7 +2974,7 @@ packages:
     engines: {node: '>=6.0.0'}
     dependencies:
       '@jridgewell/gen-mapping': 0.1.1
-      '@jridgewell/trace-mapping': 0.3.14
+      '@jridgewell/trace-mapping': 0.3.15
     dev: true
 
   /@babel/code-frame/7.18.6:
@@ -2194,8 +2984,8 @@ packages:
       '@babel/highlight': 7.18.6
     dev: true
 
-  /@babel/compat-data/7.18.8:
-    resolution: {integrity: sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==}
+  /@babel/compat-data/7.18.13:
+    resolution: {integrity: sha512-5yUzC5LqyTFp2HLmDoxGQelcdYgSpP9xsnMWBphAscOdFrHSAVbLNzWiy32sVNDqJRDiJK6klfDnAgu6PAGSHw==}
     engines: {node: '>=6.9.0'}
     dev: true
 
@@ -2244,10 +3034,10 @@ packages:
     peerDependencies:
       '@babel/core': ^7.0.0
     dependencies:
-      '@babel/compat-data': 7.18.8
+      '@babel/compat-data': 7.18.13
       '@babel/core': 7.18.13
       '@babel/helper-validator-option': 7.18.6
-      browserslist: 4.21.2
+      browserslist: 4.21.3
       semver: 6.3.0
     dev: true
 
@@ -2326,11 +3116,6 @@ packages:
       '@babel/types': 7.18.13
     dev: true
 
-  /@babel/helper-plugin-utils/7.18.6:
-    resolution: {integrity: sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg==}
-    engines: {node: '>=6.9.0'}
-    dev: true
-
   /@babel/helper-plugin-utils/7.18.9:
     resolution: {integrity: sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==}
     engines: {node: '>=6.9.0'}
@@ -2403,20 +3188,13 @@ packages:
     dependencies:
       '@babel/types': 7.18.13
 
-  /@babel/parser/7.18.8:
-    resolution: {integrity: sha512-RSKRfYX20dyH+elbJK2uqAkVyucL+xXzhqlMD5/ZXx+dAAwpyB7HsvnHe/ZUGOF+xLr5Wx9/JoXVTj6BQE2/oA==}
-    engines: {node: '>=6.0.0'}
-    hasBin: true
-    dependencies:
-      '@babel/types': 7.18.13
-
   /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.18.13:
     resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==}
     peerDependencies:
       '@babel/core': ^7.0.0-0
     dependencies:
       '@babel/core': 7.18.13
-      '@babel/helper-plugin-utils': 7.18.6
+      '@babel/helper-plugin-utils': 7.18.9
     dev: true
 
   /@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.18.13:
@@ -2528,8 +3306,8 @@ packages:
       - supports-color
     dev: true
 
-  /@esbuild/linux-loong64/0.14.53:
-    resolution: {integrity: sha512-W2dAL6Bnyn4xa/QRSU3ilIK4EzD5wgYXKXJiS1HDF5vU3675qc2bvFyLwbUcdmssDveyndy7FbitrCoiV/eMLg==}
+  /@esbuild/linux-loong64/0.14.54:
+    resolution: {integrity: sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==}
     engines: {node: '>=12'}
     cpu: [loong64]
     os: [linux]
@@ -2561,7 +3339,7 @@ packages:
     dependencies:
       '@jridgewell/set-array': 1.1.2
       '@jridgewell/sourcemap-codec': 1.4.14
-      '@jridgewell/trace-mapping': 0.3.14
+      '@jridgewell/trace-mapping': 0.3.15
     dev: true
 
   /@jridgewell/resolve-uri/3.1.0:
@@ -2578,8 +3356,8 @@ packages:
     resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==}
     dev: true
 
-  /@jridgewell/trace-mapping/0.3.14:
-    resolution: {integrity: sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==}
+  /@jridgewell/trace-mapping/0.3.15:
+    resolution: {integrity: sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==}
     dependencies:
       '@jridgewell/resolve-uri': 3.1.0
       '@jridgewell/sourcemap-codec': 1.4.14
@@ -2606,6 +3384,15 @@ packages:
       fastq: 1.13.0
     dev: true
 
+  /@playwright/test/1.25.1:
+    resolution: {integrity: sha512-IJ4X0yOakXtwkhbnNzKkaIgXe6df7u3H3FnuhI9Jqh+CdO0e/lYQlDLYiyI9cnXK8E7UAppAWP+VqAv6VX7HQg==}
+    engines: {node: '>=14'}
+    hasBin: true
+    dependencies:
+      '@types/node': 18.7.14
+      playwright-core: 1.25.1
+    dev: true
+
   /@sideway/address/4.1.4:
     resolution: {integrity: sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==}
     dependencies:
@@ -2649,15 +3436,15 @@ packages:
   /@types/fs-extra/9.0.13:
     resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==}
     dependencies:
-      '@types/node': 18.0.6
+      '@types/node': 18.7.14
     dev: true
 
   /@types/jsdom/20.0.0:
     resolution: {integrity: sha512-YfAchFs0yM1QPDrLm2VHe+WHGtqms3NXnXAMolrgrVP6fgBHHXy1ozAbo/dFtPNtZC/m66bPiCTWYmqp1F14gA==}
     dependencies:
-      '@types/node': 18.0.6
+      '@types/node': 18.7.14
       '@types/tough-cookie': 4.0.2
-      parse5: 7.0.0
+      parse5: 7.1.1
     dev: true
 
   /@types/json-schema/7.0.11:
@@ -2671,30 +3458,26 @@ packages:
   /@types/node-fetch/2.6.2:
     resolution: {integrity: sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==}
     dependencies:
-      '@types/node': 18.0.6
+      '@types/node': 18.7.14
       form-data: 3.0.1
     dev: true
 
-  /@types/node/14.18.22:
-    resolution: {integrity: sha512-qzaYbXVzin6EPjghf/hTdIbnVW1ErMx8rPzwRNJhlbyJhu2SyqlvjGOY/tbUt6VFyzg56lROcOeSQRInpt63Yw==}
-    dev: true
-
-  /@types/node/16.11.45:
-    resolution: {integrity: sha512-3rKg/L5x0rofKuuUt5zlXzOnKyIHXmIu5R8A0TuNDMF2062/AOIDBciFIjToLEJ/9F9DzkHNot+BpNsMI1OLdQ==}
+  /@types/node/14.18.26:
+    resolution: {integrity: sha512-0b+utRBSYj8L7XAp0d+DX7lI4cSmowNaaTkk6/1SKzbKkG+doLuPusB9EOvzLJ8ahJSk03bTLIL6cWaEd4dBKA==}
     dev: true
 
   /@types/node/16.11.56:
     resolution: {integrity: sha512-aFcUkv7EddxxOa/9f74DINReQ/celqH8DiB3fRYgVDM2Xm5QJL8sl80QKuAnGvwAsMn+H3IFA6WCrQh1CY7m1A==}
     dev: true
 
-  /@types/node/18.0.6:
-    resolution: {integrity: sha512-/xUq6H2aQm261exT6iZTMifUySEt4GR5KX8eYyY+C4MSNPqSh9oNIP7tz2GLKTlFaiBbgZNxffoR3CVRG+cljw==}
+  /@types/node/18.7.14:
+    resolution: {integrity: sha512-6bbDaETVi8oyIARulOE9qF1/Qdi/23z6emrUh0fNJRUmjznqrixD4MpGDdgOFk5Xb0m2H6Xu42JGdvAxaJR/wA==}
     dev: true
 
   /@types/prompts/2.0.14:
     resolution: {integrity: sha512-HZBd99fKxRWpYCErtm2/yxUZv6/PBI9J7N4TNFffl5JbrYMHBwF25DjQGTW3b3jmXq+9P6/8fCIb2ee57BFfYA==}
     dependencies:
-      '@types/node': 18.0.6
+      '@types/node': 18.7.14
     dev: true
 
   /@types/sinonjs__fake-timers/8.1.1:
@@ -2713,7 +3496,7 @@ packages:
     resolution: {integrity: sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==}
     requiresBuild: true
     dependencies:
-      '@types/node': 18.0.6
+      '@types/node': 18.7.14
     dev: true
     optional: true
 
@@ -2821,7 +3604,7 @@ packages:
   /@vue/compiler-sfc/3.2.38:
     resolution: {integrity: sha512-KZjrW32KloMYtTcHAFuw3CqsyWc5X6seb8KbkANSWt3Cz9p2qA8c1GJpSkksFP9ABb6an0FLCFl46ZFXx3kKpg==}
     dependencies:
-      '@babel/parser': 7.18.8
+      '@babel/parser': 7.18.13
       '@vue/compiler-core': 3.2.38
       '@vue/compiler-dom': 3.2.38
       '@vue/compiler-ssr': 3.2.38
@@ -2951,8 +3734,8 @@ packages:
     hasBin: true
     dev: true
 
-  /acorn/8.7.1:
-    resolution: {integrity: sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==}
+  /acorn/8.8.0:
+    resolution: {integrity: sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==}
     engines: {node: '>=0.4.0'}
     hasBin: true
     dev: true
@@ -3113,15 +3896,15 @@ packages:
     resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==}
     dev: true
 
-  /browserslist/4.21.2:
-    resolution: {integrity: sha512-MonuOgAtUB46uP5CezYbRaYKBNt2LxP0yX+Pmj4LkcDFGkn9Cbpi83d9sCjwQDErXsIJSzY5oKGDbgOlF/LPAA==}
+  /browserslist/4.21.3:
+    resolution: {integrity: sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==}
     engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
     hasBin: true
     dependencies:
-      caniuse-lite: 1.0.30001367
-      electron-to-chromium: 1.4.192
+      caniuse-lite: 1.0.30001388
+      electron-to-chromium: 1.4.241
       node-releases: 2.0.6
-      update-browserslist-db: 1.0.4_browserslist@4.21.2
+      update-browserslist-db: 1.0.7_browserslist@4.21.3
     dev: true
 
   /buffer-crc32/0.2.13:
@@ -3152,8 +3935,8 @@ packages:
     engines: {node: '>=10'}
     dev: true
 
-  /caniuse-lite/1.0.30001367:
-    resolution: {integrity: sha512-XDgbeOHfifWV3GEES2B8rtsrADx4Jf+juKX2SICJcaUhjYBO3bR96kvEIHa15VU6ohtOhBZuPGGYGbXMRn0NCw==}
+  /caniuse-lite/1.0.30001388:
+    resolution: {integrity: sha512-znVbq4OUjqgLxMxoNX2ZeeLR0d7lcDiE5uJ4eUiWdml1J1EkxbnQq6opT9jb9SMfJxB0XA16/ziHwni4u1I3GQ==}
     dev: true
 
   /caseless/0.12.0:
@@ -3195,7 +3978,7 @@ packages:
     dev: true
 
   /check-more-types/2.24.0:
-    resolution: {integrity: sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==}
+    resolution: {integrity: sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA=}
     engines: {node: '>= 0.8.0'}
     dev: true
 
@@ -3254,7 +4037,7 @@ packages:
     dev: true
 
   /color-name/1.1.3:
-    resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
+    resolution: {integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=}
     dev: true
 
   /color-name/1.1.4:
@@ -3288,7 +4071,7 @@ packages:
     dev: true
 
   /concat-map/0.0.1:
-    resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+    resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=}
     dev: true
 
   /convert-source-map/1.8.0:
@@ -3298,7 +4081,7 @@ packages:
     dev: true
 
   /core-util-is/1.0.2:
-    resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==}
+    resolution: {integrity: sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=}
     dev: true
 
   /cross-spawn/6.0.5:
@@ -3347,7 +4130,7 @@ packages:
     dependencies:
       '@cypress/request': 2.88.10
       '@cypress/xvfb': 1.2.4_supports-color@8.1.1
-      '@types/node': 14.18.22
+      '@types/node': 14.18.26
       '@types/sinonjs__fake-timers': 8.1.1
       '@types/sizzle': 2.3.3
       arch: 2.2.0
@@ -3361,10 +4144,10 @@ packages:
       cli-table3: 0.6.2
       commander: 5.1.0
       common-tags: 1.8.2
-      dayjs: 1.11.3
+      dayjs: 1.11.5
       debug: 4.3.4_supports-color@8.1.1
       enquirer: 2.3.6
-      eventemitter2: 6.4.6
+      eventemitter2: 6.4.7
       execa: 4.1.0
       executable: 4.1.1
       extract-zip: 2.0.1_supports-color@8.1.1
@@ -3405,8 +4188,8 @@ packages:
       whatwg-url: 11.0.0
     dev: true
 
-  /dayjs/1.11.3:
-    resolution: {integrity: sha512-xxwlswWOlGhzgQ4TKzASQkUhqERI3egRNqgV4ScR8wlANA/A9tZ7miXa44vTTKEq5l7vWoL5G57bG3zA+Kow0A==}
+  /dayjs/1.11.5:
+    resolution: {integrity: sha512-CAdX5Q3YW3Gclyo5Vpqkgpj8fSdLQcRuzfX6mC6Phy0nfJ0eGYOeS7m4mt2plDWLAtA4TqTakvbboHvUxfe4iA==}
     dev: true
 
   /debug/3.2.7_supports-color@8.1.1:
@@ -3458,8 +4241,8 @@ packages:
       supports-color: 8.1.1
     dev: true
 
-  /decimal.js/10.3.1:
-    resolution: {integrity: sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==}
+  /decimal.js/10.4.0:
+    resolution: {integrity: sha512-Nv6ENEzyPQ6AItkGwLE2PGKinZZ9g59vSh2BeH6NqPu0OTKZ5ruJsVqh/orbAnqXc9pBbgXAIrc2EyaCj8NpGg==}
     dev: true
 
   /deep-eql/3.0.1:
@@ -3515,8 +4298,8 @@ packages:
       safer-buffer: 2.1.2
     dev: true
 
-  /electron-to-chromium/1.4.192:
-    resolution: {integrity: sha512-8nCXyIQY9An88NXAp+PuPy5h3/w5ZY7Iu2lag65Q0XREprcat5F8gKhoHsBUnQcFuCRnmevpR8yEBYRU3d2HDw==}
+  /electron-to-chromium/1.4.241:
+    resolution: {integrity: sha512-e7Wsh4ilaioBZ5bMm6+F4V5c11dh56/5Jwz7Hl5Tu1J7cnB+Pqx5qIF2iC7HPpfyQMqGSvvLP5bBAIDd2gAtGw==}
     dev: true
 
   /emoji-regex/8.0.0:
@@ -3540,8 +4323,8 @@ packages:
       ansi-colors: 4.1.3
     dev: true
 
-  /entities/4.3.1:
-    resolution: {integrity: sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==}
+  /entities/4.4.0:
+    resolution: {integrity: sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==}
     engines: {node: '>=0.12'}
     dev: true
 
@@ -3551,8 +4334,8 @@ packages:
       is-arrayish: 0.2.1
     dev: true
 
-  /es-abstract/1.20.1:
-    resolution: {integrity: sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==}
+  /es-abstract/1.20.2:
+    resolution: {integrity: sha512-XxXQuVNrySBNlEkTYJoDNFe5+s2yIOpzq80sUHEdPdQr0S5nTLz4ZPPPswNIpKseDDUS5yghX1gfLIHQZ1iNuQ==}
     engines: {node: '>= 0.4'}
     dependencies:
       call-bind: 1.0.2
@@ -3573,7 +4356,7 @@ packages:
       is-weakref: 1.0.2
       object-inspect: 1.12.2
       object-keys: 1.1.1
-      object.assign: 4.1.2
+      object.assign: 4.1.4
       regexp.prototype.flags: 1.4.3
       string.prototype.trimend: 1.0.5
       string.prototype.trimstart: 1.0.5
@@ -3589,8 +4372,8 @@ packages:
       is-symbol: 1.0.4
     dev: true
 
-  /esbuild-android-64/0.14.53:
-    resolution: {integrity: sha512-fIL93sOTnEU+NrTAVMIKiAw0YH22HWCAgg4N4Z6zov2t0kY9RAJ50zY9ZMCQ+RT6bnOfDt8gCTnt/RaSNA2yRA==}
+  /esbuild-android-64/0.14.54:
+    resolution: {integrity: sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [android]
@@ -3598,8 +4381,8 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-android-arm64/0.14.53:
-    resolution: {integrity: sha512-PC7KaF1v0h/nWpvlU1UMN7dzB54cBH8qSsm7S9mkwFA1BXpaEOufCg8hdoEI1jep0KeO/rjZVWrsH8+q28T77A==}
+  /esbuild-android-arm64/0.14.54:
+    resolution: {integrity: sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==}
     engines: {node: '>=12'}
     cpu: [arm64]
     os: [android]
@@ -3607,8 +4390,8 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-darwin-64/0.14.53:
-    resolution: {integrity: sha512-gE7P5wlnkX4d4PKvLBUgmhZXvL7lzGRLri17/+CmmCzfncIgq8lOBvxGMiQ4xazplhxq+72TEohyFMZLFxuWvg==}
+  /esbuild-darwin-64/0.14.54:
+    resolution: {integrity: sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [darwin]
@@ -3616,8 +4399,8 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-darwin-arm64/0.14.53:
-    resolution: {integrity: sha512-otJwDU3hnI15Q98PX4MJbknSZ/WSR1I45il7gcxcECXzfN4Mrpft5hBDHXNRnCh+5858uPXBXA1Vaz2jVWLaIA==}
+  /esbuild-darwin-arm64/0.14.54:
+    resolution: {integrity: sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==}
     engines: {node: '>=12'}
     cpu: [arm64]
     os: [darwin]
@@ -3625,8 +4408,8 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-freebsd-64/0.14.53:
-    resolution: {integrity: sha512-WkdJa8iyrGHyKiPF4lk0MiOF87Q2SkE+i+8D4Cazq3/iqmGPJ6u49je300MFi5I2eUsQCkaOWhpCVQMTKGww2w==}
+  /esbuild-freebsd-64/0.14.54:
+    resolution: {integrity: sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [freebsd]
@@ -3634,8 +4417,8 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-freebsd-arm64/0.14.53:
-    resolution: {integrity: sha512-9T7WwCuV30NAx0SyQpw8edbKvbKELnnm1FHg7gbSYaatH+c8WJW10g/OdM7JYnv7qkimw2ZTtSA+NokOLd2ydQ==}
+  /esbuild-freebsd-arm64/0.14.54:
+    resolution: {integrity: sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==}
     engines: {node: '>=12'}
     cpu: [arm64]
     os: [freebsd]
@@ -3643,8 +4426,8 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-linux-32/0.14.53:
-    resolution: {integrity: sha512-VGanLBg5en2LfGDgLEUxQko2lqsOS7MTEWUi8x91YmsHNyzJVT/WApbFFx3MQGhkf+XdimVhpyo5/G0PBY91zg==}
+  /esbuild-linux-32/0.14.54:
+    resolution: {integrity: sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==}
     engines: {node: '>=12'}
     cpu: [ia32]
     os: [linux]
@@ -3652,8 +4435,8 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-linux-64/0.14.53:
-    resolution: {integrity: sha512-pP/FA55j/fzAV7N9DF31meAyjOH6Bjuo3aSKPh26+RW85ZEtbJv9nhoxmGTd9FOqjx59Tc1ZbrJabuiXlMwuZQ==}
+  /esbuild-linux-64/0.14.54:
+    resolution: {integrity: sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [linux]
@@ -3661,8 +4444,8 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-linux-arm/0.14.53:
-    resolution: {integrity: sha512-/u81NGAVZMopbmzd21Nu/wvnKQK3pT4CrvQ8BTje1STXcQAGnfyKgQlj3m0j2BzYbvQxSy+TMck4TNV2onvoPA==}
+  /esbuild-linux-arm/0.14.54:
+    resolution: {integrity: sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==}
     engines: {node: '>=12'}
     cpu: [arm]
     os: [linux]
@@ -3670,8 +4453,8 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-linux-arm64/0.14.53:
-    resolution: {integrity: sha512-GDmWITT+PMsjCA6/lByYk7NyFssW4Q6in32iPkpjZ/ytSyH+xeEx8q7HG3AhWH6heemEYEWpTll/eui3jwlSnw==}
+  /esbuild-linux-arm64/0.14.54:
+    resolution: {integrity: sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==}
     engines: {node: '>=12'}
     cpu: [arm64]
     os: [linux]
@@ -3679,8 +4462,8 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-linux-mips64le/0.14.53:
-    resolution: {integrity: sha512-d6/XHIQW714gSSp6tOOX2UscedVobELvQlPMkInhx1NPz4ThZI9uNLQ4qQJHGBGKGfu+rtJsxM4NVHLhnNRdWQ==}
+  /esbuild-linux-mips64le/0.14.54:
+    resolution: {integrity: sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==}
     engines: {node: '>=12'}
     cpu: [mips64el]
     os: [linux]
@@ -3688,8 +4471,8 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-linux-ppc64le/0.14.53:
-    resolution: {integrity: sha512-ndnJmniKPCB52m+r6BtHHLAOXw+xBCWIxNnedbIpuREOcbSU/AlyM/2dA3BmUQhsHdb4w3amD5U2s91TJ3MzzA==}
+  /esbuild-linux-ppc64le/0.14.54:
+    resolution: {integrity: sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==}
     engines: {node: '>=12'}
     cpu: [ppc64]
     os: [linux]
@@ -3697,8 +4480,8 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-linux-riscv64/0.14.53:
-    resolution: {integrity: sha512-yG2sVH+QSix6ct4lIzJj329iJF3MhloLE6/vKMQAAd26UVPVkhMFqFopY+9kCgYsdeWvXdPgmyOuKa48Y7+/EQ==}
+  /esbuild-linux-riscv64/0.14.54:
+    resolution: {integrity: sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==}
     engines: {node: '>=12'}
     cpu: [riscv64]
     os: [linux]
@@ -3706,8 +4489,8 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-linux-s390x/0.14.53:
-    resolution: {integrity: sha512-OCJlgdkB+XPYndHmw6uZT7jcYgzmx9K+28PVdOa/eLjdoYkeAFvH5hTwX4AXGLZLH09tpl4bVsEtvuyUldaNCg==}
+  /esbuild-linux-s390x/0.14.54:
+    resolution: {integrity: sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==}
     engines: {node: '>=12'}
     cpu: [s390x]
     os: [linux]
@@ -3715,8 +4498,8 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-netbsd-64/0.14.53:
-    resolution: {integrity: sha512-gp2SB+Efc7MhMdWV2+pmIs/Ja/Mi5rjw+wlDmmbIn68VGXBleNgiEZG+eV2SRS0kJEUyHNedDtwRIMzaohWedQ==}
+  /esbuild-netbsd-64/0.14.54:
+    resolution: {integrity: sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [netbsd]
@@ -3724,8 +4507,8 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-openbsd-64/0.14.53:
-    resolution: {integrity: sha512-eKQ30ZWe+WTZmteDYg8S+YjHV5s4iTxeSGhJKJajFfQx9TLZJvsJX0/paqwP51GicOUruFpSUAs2NCc0a4ivQQ==}
+  /esbuild-openbsd-64/0.14.54:
+    resolution: {integrity: sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [openbsd]
@@ -3733,16 +4516,16 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-plugin-license/1.2.2_esbuild@0.14.53:
+  /esbuild-plugin-license/1.2.2_esbuild@0.14.54:
     resolution: {integrity: sha512-sqa8V1pB6wr6L8lPQ+lD73ARTfi824H/smyUd4eBwvc+yGK0ZvfupXDqgmrFpP5zu6aTj8pMlnoowuDOjKGX5A==}
     peerDependencies:
       esbuild: '*'
     dependencies:
-      esbuild: 0.14.53
+      esbuild: 0.14.54
     dev: true
 
-  /esbuild-sunos-64/0.14.53:
-    resolution: {integrity: sha512-OWLpS7a2FrIRukQqcgQqR1XKn0jSJoOdT+RlhAxUoEQM/IpytS3FXzCJM6xjUYtpO5GMY0EdZJp+ur2pYdm39g==}
+  /esbuild-sunos-64/0.14.54:
+    resolution: {integrity: sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [sunos]
@@ -3750,8 +4533,8 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-windows-32/0.14.53:
-    resolution: {integrity: sha512-m14XyWQP5rwGW0tbEfp95U6A0wY0DYPInWBB7D69FAXUpBpBObRoGTKRv36lf2RWOdE4YO3TNvj37zhXjVL5xg==}
+  /esbuild-windows-32/0.14.54:
+    resolution: {integrity: sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==}
     engines: {node: '>=12'}
     cpu: [ia32]
     os: [win32]
@@ -3759,8 +4542,8 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-windows-64/0.14.53:
-    resolution: {integrity: sha512-s9skQFF0I7zqnQ2K8S1xdLSfZFsPLuOGmSx57h2btSEswv0N0YodYvqLcJMrNMXh6EynOmWD7rz+0rWWbFpIHQ==}
+  /esbuild-windows-64/0.14.54:
+    resolution: {integrity: sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [win32]
@@ -3768,8 +4551,8 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-windows-arm64/0.14.53:
-    resolution: {integrity: sha512-E+5Gvb+ZWts+00T9II6wp2L3KG2r3iGxByqd/a1RmLmYWVsSVUjkvIxZuJ3hYTIbhLkH5PRwpldGTKYqVz0nzQ==}
+  /esbuild-windows-arm64/0.14.54:
+    resolution: {integrity: sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==}
     engines: {node: '>=12'}
     cpu: [arm64]
     os: [win32]
@@ -3777,33 +4560,33 @@ packages:
     dev: true
     optional: true
 
-  /esbuild/0.14.53:
-    resolution: {integrity: sha512-ohO33pUBQ64q6mmheX1mZ8mIXj8ivQY/L4oVuAshr+aJI+zLl+amrp3EodrUNDNYVrKJXGPfIHFGhO8slGRjuw==}
+  /esbuild/0.14.54:
+    resolution: {integrity: sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==}
     engines: {node: '>=12'}
     hasBin: true
     requiresBuild: true
     optionalDependencies:
-      '@esbuild/linux-loong64': 0.14.53
-      esbuild-android-64: 0.14.53
-      esbuild-android-arm64: 0.14.53
-      esbuild-darwin-64: 0.14.53
-      esbuild-darwin-arm64: 0.14.53
-      esbuild-freebsd-64: 0.14.53
-      esbuild-freebsd-arm64: 0.14.53
-      esbuild-linux-32: 0.14.53
-      esbuild-linux-64: 0.14.53
-      esbuild-linux-arm: 0.14.53
-      esbuild-linux-arm64: 0.14.53
-      esbuild-linux-mips64le: 0.14.53
-      esbuild-linux-ppc64le: 0.14.53
-      esbuild-linux-riscv64: 0.14.53
-      esbuild-linux-s390x: 0.14.53
-      esbuild-netbsd-64: 0.14.53
-      esbuild-openbsd-64: 0.14.53
-      esbuild-sunos-64: 0.14.53
-      esbuild-windows-32: 0.14.53
-      esbuild-windows-64: 0.14.53
-      esbuild-windows-arm64: 0.14.53
+      '@esbuild/linux-loong64': 0.14.54
+      esbuild-android-64: 0.14.54
+      esbuild-android-arm64: 0.14.54
+      esbuild-darwin-64: 0.14.54
+      esbuild-darwin-arm64: 0.14.54
+      esbuild-freebsd-64: 0.14.54
+      esbuild-freebsd-arm64: 0.14.54
+      esbuild-linux-32: 0.14.54
+      esbuild-linux-64: 0.14.54
+      esbuild-linux-arm: 0.14.54
+      esbuild-linux-arm64: 0.14.54
+      esbuild-linux-mips64le: 0.14.54
+      esbuild-linux-ppc64le: 0.14.54
+      esbuild-linux-riscv64: 0.14.54
+      esbuild-linux-s390x: 0.14.54
+      esbuild-netbsd-64: 0.14.54
+      esbuild-openbsd-64: 0.14.54
+      esbuild-sunos-64: 0.14.54
+      esbuild-windows-32: 0.14.54
+      esbuild-windows-64: 0.14.54
+      esbuild-windows-arm64: 0.14.54
     dev: true
 
   /escalade/3.1.1:
@@ -3860,8 +4643,8 @@ packages:
       through: 2.3.8
     dev: true
 
-  /eventemitter2/6.4.6:
-    resolution: {integrity: sha512-OHqo4wbHX5VbvlbB6o6eDwhYmiTjrpWACjF8Pmof/GTD6rdBNdZFNck3xlhqOiQFGCOoq3uzHvA0cQpFHIGVAQ==}
+  /eventemitter2/6.4.7:
+    resolution: {integrity: sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==}
     dev: true
 
   /execa/4.1.0:
@@ -3935,7 +4718,7 @@ packages:
     dev: true
 
   /extsprintf/1.3.0:
-    resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==}
+    resolution: {integrity: sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=}
     engines: {'0': node >=0.6.0}
     dev: true
 
@@ -4068,7 +4851,7 @@ packages:
     dependencies:
       call-bind: 1.0.2
       define-properties: 1.1.4
-      es-abstract: 1.20.1
+      es-abstract: 1.20.2
       functions-have-names: 1.2.3
     dev: true
 
@@ -4353,8 +5136,8 @@ packages:
       ci-info: 3.3.2
     dev: true
 
-  /is-core-module/2.9.0:
-    resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==}
+  /is-core-module/2.10.0:
+    resolution: {integrity: sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==}
     dependencies:
       has: 1.0.3
     dev: true
@@ -4515,12 +5298,12 @@ packages:
         optional: true
     dependencies:
       abab: 2.0.6
-      acorn: 8.7.1
+      acorn: 8.8.0
       acorn-globals: 6.0.0
       cssom: 0.5.0
       cssstyle: 2.3.0
       data-urls: 3.0.2
-      decimal.js: 10.3.1
+      decimal.js: 10.4.0
       domexception: 4.0.0
       escodegen: 2.0.0
       form-data: 4.0.0
@@ -4528,11 +5311,11 @@ packages:
       http-proxy-agent: 5.0.0
       https-proxy-agent: 5.0.1
       is-potential-custom-element-name: 1.0.1
-      nwsapi: 2.2.1
-      parse5: 7.0.0
+      nwsapi: 2.2.2
+      parse5: 7.1.1
       saxes: 6.0.0
       symbol-tree: 3.2.4
-      tough-cookie: 4.0.0
+      tough-cookie: 4.1.2
       w3c-hr-time: 1.0.2
       w3c-xmlserializer: 3.0.0
       webidl-conversions: 7.0.0
@@ -4599,7 +5382,7 @@ packages:
     dev: true
 
   /lazy-ass/1.6.0:
-    resolution: {integrity: sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==}
+    resolution: {integrity: sha1-eZllXoZGwX8In90YfRUNMyTVRRM=}
     engines: {node: '> 0.8'}
     dev: true
 
@@ -4872,8 +5655,8 @@ packages:
       path-key: 4.0.0
     dev: true
 
-  /nwsapi/2.2.1:
-    resolution: {integrity: sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg==}
+  /nwsapi/2.2.2:
+    resolution: {integrity: sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==}
     dev: true
 
   /object-inspect/1.12.2:
@@ -4885,8 +5668,8 @@ packages:
     engines: {node: '>= 0.4'}
     dev: true
 
-  /object.assign/4.1.2:
-    resolution: {integrity: sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==}
+  /object.assign/4.1.4:
+    resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==}
     engines: {node: '>= 0.4'}
     dependencies:
       call-bind: 1.0.2
@@ -4946,10 +5729,10 @@ packages:
       json-parse-better-errors: 1.0.2
     dev: true
 
-  /parse5/7.0.0:
-    resolution: {integrity: sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==}
+  /parse5/7.1.1:
+    resolution: {integrity: sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==}
     dependencies:
-      entities: 4.3.1
+      entities: 4.4.0
     dev: true
 
   /path-is-absolute/1.0.1:
@@ -5051,7 +5834,7 @@ packages:
       '@vue/devtools-api': 6.2.1
       typescript: 4.7.4
       vue: 3.2.38
-      vue-demi: 0.13.5_vue@3.2.38
+      vue-demi: 0.13.11_vue@3.2.38
     dev: false
 
   /pinia/2.0.21_vue@3.2.38:
@@ -5068,9 +5851,15 @@ packages:
     dependencies:
       '@vue/devtools-api': 6.2.1
       vue: 3.2.38
-      vue-demi: 0.13.5_vue@3.2.38
+      vue-demi: 0.13.11_vue@3.2.38
     dev: false
 
+  /playwright-core/1.25.1:
+    resolution: {integrity: sha512-lSvPCmA2n7LawD2Hw7gSCLScZ+vYRkhU8xH0AapMyzwN+ojoDqhkH/KIEUxwNu2PjPoE/fcE0wLAksdOhJ2O5g==}
+    engines: {node: '>=14'}
+    hasBin: true
+    dev: true
+
   /postcss/8.4.16:
     resolution: {integrity: sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==}
     engines: {node: ^10 || ^12 || >=14}
@@ -5104,7 +5893,7 @@ packages:
     dev: true
 
   /proxy-from-env/1.0.0:
-    resolution: {integrity: sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==}
+    resolution: {integrity: sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=}
     dev: true
 
   /ps-tree/1.2.0:
@@ -5136,6 +5925,10 @@ packages:
     engines: {node: '>=0.6'}
     dev: true
 
+  /querystringify/2.2.0:
+    resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==}
+    dev: true
+
   /queue-microtask/1.2.3:
     resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
     dev: true
@@ -5164,11 +5957,15 @@ packages:
       throttleit: 1.0.0
     dev: true
 
+  /requires-port/1.0.0:
+    resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==}
+    dev: true
+
   /resolve/1.22.1:
     resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==}
     hasBin: true
     dependencies:
-      is-core-module: 2.9.0
+      is-core-module: 2.10.0
       path-parse: 1.0.7
       supports-preserve-symlinks-flag: 1.0.0
     dev: true
@@ -5197,8 +5994,8 @@ packages:
       glob: 7.2.3
     dev: true
 
-  /rollup/2.77.0:
-    resolution: {integrity: sha512-vL8xjY4yOQEw79DvyXLijhnhh+R/O9zpF/LEgkCebZFtb6ELeN9H3/2T0r8+mp+fFTBHZ5qGpOpW2ela2zRt3g==}
+  /rollup/2.77.3:
+    resolution: {integrity: sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g==}
     engines: {node: '>=10.0.0'}
     hasBin: true
     optionalDependencies:
@@ -5344,7 +6141,7 @@ packages:
     resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==}
     dependencies:
       spdx-expression-parse: 3.0.1
-      spdx-license-ids: 3.0.11
+      spdx-license-ids: 3.0.12
     dev: true
 
   /spdx-exceptions/2.3.0:
@@ -5355,11 +6152,11 @@ packages:
     resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==}
     dependencies:
       spdx-exceptions: 2.3.0
-      spdx-license-ids: 3.0.11
+      spdx-license-ids: 3.0.12
     dev: true
 
-  /spdx-license-ids/3.0.11:
-    resolution: {integrity: sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==}
+  /spdx-license-ids/3.0.12:
+    resolution: {integrity: sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==}
     dev: true
 
   /split/0.3.3:
@@ -5435,7 +6232,7 @@ packages:
     dependencies:
       call-bind: 1.0.2
       define-properties: 1.1.4
-      es-abstract: 1.20.1
+      es-abstract: 1.20.2
     dev: true
 
   /string.prototype.trimend/1.0.5:
@@ -5443,7 +6240,7 @@ packages:
     dependencies:
       call-bind: 1.0.2
       define-properties: 1.1.4
-      es-abstract: 1.20.1
+      es-abstract: 1.20.2
     dev: true
 
   /string.prototype.trimstart/1.0.5:
@@ -5451,7 +6248,7 @@ packages:
     dependencies:
       call-bind: 1.0.2
       define-properties: 1.1.4
-      es-abstract: 1.20.1
+      es-abstract: 1.20.2
     dev: true
 
   /strip-ansi/6.0.1:
@@ -5486,7 +6283,7 @@ packages:
   /strip-literal/0.4.0:
     resolution: {integrity: sha512-ql/sBDoJOybTKSIOWrrh8kgUEMjXMwRAkZTD0EwiwxQH/6tTPkZvMIEjp0CRlpi6V5FMiJyvxeRkEi1KrGISoA==}
     dependencies:
-      acorn: 8.7.1
+      acorn: 8.8.0
     dev: true
 
   /supports-color/5.5.0:
@@ -5572,13 +6369,14 @@ packages:
       punycode: 2.1.1
     dev: true
 
-  /tough-cookie/4.0.0:
-    resolution: {integrity: sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==}
+  /tough-cookie/4.1.2:
+    resolution: {integrity: sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==}
     engines: {node: '>=6'}
     dependencies:
       psl: 1.9.0
       punycode: 2.1.1
-      universalify: 0.1.2
+      universalify: 0.2.0
+      url-parse: 1.5.10
     dev: true
 
   /tr46/0.0.3:
@@ -5637,8 +6435,8 @@ packages:
       which-boxed-primitive: 1.0.2
     dev: true
 
-  /universalify/0.1.2:
-    resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==}
+  /universalify/0.2.0:
+    resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==}
     engines: {node: '>= 4.0.0'}
     dev: true
 
@@ -5652,17 +6450,24 @@ packages:
     engines: {node: '>=8'}
     dev: true
 
-  /update-browserslist-db/1.0.4_browserslist@4.21.2:
-    resolution: {integrity: sha512-jnmO2BEGUjsMOe/Fg9u0oczOe/ppIDZPebzccl1yDWGLFP16Pa1/RM5wEoKYPG2zstNcDuAStejyxsOuKINdGA==}
+  /update-browserslist-db/1.0.7_browserslist@4.21.3:
+    resolution: {integrity: sha512-iN/XYesmZ2RmmWAiI4Z5rq0YqSiv0brj9Ce9CfhNE4xIW2h+MFxcgkxIzZ+ShkFPUkjU3gQ+3oypadD3RAMtrg==}
     hasBin: true
     peerDependencies:
       browserslist: '>= 4.21.0'
     dependencies:
-      browserslist: 4.21.2
+      browserslist: 4.21.3
       escalade: 3.1.1
       picocolors: 1.0.0
     dev: true
 
+  /url-parse/1.5.10:
+    resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==}
+    dependencies:
+      querystringify: 2.2.0
+      requires-port: 1.0.0
+    dev: true
+
   /uuid/8.3.2:
     resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
     hasBin: true
@@ -5676,7 +6481,7 @@ packages:
     dev: true
 
   /verror/1.10.0:
-    resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==}
+    resolution: {integrity: sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=}
     engines: {'0': node >=0.6.0}
     dependencies:
       assert-plus: 1.0.0
@@ -5703,16 +6508,16 @@ packages:
       terser:
         optional: true
     dependencies:
-      esbuild: 0.14.53
+      esbuild: 0.14.54
       postcss: 8.4.16
       resolve: 1.22.1
-      rollup: 2.77.0
+      rollup: 2.77.3
     optionalDependencies:
       fsevents: 2.3.2
     dev: true
 
-  /vitest/0.23.0_jsdom@20.0.0:
-    resolution: {integrity: sha512-I3ctlfiXYprA2tID1qP+m6pmgmKx3HYfRe66MetGOHKCHLY7hz74ihiwIEtN7LReJgF3U5cM735iYPkn/Go1iQ==}
+  /vitest/0.23.1_jsdom@20.0.0:
+    resolution: {integrity: sha512-kn9pG+h6VA3yj/xRvwgLKEd33rOlzMqJEg3tl5HSm3WUPlkY1Lr1FK8RN1uIqVKvFxmz6HGU3EQW+xW2kazRkQ==}
     engines: {node: '>=v14.16.0'}
     hasBin: true
     peerDependencies:
@@ -5735,7 +6540,7 @@ packages:
     dependencies:
       '@types/chai': 4.3.3
       '@types/chai-subset': 1.3.3
-      '@types/node': 18.0.6
+      '@types/node': 18.7.14
       chai: 4.3.6
       debug: 4.3.4
       jsdom: 20.0.0
@@ -5753,8 +6558,8 @@ packages:
       - terser
     dev: true
 
-  /vue-demi/0.13.5_vue@3.2.38:
-    resolution: {integrity: sha512-tO3K2bML3AwiHmVHeKCq6HLef2st4zBXIV5aEkoJl6HZ+gJWxWv2O8wLH8qrA3SX3lDoTDHNghLX1xZg83MXvw==}
+  /vue-demi/0.13.11_vue@3.2.38:
+    resolution: {integrity: sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==}
     engines: {node: '>=12'}
     hasBin: true
     requiresBuild: true
@@ -5957,7 +6762,7 @@ packages:
     dependencies:
       '@types/fs-extra': 9.0.13
       '@types/minimist': 1.2.2
-      '@types/node': 16.11.45
+      '@types/node': 16.11.56
       '@types/node-fetch': 2.6.2
       chalk: 4.1.2
       fs-extra: 10.1.0
index 104fddf4d86131f5aea09ab4623f932fb2a30b60..c7757f6d6234b282070dfa61cff50e1699db5fa0 100644 (file)
@@ -3,7 +3,11 @@ import 'zx/globals'
 
 $.verbose = false
 
-const featureFlags = ['typescript', 'jsx', 'router', 'pinia', 'vitest', 'cypress']
+if (!/pnpm/.test(process.env.npm_config_user_agent ?? ''))
+  throw new Error('Please use pnpm (\'pnpm run snapshot\') to generate snapshots!')
+
+const featureFlags = ['typescript', 'jsx', 'router', 'pinia', 'vitest', 'cypress', 'playwright']
+const featureFlagsDenylist = [['cypress', 'playwright']]
 
 // The following code & comments are generated by GitHub CoPilot.
 function fullCombination(arr) {
@@ -34,9 +38,12 @@ function fullCombination(arr) {
   return combinations
 }
 
-const flagCombinations = fullCombination(featureFlags)
+let flagCombinations = fullCombination(featureFlags)
 flagCombinations.push(['default'])
 
+// Filter out combinations that are not allowed
+flagCombinations = flagCombinations.filter(combination => !featureFlagsDenylist.some(denylist => denylist.every(flag => combination.includes(flag))))
+
 // `--with-tests` are equivalent of `--vitest --cypress`
 // Previously it means `--cypress` without `--vitest`.
 // Here we generate the snapshots only for the sake of easier comparison with older templates.
index a8c2eaa7324833a39aa2749130cb4b8566e26c11..6f789b199453a7e337baf069f8a3b50910df3d95 100644 (file)
@@ -1,9 +1,16 @@
 #!/usr/bin/env zx
 import 'zx/globals'
 
+// Vitest would otherwise enable watch mode by default.
+process.env.CI = '1';
+
 const playgroundDir = path.resolve(__dirname, '../playground/')
+let projects = fs.readdirSync(playgroundDir).filter(name => !name.startsWith('.'));
+
+if (process.argv[3])
+  projects = projects.filter(project => project.includes(process.argv[3]))
 
-for (const projectName of fs.readdirSync(playgroundDir)) {
+for (const projectName of projects) {
   if (projectName.includes('vitest')) {
     cd(path.resolve(playgroundDir, projectName))
 
@@ -11,38 +18,34 @@ for (const projectName of fs.readdirSync(playgroundDir)) {
     await $`pnpm test:unit`
   }
 
-  if (projectName.includes('cypress')) {
-    cd(path.resolve(playgroundDir, projectName))
+  cd(path.resolve(playgroundDir, projectName))
+
+  const packageJSON = require(path.resolve(playgroundDir, projectName, 'package.json'));
 
-    console.log(`Building ${projectName}`)
-    await $`pnpm build`
+  console.log(`Building ${projectName}`)
+  await $`pnpm build`
 
+  if ('cypress' in packageJSON.devDependencies) {
     console.log(`Running e2e tests in ${projectName}`)
     await $`pnpm test:e2e:ci`
+  }
+  if ('@playwright/test' in packageJSON.devDependencies) {
+    await $`pnpm playwright install --with-deps`
+    await $`pnpm test:e2e`
+  }
 
+  if ('test:unit:ci' in packageJSON.scripts) {
     // Without Vitest, the project will use Cypress Component Testing for unit testing
-    if (!projectName.includes('vitest')) {
-      // Cypress Component Testing is flaky in CI environment, so we need to tolerate the errors.
-      try {
-        await `pnpm test:unit:ci`
-      } catch (e) {
-        console.error(`Component Testing in ${projectName} fails:`)
-        console.error(e)
-      }
+    // Cypress Component Testing is flaky in CI environment, so we need to tolerate the errors.
+    try {
+      await $`pnpm test:unit:ci`
+    } catch (e) {
+      console.error(`Component Testing in ${projectName} fails:`)
+      console.error(e)
+      process.exit(1)
     }
-  }
-
-  // equivalent of `--vitest --cypress`
-  if (projectName.endsWith('with-tests')) {
-    cd(path.resolve(playgroundDir, projectName))
-
+  } else if ('test:unit' in packageJSON.scripts) {
     console.log(`Running unit tests in ${projectName}`)
     await $`pnpm test:unit`
-
-    console.log(`Building ${projectName}`)
-    await $`pnpm build`
-
-    console.log(`Running e2e tests in ${projectName}`)
-    await $`pnpm test:e2e:ci`
   }
 }
diff --git a/template/config/playwright/_gitignore b/template/config/playwright/_gitignore
new file mode 100644 (file)
index 0000000..aaa9103
--- /dev/null
@@ -0,0 +1,2 @@
+test-results/
+playwright-report/
diff --git a/template/config/playwright/e2e/vue.spec.js b/template/config/playwright/e2e/vue.spec.js
new file mode 100644 (file)
index 0000000..3d62e3e
--- /dev/null
@@ -0,0 +1,8 @@
+const { test, expect } = require('@playwright/test');
+
+// See here how to get started:
+// https://playwright.dev/docs/intro
+test('visits the app root url', async ({ page }) => {
+  await page.goto('/');
+  await expect(page.locator('div.greetings > h1')).toHaveText('You did it!');
+})
diff --git a/template/config/playwright/e2e/vue.spec.ts b/template/config/playwright/e2e/vue.spec.ts
new file mode 100644 (file)
index 0000000..3e5a3d0
--- /dev/null
@@ -0,0 +1,8 @@
+import { test, expect } from '@playwright/test';
+
+// See here how to get started:
+// https://playwright.dev/docs/intro
+test('visits the app root url', async ({ page }) => {
+  await page.goto('/');
+  await expect(page.locator('div.greetings > h1')).toHaveText('You did it!');
+})
diff --git a/template/config/playwright/package.json b/template/config/playwright/package.json
new file mode 100644 (file)
index 0000000..243c712
--- /dev/null
@@ -0,0 +1,8 @@
+{
+  "scripts": {
+    "test:e2e": "playwright test"
+  },
+  "devDependencies": {
+    "@playwright/test": "^1.25.1"
+  }
+}
diff --git a/template/config/playwright/playwright.config.js b/template/config/playwright/playwright.config.js
new file mode 100644 (file)
index 0000000..0fadfcd
--- /dev/null
@@ -0,0 +1,108 @@
+// @ts-check
+const { devices } = require('@playwright/test')
+
+/**
+ * Read environment variables from file.
+ * https://github.com/motdotla/dotenv
+ */
+// require('dotenv').config();
+
+/**
+ * @see https://playwright.dev/docs/test-configuration
+ * @type {import('@playwright/test').PlaywrightTestConfig}
+ */
+const config = {
+  testDir: './e2e',
+  /* Maximum time one test can run for. */
+  timeout: 30 * 1000,
+  expect: {
+    /**
+     * Maximum time expect() should wait for the condition to be met.
+     * For example in `await expect(locator).toHaveText();`
+     */
+    timeout: 5000
+  },
+  /* 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: {
+    /* Maximum time each action such as `click()` can take. Defaults to 0 (no limit). */
+    actionTimeout: 0,
+    /* Base URL to use in actions like `await page.goto('/')`. */
+    baseURL: 'http://localhost:5173',
+
+    /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
+    trace: 'on-first-retry',
+
+    /* Only on CI systems run the tests headless */
+    headless: !!process.env.CI
+  },
+
+  /* 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: {
+    //     channel: 'msedge',
+    //   },
+    // },
+    // {
+    //   name: 'Google Chrome',
+    //   use: {
+    //     channel: 'chrome',
+    //   },
+    // },
+  ],
+
+  /* Folder for test artifacts such as screenshots, videos, traces, etc. */
+  // outputDir: 'test-results/',
+
+  /* Run your local dev server before starting the tests */
+  webServer: {
+    command: 'npm run dev',
+    port: 5173,
+    reuseExistingServer: !process.env.CI
+  }
+}
+
+module.exports = config
diff --git a/template/config/playwright/playwright.config.ts b/template/config/playwright/playwright.config.ts
new file mode 100644 (file)
index 0000000..5bb8d79
--- /dev/null
@@ -0,0 +1,107 @@
+import type { PlaywrightTestConfig } from '@playwright/test'
+import { devices } from '@playwright/test'
+
+/**
+ * Read environment variables from file.
+ * https://github.com/motdotla/dotenv
+ */
+// require('dotenv').config();
+
+/**
+ * See https://playwright.dev/docs/test-configuration.
+ */
+const config: PlaywrightTestConfig = {
+  testDir: './e2e',
+  /* Maximum time one test can run for. */
+  timeout: 30 * 1000,
+  expect: {
+    /**
+     * Maximum time expect() should wait for the condition to be met.
+     * For example in `await expect(locator).toHaveText();`
+     */
+    timeout: 5000
+  },
+  /* 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: {
+    /* Maximum time each action such as `click()` can take. Defaults to 0 (no limit). */
+    actionTimeout: 0,
+    /* Base URL to use in actions like `await page.goto('/')`. */
+    baseURL: 'http://localhost:5173',
+
+    /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
+    trace: 'on-first-retry',
+
+    /* Only on CI systems run the tests headless */
+    headless: !!process.env.CI
+  },
+
+  /* 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: {
+    //     channel: 'msedge',
+    //   },
+    // },
+    // {
+    //   name: 'Google Chrome',
+    //   use: {
+    //     channel: 'chrome',
+    //   },
+    // },
+  ],
+
+  /* Folder for test artifacts such as screenshots, videos, traces, etc. */
+  // outputDir: 'test-results/',
+
+  /* Run your local dev server before starting the tests */
+  webServer: {
+    command: 'npm run dev',
+    port: 5173,
+    reuseExistingServer: !process.env.CI
+  }
+}
+
+export default config
index 321e6af5ff2c171a28503e9bd3dd78c6b80dc8f6..6b899122aabf923cf525804b5cd3b7ffc284c23f 100644 (file)
@@ -1,6 +1,6 @@
 {
   "scripts": {
-    "test:unit": "vitest --environment jsdom"
+    "test:unit": "vitest --environment jsdom --root src/"
   },
   "dependencies": {
     "vue": "^3.2.38"
index 569bf0ea1770871246d209af26438532e4f090f9..bdbc0a5a7f84fe38c0512981d697c424822518a7 100644 (file)
@@ -21,6 +21,7 @@ export default function generateReadme({
   needsTypeScript,
   needsCypress,
   needsCypressCT,
+  needsPlaywright,
   needsVitest,
   needsEslint
 }) {
@@ -94,6 +95,26 @@ ${getCommand(packageManager, 'test:e2e')} # or \`${getCommand(
 `
   }
 
+  if (needsPlaywright) {
+    npmScriptsDescriptions += `
+### Run End-to-End Tests with [Playwright](https://playwright.dev)
+
+\`\`\`sh
+# Install browsers for the first run
+npx playwright install
+
+# Runs the end-to-end tests.
+${getCommand(packageManager, 'test:e2e')}
+# Runs the tests only on Desktop Chrome.
+${getCommand(packageManager, 'test:e2e -- --project="Desktop Chrome"')}
+# Runs the tests of a specific file.
+${getCommand(packageManager, 'test:e2e -- tests/example.spec.ts')}
+# Runs the tests in debug mode.
+${getCommand(packageManager, 'test:e2e -- --debug')}
+\`\`\`
+`
+  }
+
   if (needsEslint) {
     npmScriptsDescriptions += `
 ### Lint with [ESLint](https://eslint.org/)
index 23535ff9a63fc6192b02c25cf4f8bfd072b11685..529b1f174e78c1e881500e71b55881ad8b36aa20 100644 (file)
@@ -46,6 +46,14 @@ function renderTemplate(src, dest) {
     dest = path.resolve(path.dirname(dest), filename.replace(/^_/, '.'))
   }
 
+  if (filename === '_gitignore' && fs.existsSync(dest)) {
+    // append to existing .gitignore
+    const existing = fs.readFileSync(dest, 'utf8')
+    const newGitignore = fs.readFileSync(src, 'utf8')
+    fs.writeFileSync(dest, existing + '\n' + newGitignore)
+    return
+  }
+
   fs.copyFileSync(src, dest)
 }