From bd9c189793d73816835d723fc8676ee9b3bc781a Mon Sep 17 00:00:00 2001 From: rockyroed Date: Mon, 6 Oct 2025 17:15:50 +0800 Subject: [PATCH 01/23] chore: install test-utils --- package.json | 8 +- pnpm-lock.yaml | 407 +++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 404 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index a2ddc3f..467af35 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,6 @@ "@clerk/nuxt": "^1.9.3", "@nuxt/eslint": "1.9.0", "@nuxt/image": "1.11.0", - "@nuxt/test-utils": "3.19.2", "@nuxt/ui": "4.0.0", "@pinia/nuxt": "0.11.2", "@tailwindcss/vite": "^4.1.14", @@ -33,9 +32,14 @@ "devDependencies": { "@commitlint/cli": "^20.1.0", "@commitlint/config-conventional": "^20.0.0", + "@nuxt/test-utils": "3.19.2", + "@vue/test-utils": "^2.4.6", + "happy-dom": "^19.0.2", "husky": "^9.1.7", "lint-staged": "^16.2.3", - "prettier": "3.6.2" + "playwright-core": "^1.55.1", + "prettier": "3.6.2", + "vitest": "^3.2.4" }, "lint-staged": { "*.{js,ts,vue}": [ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1f5c841..ffb3c17 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,9 +17,6 @@ importers: '@nuxt/image': specifier: 1.11.0 version: 1.11.0(db0@0.3.4)(ioredis@5.8.0)(magicast@0.3.5) - '@nuxt/test-utils': - specifier: 3.19.2 - version: 3.19.2(magicast@0.3.5)(typescript@5.9.3) '@nuxt/ui': specifier: 4.0.0 version: 4.0.0(@babel/parser@7.28.4)(change-case@5.4.4)(db0@0.3.4)(embla-carousel@8.6.0)(ioredis@5.8.0)(magicast@0.3.5)(react@19.1.1)(typescript@5.9.3)(vite@7.1.9(@types/node@24.6.2)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1))(vue-router@4.5.1(vue@3.5.22(typescript@5.9.3)))(vue@3.5.22(typescript@5.9.3))(zod@4.1.11) @@ -57,15 +54,30 @@ importers: '@commitlint/config-conventional': specifier: ^20.0.0 version: 20.0.0 + '@nuxt/test-utils': + specifier: 3.19.2 + version: 3.19.2(@vue/test-utils@2.4.6)(happy-dom@19.0.2)(magicast@0.3.5)(playwright-core@1.55.1)(typescript@5.9.3)(vitest@3.2.4(@types/node@24.6.2)(happy-dom@19.0.2)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + '@vue/test-utils': + specifier: ^2.4.6 + version: 2.4.6 + happy-dom: + specifier: ^19.0.2 + version: 19.0.2 husky: specifier: ^9.1.7 version: 9.1.7 lint-staged: specifier: ^16.2.3 version: 16.2.3 + playwright-core: + specifier: ^1.55.1 + version: 1.55.1 prettier: specifier: 3.6.2 version: 3.6.2 + vitest: + specifier: ^3.2.4 + version: 3.2.4(@types/node@24.6.2)(happy-dom@19.0.2)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) packages: @@ -855,6 +867,9 @@ packages: '@nuxtjs/color-mode@3.5.2': resolution: {integrity: sha512-cC6RfgZh3guHBMLLjrBB2Uti5eUoGM9KyauOaYS9ETmxNWBMTvpgjvSiSJp1OFljIXPIqVTJ3xtJpSNZiO3ZaA==} + '@one-ini/wasm@0.1.1': + resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} + '@opentelemetry/api@1.9.0': resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} engines: {node: '>=8.0.0'} @@ -1570,15 +1585,24 @@ packages: '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@types/chai@5.2.2': + resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} + '@types/conventional-commits-parser@5.0.1': resolution: {integrity: sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==} + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/node@20.19.19': + resolution: {integrity: sha512-pb1Uqj5WJP7wrcbLU7Ru4QtA0+3kAXrkutGiD26wUKzSMgNNaPARTUDQmElUXp64kh3cWdou3Q0C7qwwxqSFmg==} + '@types/node@24.6.2': resolution: {integrity: sha512-d2L25Y4j+W3ZlNAeMKcy7yDsK425ibcAOO2t7aPTz6gNMH0z2GThtwENCDc0d/Pw9wgyRqE5Px1wkV7naz8ang==} @@ -1595,6 +1619,9 @@ packages: '@types/web-bluetooth@0.0.21': resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} + '@types/whatwg-mimetype@3.0.2': + resolution: {integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==} + '@typescript-eslint/eslint-plugin@8.45.0': resolution: {integrity: sha512-HC3y9CVuevvWCl/oyZuI47dOeDF9ztdMEfMH8/DW/Mhwa9cCLnK1oD7JoTVGW/u7kFzNZUKUoyJEqkaJh5y3Wg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1777,6 +1804,35 @@ packages: vite: ^5.0.0 || ^6.0.0 || ^7.0.0 vue: ^3.2.25 + '@vitest/expect@3.2.4': + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + + '@vitest/mocker@3.2.4': + resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@3.2.4': + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + + '@vitest/runner@3.2.4': + resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} + + '@vitest/snapshot@3.2.4': + resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} + + '@vitest/spy@3.2.4': + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + + '@vitest/utils@3.2.4': + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + '@volar/language-core@2.4.23': resolution: {integrity: sha512-hEEd5ET/oSmBC6pi1j6NaNYRWoAiDhINbT8rmwtINugR39loROSlufGdYMF9TaKGfz+ViGs1Idi3mAhnuPcoGQ==} @@ -1862,6 +1918,9 @@ packages: '@vue/shared@3.5.22': resolution: {integrity: sha512-F4yc6palwq3TT0u+FYf0Ns4Tfl9GRFURDN2gWG7L1ecIaS/4fCIuFOjMTnCyjsu/OK6vaDKLCrGAa+KvvH+h4w==} + '@vue/test-utils@2.4.6': + resolution: {integrity: sha512-FMxEjOpYNYiFe0GkaHsnJPXFHxQ6m4t8vI/ElPGpMWxZKpmRvQ33OIrvRXemy6yha03RxhOlQuy+gZMC3CQSow==} + '@vueuse/core@10.11.1': resolution: {integrity: sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==} @@ -1939,6 +1998,10 @@ packages: resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} hasBin: true + abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + abbrev@3.0.1: resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} engines: {node: ^18.17.0 || >=20.5.0} @@ -2031,6 +2094,10 @@ packages: array-ify@1.0.0: resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + ast-kit@2.1.2: resolution: {integrity: sha512-cl76xfBQM6pztbrFWRnxbrDm9EOqDr1BF6+qQnnDZG2Co2LjyUktkN9GTJfBAfdae+DbT2nJf2nCGAdDDN7W2g==} engines: {node: '>=20.18.0'} @@ -2189,6 +2256,10 @@ packages: caniuse-lite@1.0.30001748: resolution: {integrity: sha512-5P5UgAr0+aBmNiplks08JLw+AW/XG/SurlgZLgB1dDLfAw7EfRGxIwzPHxdSCGY/BTKDqIVyJL87cCN6s0ZR0w==} + chai@5.3.3: + resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} + engines: {node: '>=18'} + chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -2200,6 +2271,10 @@ packages: change-case@5.4.4: resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -2273,6 +2348,10 @@ packages: colortranslator@5.0.0: resolution: {integrity: sha512-Z3UPUKasUVDFCDYAjP2fmlVRf1jFHJv1izAmPjiOa0OCIw1W7iC8PZ2GsoDa8uZv+mKyWopxxStT9q05+27h7w==} + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + commander@11.1.0: resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} engines: {node: '>=16'} @@ -2314,6 +2393,9 @@ packages: confbox@0.2.2: resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + consola@3.4.2: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} @@ -2492,6 +2574,10 @@ packages: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} @@ -2591,6 +2677,11 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + editorconfig@1.0.4: + resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} + engines: {node: '>=14'} + hasBin: true + ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} @@ -2875,6 +2966,10 @@ packages: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} + expect-type@1.2.2: + resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} + engines: {node: '>=12.0.0'} + exsolve@1.0.7: resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} @@ -3083,6 +3178,10 @@ packages: h3@1.15.4: resolution: {integrity: sha512-z5cFQWDffyOe4vQ9xIqNfCZdV4p//vy6fBnr8Q1AWnVZ0teurKMG66rLj++TKwKPUP3u7iMUvrvKaEUiQw2QWQ==} + happy-dom@19.0.2: + resolution: {integrity: sha512-831CLbgDyjRbd2lApHZFsBDe56onuFcjsCBPodzWpzedTpeDr8CGZjs7iEIdNW1DVwSFRecfwzLpVyGBPamwGA==} + engines: {node: '>=20.0.0'} + has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -3293,6 +3392,11 @@ packages: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true + js-beautify@1.15.4: + resolution: {integrity: sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==} + engines: {node: '>=14'} + hasBin: true + js-cookie@3.0.5: resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} engines: {node: '>=14'} @@ -3530,6 +3634,9 @@ packages: resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} engines: {node: '>=18'} + loupe@3.2.1: + resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -3614,6 +3721,10 @@ packages: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} + minimatch@9.0.1: + resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} + engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} @@ -3737,6 +3848,11 @@ packages: node-releases@2.0.23: resolution: {integrity: sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==} + nopt@7.2.1: + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + nopt@8.1.0: resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==} engines: {node: ^18.17.0 || >=20.5.0} @@ -3919,6 +4035,10 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + pathval@2.0.1: + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} + engines: {node: '>= 14.16'} + perfect-debounce@1.0.0: resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} @@ -3956,6 +4076,11 @@ packages: pkg-types@2.3.0: resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} + playwright-core@1.55.1: + resolution: {integrity: sha512-Z6Mh9mkwX+zxSlHqdr5AOcJnfp+xUWLCt9uKV18fhzA8eyxUd8NUWzAjxUh55RZKSYwDGX0cfaySdhZJGMoJ+w==} + engines: {node: '>=18'} + hasBin: true + pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} @@ -4166,6 +4291,9 @@ packages: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + protocols@2.0.2: resolution: {integrity: sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==} @@ -4375,6 +4503,9 @@ packages: resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} engines: {node: '>= 0.4'} + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} @@ -4445,6 +4576,9 @@ packages: resolution: {integrity: sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==} engines: {node: '>=12.0.0'} + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + standard-as-callback@2.1.0: resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} @@ -4625,6 +4759,12 @@ packages: tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyexec@1.0.1: resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} @@ -4632,6 +4772,18 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} + + tinyspy@4.0.4: + resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} + engines: {node: '>=14.0.0'} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -4687,6 +4839,9 @@ packages: unctx@2.4.1: resolution: {integrity: sha512-AbaYw0Nm4mK4qjhns67C+kgxR2YWiwlDBPzxrN8h8C6VtAdCgditAY5Dezu3IJy4XVqAnbrXt9oQJvsn3fyozg==} + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici-types@7.13.0: resolution: {integrity: sha512-Ov2Rr9Sx+fRgagJ5AX0qvItZG/JKKoBRAVITs1zk7IqZGTJUwgUr7qoYBpWwakpWilTZFM98rG/AFRocu10iIQ==} @@ -4973,12 +5128,43 @@ packages: vitest-environment-nuxt@1.0.1: resolution: {integrity: sha512-eBCwtIQriXW5/M49FjqNKfnlJYlG2LWMSNFsRVKomc8CaMqmhQPBS5LZ9DlgYL9T8xIVsiA6RZn2lk7vxov3Ow==} + vitest@3.2.4: + resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.2.4 + '@vitest/ui': 3.2.4 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/debug': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + vscode-uri@3.1.0: resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} vue-bundle-renderer@2.2.0: resolution: {integrity: sha512-sz/0WEdYH1KfaOm0XaBmRZOWgYTEvUDt6yPYaUzl4E52qzgWLlknaPPTTZmp6benaPTlQAI/hN1x3tAzZygycg==} + vue-component-type-helpers@2.2.12: + resolution: {integrity: sha512-YbGqHZ5/eW4SnkPNR44mKVc6ZKQoRs/Rux1sxC6rdwXb4qpbOSYfDr9DsTHolOTGmIKgM9j141mZbBeg05R1pw==} + vue-component-type-helpers@3.1.0: resolution: {integrity: sha512-cC1pYNRZkSS1iCvdlaMbbg2sjDwxX098FucEjtz9Yig73zYjWzQsnMe5M9H8dRNv55hAIDGUI29hF2BEUA4FMQ==} @@ -5021,6 +5207,10 @@ packages: webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + whatwg-mimetype@3.0.0: + resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} + engines: {node: '>=12'} + whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} @@ -5038,6 +5228,11 @@ packages: engines: {node: ^18.17.0 || >=20.5.0} hasBin: true + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -6227,7 +6422,7 @@ snapshots: transitivePeerDependencies: - magicast - '@nuxt/test-utils@3.19.2(magicast@0.3.5)(typescript@5.9.3)': + '@nuxt/test-utils@3.19.2(@vue/test-utils@2.4.6)(happy-dom@19.0.2)(magicast@0.3.5)(playwright-core@1.55.1)(typescript@5.9.3)(vitest@3.2.4(@types/node@24.6.2)(happy-dom@19.0.2)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1))': dependencies: '@nuxt/kit': 3.19.2(magicast@0.3.5) c12: 3.3.0(magicast@0.3.5) @@ -6251,8 +6446,13 @@ snapshots: tinyexec: 1.0.1 ufo: 1.6.1 unplugin: 2.3.10 - vitest-environment-nuxt: 1.0.1(magicast@0.3.5)(typescript@5.9.3) + vitest-environment-nuxt: 1.0.1(@vue/test-utils@2.4.6)(happy-dom@19.0.2)(magicast@0.3.5)(playwright-core@1.55.1)(typescript@5.9.3)(vitest@3.2.4(@types/node@24.6.2)(happy-dom@19.0.2)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) vue: 3.5.22(typescript@5.9.3) + optionalDependencies: + '@vue/test-utils': 2.4.6 + happy-dom: 19.0.2 + playwright-core: 1.55.1 + vitest: 3.2.4(@types/node@24.6.2)(happy-dom@19.0.2)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) transitivePeerDependencies: - magicast - typescript @@ -6416,6 +6616,8 @@ snapshots: transitivePeerDependencies: - magicast + '@one-ini/wasm@0.1.1': {} + '@opentelemetry/api@1.9.0': {} '@oxc-minify/binding-android-arm64@0.87.0': @@ -6908,14 +7110,24 @@ snapshots: tslib: 2.8.1 optional: true + '@types/chai@5.2.2': + dependencies: + '@types/deep-eql': 4.0.2 + '@types/conventional-commits-parser@5.0.1': dependencies: '@types/node': 24.6.2 + '@types/deep-eql@4.0.2': {} + '@types/estree@1.0.8': {} '@types/json-schema@7.0.15': {} + '@types/node@20.19.19': + dependencies: + undici-types: 6.21.0 + '@types/node@24.6.2': dependencies: undici-types: 7.13.0 @@ -6930,6 +7142,8 @@ snapshots: '@types/web-bluetooth@0.0.21': {} + '@types/whatwg-mimetype@3.0.2': {} + '@typescript-eslint/eslint-plugin@8.45.0(@typescript-eslint/parser@8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.1 @@ -7127,6 +7341,48 @@ snapshots: vite: 7.1.9(@types/node@24.6.2)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) vue: 3.5.22(typescript@5.9.3) + '@vitest/expect@3.2.4': + dependencies: + '@types/chai': 5.2.2 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.3.3 + tinyrainbow: 2.0.0 + + '@vitest/mocker@3.2.4(vite@7.1.9(@types/node@24.6.2)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1))': + dependencies: + '@vitest/spy': 3.2.4 + estree-walker: 3.0.3 + magic-string: 0.30.19 + optionalDependencies: + vite: 7.1.9(@types/node@24.6.2)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + + '@vitest/pretty-format@3.2.4': + dependencies: + tinyrainbow: 2.0.0 + + '@vitest/runner@3.2.4': + dependencies: + '@vitest/utils': 3.2.4 + pathe: 2.0.3 + strip-literal: 3.1.0 + + '@vitest/snapshot@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 + magic-string: 0.30.19 + pathe: 2.0.3 + + '@vitest/spy@3.2.4': + dependencies: + tinyspy: 4.0.4 + + '@vitest/utils@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 + loupe: 3.2.1 + tinyrainbow: 2.0.0 + '@volar/language-core@2.4.23': dependencies: '@volar/source-map': 2.4.23 @@ -7270,6 +7526,11 @@ snapshots: '@vue/shared@3.5.22': {} + '@vue/test-utils@2.4.6': + dependencies: + js-beautify: 1.15.4 + vue-component-type-helpers: 2.2.12 + '@vueuse/core@10.11.1(vue@3.5.22(typescript@5.9.3))': dependencies: '@types/web-bluetooth': 0.0.20 @@ -7333,6 +7594,8 @@ snapshots: jsonparse: 1.3.1 through: 2.3.8 + abbrev@2.0.0: {} + abbrev@3.0.1: {} abort-controller@3.0.0: @@ -7428,6 +7691,8 @@ snapshots: array-ify@1.0.0: {} + assertion-error@2.0.1: {} + ast-kit@2.1.2: dependencies: '@babel/parser': 7.28.4 @@ -7595,6 +7860,14 @@ snapshots: caniuse-lite@1.0.30001748: {} + chai@5.3.3: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.2.1 + pathval: 2.0.1 + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 @@ -7604,6 +7877,8 @@ snapshots: change-case@5.4.4: {} + check-error@2.1.1: {} + chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -7684,6 +7959,8 @@ snapshots: colortranslator@5.0.0: {} + commander@10.0.1: {} + commander@11.1.0: {} commander@14.0.1: {} @@ -7718,6 +7995,11 @@ snapshots: confbox@0.2.2: {} + config-chain@1.1.13: + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + consola@3.4.2: {} conventional-changelog-angular@7.0.0: @@ -7892,6 +8174,8 @@ snapshots: mimic-response: 3.1.0 optional: true + deep-eql@5.0.2: {} + deep-extend@0.6.0: optional: true @@ -7964,6 +8248,13 @@ snapshots: eastasianwidth@0.2.0: {} + editorconfig@1.0.4: + dependencies: + '@one-ini/wasm': 0.1.1 + commander: 10.0.1 + minimatch: 9.0.1 + semver: 7.7.2 + ee-first@1.1.1: {} electron-to-chromium@1.5.230: {} @@ -8301,6 +8592,8 @@ snapshots: expand-template@2.0.3: optional: true + expect-type@1.2.2: {} + exsolve@1.0.7: {} fake-indexeddb@6.2.2: {} @@ -8516,6 +8809,12 @@ snapshots: ufo: 1.6.1 uncrypto: 0.1.3 + happy-dom@19.0.2: + dependencies: + '@types/node': 20.19.19 + '@types/whatwg-mimetype': 3.0.2 + whatwg-mimetype: 3.0.0 + has-flag@4.0.0: {} hasown@2.0.2: @@ -8578,8 +8877,7 @@ snapshots: inherits@2.0.4: {} - ini@1.3.8: - optional: true + ini@1.3.8: {} ini@4.1.1: {} @@ -8735,6 +9033,14 @@ snapshots: jiti@2.6.1: {} + js-beautify@1.15.4: + dependencies: + config-chain: 1.1.13 + editorconfig: 1.0.4 + glob: 10.4.5 + js-cookie: 3.0.5 + nopt: 7.2.1 + js-cookie@3.0.5: {} js-tokens@4.0.0: {} @@ -8941,6 +9247,8 @@ snapshots: strip-ansi: 7.1.2 wrap-ansi: 9.0.2 + loupe@3.2.1: {} + lru-cache@10.4.3: {} lru-cache@5.1.1: @@ -9018,6 +9326,10 @@ snapshots: dependencies: brace-expansion: 2.0.2 + minimatch@9.0.1: + dependencies: + brace-expansion: 2.0.2 + minimatch@9.0.5: dependencies: brace-expansion: 2.0.2 @@ -9208,6 +9520,10 @@ snapshots: node-releases@2.0.23: {} + nopt@7.2.1: + dependencies: + abbrev: 2.0.0 + nopt@8.1.0: dependencies: abbrev: 3.0.1 @@ -9544,6 +9860,8 @@ snapshots: pathe@2.0.3: {} + pathval@2.0.1: {} + perfect-debounce@1.0.0: {} perfect-debounce@2.0.0: {} @@ -9575,6 +9893,8 @@ snapshots: exsolve: 1.0.7 pathe: 2.0.3 + playwright-core@1.55.1: {} + pluralize@8.0.0: {} postcss-calc@10.1.1(postcss@8.5.6): @@ -9775,6 +10095,8 @@ snapshots: kleur: 3.0.3 sisteransi: 1.0.5 + proto-list@1.2.4: {} + protocols@2.0.2: {} pump@3.0.3: @@ -10031,6 +10353,8 @@ snapshots: shell-quote@1.8.3: {} + siginfo@2.0.0: {} + signal-exit@4.1.0: {} simple-concat@1.0.1: @@ -10099,6 +10423,8 @@ snapshots: stable-hash-x@0.2.0: {} + stackback@0.0.2: {} + standard-as-callback@2.1.0: {} standardwebhooks@1.0.0: @@ -10305,6 +10631,10 @@ snapshots: tiny-invariant@1.3.3: {} + tinybench@2.9.0: {} + + tinyexec@0.3.2: {} + tinyexec@1.0.1: {} tinyglobby@0.2.15: @@ -10312,6 +10642,12 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 + tinypool@1.1.1: {} + + tinyrainbow@2.0.0: {} + + tinyspy@4.0.4: {} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -10356,6 +10692,8 @@ snapshots: magic-string: 0.30.19 unplugin: 2.3.10 + undici-types@6.21.0: {} + undici-types@7.13.0: {} unenv@2.0.0-rc.21: @@ -10655,9 +10993,9 @@ snapshots: terser: 5.44.0 yaml: 2.8.1 - vitest-environment-nuxt@1.0.1(magicast@0.3.5)(typescript@5.9.3): + vitest-environment-nuxt@1.0.1(@vue/test-utils@2.4.6)(happy-dom@19.0.2)(magicast@0.3.5)(playwright-core@1.55.1)(typescript@5.9.3)(vitest@3.2.4(@types/node@24.6.2)(happy-dom@19.0.2)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)): dependencies: - '@nuxt/test-utils': 3.19.2(magicast@0.3.5)(typescript@5.9.3) + '@nuxt/test-utils': 3.19.2(@vue/test-utils@2.4.6)(happy-dom@19.0.2)(magicast@0.3.5)(playwright-core@1.55.1)(typescript@5.9.3)(vitest@3.2.4(@types/node@24.6.2)(happy-dom@19.0.2)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) transitivePeerDependencies: - '@cucumber/cucumber' - '@jest/globals' @@ -10672,12 +11010,56 @@ snapshots: - typescript - vitest + vitest@3.2.4(@types/node@24.6.2)(happy-dom@19.0.2)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1): + dependencies: + '@types/chai': 5.2.2 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(vite@7.1.9(@types/node@24.6.2)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + '@vitest/pretty-format': 3.2.4 + '@vitest/runner': 3.2.4 + '@vitest/snapshot': 3.2.4 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.3.3 + debug: 4.4.3 + expect-type: 1.2.2 + magic-string: 0.30.19 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.9.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.15 + tinypool: 1.1.1 + tinyrainbow: 2.0.0 + vite: 7.1.9(@types/node@24.6.2)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@24.6.2)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 24.6.2 + happy-dom: 19.0.2 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + vscode-uri@3.1.0: {} vue-bundle-renderer@2.2.0: dependencies: ufo: 1.6.1 + vue-component-type-helpers@2.2.12: {} + vue-component-type-helpers@3.1.0: {} vue-demi@0.14.10(vue@3.5.22(typescript@5.9.3)): @@ -10717,6 +11099,8 @@ snapshots: webpack-virtual-modules@0.6.2: {} + whatwg-mimetype@3.0.0: {} + whatwg-url@5.0.0: dependencies: tr46: 0.0.3 @@ -10732,6 +11116,11 @@ snapshots: dependencies: isexe: 3.1.1 + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + word-wrap@1.2.5: {} wrap-ansi@7.0.0: From 4bbf30e87db613b3f4f8d2621f5a425f8a5d93c2 Mon Sep 17 00:00:00 2001 From: rockyroed Date: Mon, 6 Oct 2025 17:17:17 +0800 Subject: [PATCH 02/23] test: create vitest.config.ts --- vitest.config.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 vitest.config.ts diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 0000000..53399a0 --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,12 @@ +import { defineVitestConfig } from '@nuxt/test-utils/config'; + +export default defineVitestConfig({ + test: { + environment: 'nuxt', + env: { + NODE_ENV: 'test', + NUXT_PUBLIC_CLERK_PUBLISHABLE_KEY: 'pk_test_mock_key_for_testing', + NUXT_CLERK_SECRET_KEY: 'sk_test_mock_key_for_testing', + }, + }, +}); From f617ed422147b7d3ad0ab115681e8a26875ebf2e Mon Sep 17 00:00:00 2001 From: rockyroed Date: Mon, 6 Oct 2025 17:18:33 +0800 Subject: [PATCH 03/23] test: ignore clerk when testing --- nuxt.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nuxt.config.ts b/nuxt.config.ts index d0de77a..f93722b 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -11,7 +11,7 @@ export default defineNuxtConfig({ '@nuxt/image', '@nuxt/eslint', '@pinia/nuxt', - '@clerk/nuxt', + ...(process.env.NODE_ENV !== 'test' ? ['@clerk/nuxt'] : []), ], css: ['~/assets/css/main.css'], From 7f3d9fabba2e2563d4fbc72a904b16222508826a Mon Sep 17 00:00:00 2001 From: rockyroed Date: Mon, 6 Oct 2025 17:27:53 +0800 Subject: [PATCH 04/23] fix: fake env variables in testing --- vitest.config.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vitest.config.ts b/vitest.config.ts index 53399a0..5845597 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -5,8 +5,8 @@ export default defineVitestConfig({ environment: 'nuxt', env: { NODE_ENV: 'test', - NUXT_PUBLIC_CLERK_PUBLISHABLE_KEY: 'pk_test_mock_key_for_testing', - NUXT_CLERK_SECRET_KEY: 'sk_test_mock_key_for_testing', + NUXT_PUBLIC_CLERK_PUBLISHABLE_KEY: 'pk_test_fake_key', + NUXT_CLERK_SECRET_KEY: 'sk_test_fake_key', }, }, }); From d63780afb77c79ee1cbeaed85bafae827a3de76d Mon Sep 17 00:00:00 2001 From: rockyroed Date: Mon, 6 Oct 2025 17:49:08 +0800 Subject: [PATCH 05/23] feat: modify favicon --- public/favicon.ico | Bin 4286 -> 169282 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/favicon.ico b/public/favicon.ico index 18993ad91cfd43e03b074dd0b5cc3f37ab38e49c..a50c3a3c58dbe5d5419c3d82529bd1406d5002ee 100644 GIT binary patch literal 169282 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 M_4*!Lt9p+8KXYSrA^-pY literal 4286 zcmeHLOKuuL5PjK%MHWVi6lD zOGiREbCw`xmFozJ^aNatJY>w+g ze6a2@u~m#^BZm@8wco9#Crlli0uLb^3E$t2-WIc^#(?t)*@`UpuofJ(Uyh@F>b3Ph z$D^m8Xq~pTkGJ4Q`Q2)te3mgkWYZ^Ijq|hkiP^9`De={bQQ%heZC$QU2UpP(-tbl8 zPWD2abEew;oat@w`uP3J^YpsgT%~jT(Dk%oU}sa$7|n6hBjDj`+I;RX(>)%lm_7N{+B7Mu%H?422lE%MBJH!!YTN2oT7xr>>N-8OF$C&qU^ z>vLsa{$0X%q1fjOe3P1mCv#lN{xQ4_*HCSAZjTb1`}mlc+9rl8$B3OP%VT@mch_~G z7Y+4b{r>9e=M+7vSI;BgB?ryZDY4m>&wcHSn81VH1N~`0gvwH{ z8dv#hG|OK`>1;j7tM#B)Z7zDN?{6=dUal}$e Date: Mon, 6 Oct 2025 17:49:25 +0800 Subject: [PATCH 06/23] feat: add lystra logo --- public/lystra-logo-dark.svg | 1 + public/lystra-logo-light.svg | 1 + 2 files changed, 2 insertions(+) create mode 100644 public/lystra-logo-dark.svg create mode 100644 public/lystra-logo-light.svg diff --git a/public/lystra-logo-dark.svg b/public/lystra-logo-dark.svg new file mode 100644 index 0000000..f2af3d9 --- /dev/null +++ b/public/lystra-logo-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/lystra-logo-light.svg b/public/lystra-logo-light.svg new file mode 100644 index 0000000..b655e4d --- /dev/null +++ b/public/lystra-logo-light.svg @@ -0,0 +1 @@ + \ No newline at end of file From 4d57f0b60dbcd3c0357998b0390636fd7f3b8c32 Mon Sep 17 00:00:00 2001 From: rockyroed Date: Mon, 6 Oct 2025 17:49:43 +0800 Subject: [PATCH 07/23] feat: use @nuxt/ui in css --- app/assets/css/main.css | 1 + 1 file changed, 1 insertion(+) diff --git a/app/assets/css/main.css b/app/assets/css/main.css index d4b5078..477bfa7 100644 --- a/app/assets/css/main.css +++ b/app/assets/css/main.css @@ -1 +1,2 @@ @import 'tailwindcss'; +@import '@nuxt/ui'; From c569539189e0be0dbb5008baf7c151662c6edec7 Mon Sep 17 00:00:00 2001 From: rockyroed Date: Mon, 6 Oct 2025 19:12:48 +0800 Subject: [PATCH 08/23] chore: install @nuxt/fonts --- nuxt.config.ts | 1 + package.json | 1 + pnpm-lock.yaml | 3 +++ 3 files changed, 5 insertions(+) diff --git a/nuxt.config.ts b/nuxt.config.ts index f93722b..b6656b1 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -7,6 +7,7 @@ export default defineNuxtConfig({ modules: [ '@nuxt/ui', + '@nuxt/fonts', '@nuxt/test-utils', '@nuxt/image', '@nuxt/eslint', diff --git a/package.json b/package.json index 467af35..f563131 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "dependencies": { "@clerk/nuxt": "^1.9.3", "@nuxt/eslint": "1.9.0", + "@nuxt/fonts": "0.11.4", "@nuxt/image": "1.11.0", "@nuxt/ui": "4.0.0", "@pinia/nuxt": "0.11.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ffb3c17..e0fa638 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,6 +14,9 @@ importers: '@nuxt/eslint': specifier: 1.9.0 version: 1.9.0(@typescript-eslint/utils@8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3))(@vue/compiler-sfc@3.5.22)(eslint@9.37.0(jiti@2.6.1))(magicast@0.3.5)(typescript@5.9.3)(vite@7.1.9(@types/node@24.6.2)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + '@nuxt/fonts': + specifier: 0.11.4 + version: 0.11.4(db0@0.3.4)(ioredis@5.8.0)(magicast@0.3.5)(vite@7.1.9(@types/node@24.6.2)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) '@nuxt/image': specifier: 1.11.0 version: 1.11.0(db0@0.3.4)(ioredis@5.8.0)(magicast@0.3.5) From 68476e285e427e4fe7683ce109954e799434e536 Mon Sep 17 00:00:00 2001 From: rockyroed Date: Mon, 6 Oct 2025 19:14:20 +0800 Subject: [PATCH 09/23] fix: set background-color in nuxt config this is to make the page load without the flashing white background --- nuxt.config.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/nuxt.config.ts b/nuxt.config.ts index b6656b1..3322c62 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -19,4 +19,12 @@ export default defineNuxtConfig({ vite: { plugins: [tailwindcss()], }, + + app: { + head: { + htmlAttrs: { + style: 'background-color: #0E172B;', + }, + }, + }, }); From a2586eaf8c660108d5b64e703d4f816050dca4dc Mon Sep 17 00:00:00 2001 From: rockyroed Date: Mon, 6 Oct 2025 19:14:40 +0800 Subject: [PATCH 10/23] feat: set font-family to Poppins --- app/assets/css/main.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/assets/css/main.css b/app/assets/css/main.css index 477bfa7..c917fb7 100644 --- a/app/assets/css/main.css +++ b/app/assets/css/main.css @@ -1,2 +1,6 @@ @import 'tailwindcss'; @import '@nuxt/ui'; + +* { + font-family: Poppins, sans-serif; +} From 57624c48c5da2be96cb674f85ea1fe1a048e4a23 Mon Sep 17 00:00:00 2001 From: rockyroed Date: Mon, 6 Oct 2025 19:46:44 +0800 Subject: [PATCH 11/23] chore: install @clerk/themes --- package.json | 1 + pnpm-lock.yaml | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/package.json b/package.json index f563131..8b3895e 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ }, "dependencies": { "@clerk/nuxt": "^1.9.3", + "@clerk/themes": "^2.4.24", "@nuxt/eslint": "1.9.0", "@nuxt/fonts": "0.11.4", "@nuxt/image": "1.11.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e0fa638..86571b4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,9 @@ importers: '@clerk/nuxt': specifier: ^1.9.3 version: 1.9.3(magicast@0.3.5)(react@19.1.1)(vue@3.5.22(typescript@5.9.3)) + '@clerk/themes': + specifier: ^2.4.24 + version: 2.4.24 '@nuxt/eslint': specifier: 1.9.0 version: 1.9.0(@typescript-eslint/utils@8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3))(@vue/compiler-sfc@3.5.22)(eslint@9.37.0(jiti@2.6.1))(magicast@0.3.5)(typescript@5.9.3)(vite@7.1.9(@types/node@24.6.2)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) @@ -277,6 +280,10 @@ packages: react-dom: optional: true + '@clerk/themes@2.4.24': + resolution: {integrity: sha512-/uedLbpimSHcpkWTPmyqNiCe6otHtGDCNU0Ki++miX/sTN/hJFVU/3UpfNHgXGWWOe7Ql6fixE1pzxsdlrMlWw==} + engines: {node: '>=18.17.0'} + '@clerk/types@4.91.0': resolution: {integrity: sha512-wvumOakC1tVDeCjGE1AqhgorMiK0PEDx+knnjxVnRP/pB8eY+JuWvNoBPlqbj2jbQAmcoLN17SigUNdvO5PDLw==} engines: {node: '>=18.17.0'} @@ -5593,6 +5600,11 @@ snapshots: optionalDependencies: react: 19.1.1 + '@clerk/themes@2.4.24': + dependencies: + '@clerk/types': 4.91.0 + tslib: 2.8.1 + '@clerk/types@4.91.0': dependencies: csstype: 3.1.3 From a55c44b0bacae2d1d118c4ba29514ee323d03005 Mon Sep 17 00:00:00 2001 From: rockyroed Date: Mon, 6 Oct 2025 19:46:59 +0800 Subject: [PATCH 12/23] feat: create header component --- app/components/Header/index.vue | 45 +++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 app/components/Header/index.vue diff --git a/app/components/Header/index.vue b/app/components/Header/index.vue new file mode 100644 index 0000000..15f0b29 --- /dev/null +++ b/app/components/Header/index.vue @@ -0,0 +1,45 @@ + + + From 5517fb78a0c35ce1aad7507c6b7f5675fae61530 Mon Sep 17 00:00:00 2001 From: rockyroed Date: Mon, 6 Oct 2025 19:47:21 +0800 Subject: [PATCH 13/23] feat: create layout --- app/app.vue | 8 +++++--- app/layouts/default.vue | 6 ++++++ 2 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 app/layouts/default.vue diff --git a/app/app.vue b/app/app.vue index ccb52d1..5acf3c1 100644 --- a/app/app.vue +++ b/app/app.vue @@ -1,5 +1,7 @@ diff --git a/app/layouts/default.vue b/app/layouts/default.vue new file mode 100644 index 0000000..781a35d --- /dev/null +++ b/app/layouts/default.vue @@ -0,0 +1,6 @@ + From 77ec2c2accf635dbe1466c33e695591ca6dc157b Mon Sep 17 00:00:00 2001 From: rockyroed Date: Mon, 6 Oct 2025 19:53:45 +0800 Subject: [PATCH 14/23] fix: responsive padding --- app/components/Header/index.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/Header/index.vue b/app/components/Header/index.vue index 15f0b29..398d905 100644 --- a/app/components/Header/index.vue +++ b/app/components/Header/index.vue @@ -5,7 +5,7 @@ const colorMode = useColorMode();