From b744abb6dd5f4bd94151f534fecca841e2de2b27 Mon Sep 17 00:00:00 2001 From: Eduardo San Martin Morote Date: Thu, 7 Aug 2025 17:45:55 +0200 Subject: [PATCH 01/81] feat: add new experimental option --- playground/vite.config.ts | 1 + pnpm-lock.yaml | 1017 ++++++++++++++++++++----------------- src/options.ts | 29 ++ 3 files changed, 595 insertions(+), 452 deletions(-) diff --git a/playground/vite.config.ts b/playground/vite.config.ts index 6f93f16b4..5d44cb03a 100644 --- a/playground/vite.config.ts +++ b/playground/vite.config.ts @@ -50,6 +50,7 @@ export default defineConfig({ // getRouteName: getPascalCaseRouteName, experimental: { autoExportsDataLoaders: ['src/loaders/**/*', '@/loaders/**/*'], + paramMatchers: true, }, extendRoute(route) { route.params.forEach((param) => { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7596d5c61..79cf034ae 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -128,7 +128,7 @@ importers: version: 6.0.1 rollup: specifier: ^4.52.0 - version: 4.52.0 + version: 4.52.2 semver: specifier: ^7.7.2 version: 7.7.2 @@ -146,25 +146,25 @@ importers: version: 20.1.0(@vueuse/core@12.5.0(typescript@5.9.2)) unplugin-vue-markdown: specifier: ^29.1.0 - version: 29.1.0(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1)) + version: 29.1.0(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1)) unplugin-vue-router: specifier: workspace:* version: 'link:' vite: specifier: ^7.1.6 - version: 7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1) + version: 7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1) vite-plugin-vue-devtools: specifier: ^8.0.2 - version: 8.0.2(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2)) + version: 8.0.2(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2)) vitepress: specifier: ^1.6.4 - version: 1.6.4(@algolia/client-search@5.20.0)(@types/node@22.18.6)(change-case@5.4.4)(fuse.js@7.1.0)(jwt-decode@4.0.0)(lightningcss@1.29.3)(postcss@8.5.6)(search-insights@2.17.2)(terser@5.40.0)(typescript@5.9.2) + version: 1.6.4(@algolia/client-search@5.20.0)(@types/node@22.18.6)(change-case@5.4.4)(fuse.js@7.1.0)(jwt-decode@4.0.0)(lightningcss@1.29.3)(postcss@8.5.6)(search-insights@2.17.2)(terser@5.43.1)(typescript@5.9.2) vitepress-plugin-llms: specifier: ^1.7.5 version: 1.7.5 vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.6)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.6)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1) vue: specifier: ^3.5.21 version: 3.5.21(typescript@5.9.2) @@ -201,10 +201,10 @@ importers: version: 0.2.1(@pinia/colada@0.17.1(pinia@3.0.3(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2))))(magicast@0.3.5) '@pinia/nuxt': specifier: ^0.11.1 - version: 0.11.1(magicast@0.3.5)(pinia@3.0.3(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2))) + version: 0.11.2(magicast@0.3.5)(pinia@3.0.3(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2))) nuxt: specifier: ^3.17.5 - version: 3.17.6(@netlify/blobs@8.2.0)(@parcel/watcher@2.5.1)(@types/node@22.18.6)(@vue/compiler-sfc@3.5.21)(db0@0.3.2)(encoding@0.1.13)(ioredis@5.6.1)(lightningcss@1.29.3)(magicast@0.3.5)(meow@13.2.0)(rolldown@1.0.0-beta.10-commit.87188ed)(rollup@4.52.0)(terser@5.40.0)(typescript@5.9.2)(vite@7.1.6(@types/node@22.18.6)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1))(vue-tsc@2.2.10(typescript@5.9.2))(yaml@2.8.1) + version: 3.17.6(@netlify/blobs@8.2.0)(@parcel/watcher@2.5.1)(@types/node@24.3.0)(@vue/compiler-sfc@3.5.21)(db0@0.3.2)(encoding@0.1.13)(ioredis@5.6.1)(lightningcss@1.29.3)(magicast@0.3.5)(meow@13.2.0)(rolldown@1.0.0-beta.10-commit.87188ed)(rollup@4.52.2)(terser@5.43.1)(typescript@5.9.2)(vite@7.1.6(@types/node@24.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1))(vue-tsc@2.2.10(typescript@5.9.2))(yaml@2.8.1) unplugin-vue-router: specifier: workspace:* version: link:../.. @@ -232,7 +232,7 @@ importers: version: 5.89.0(@tanstack/vue-query@5.89.0(vue@3.5.21(typescript@5.9.2)))(vue@3.5.21(typescript@5.9.2)) '@vitejs/plugin-vue': specifier: ^6.0.1 - version: 6.0.1(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2)) + version: 6.0.1(vite@7.1.6(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2)) '@vue/compiler-sfc': specifier: ^3.5.21 version: 3.5.21 @@ -247,7 +247,7 @@ importers: version: link:.. vite: specifier: ^7.1.6 - version: 7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1) + version: 7.1.6(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1) packages: @@ -1410,6 +1410,9 @@ packages: '@jridgewell/gen-mapping@0.3.12': resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + '@jridgewell/remapping@2.3.5': resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} @@ -1417,6 +1420,9 @@ packages: resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} + '@jridgewell/source-map@0.3.11': + resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} + '@jridgewell/source-map@0.3.6': resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} @@ -1429,6 +1435,9 @@ packages: '@jridgewell/trace-mapping@0.3.29': resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} + '@jridgewell/trace-mapping@0.3.30': + resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} + '@kwsites/file-exists@1.1.1': resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} @@ -1530,6 +1539,10 @@ packages: resolution: {integrity: sha512-8PKRwoEF70IXVrpGEJZ4g4V2WtE9RjSMgSZLLa0HZCoyT+QczJcJe3kho/XKnJOnNnHep4WqciTD7p4qRRtBqw==} engines: {node: '>=18.12.0'} + '@nuxt/kit@3.18.1': + resolution: {integrity: sha512-z6w1Fzv27CIKFlhct05rndkJSfoslplWH5fJ9dtusEvpYScLXp5cATWIbWkte9e9zFSmQTgDQJjNs3geQHE7og==} + engines: {node: '>=18.12.0'} + '@nuxt/schema@3.17.6': resolution: {integrity: sha512-ahm0yz6CrSaZ4pS0iuVod9lVRXNDNIidKWLLBx2naGNM6rW+sdFV9gxjvUS3+rLW+swa4HCKE6J5bjOl//oyqQ==} engines: {node: ^14.18.0 || >=16.10.0} @@ -1647,8 +1660,8 @@ packages: '@oxc-project/types@0.75.1': resolution: {integrity: sha512-7ZJy+51qWpZRvynaQUezeYfjCtaSdiXIWFUZIlOuTSfDXpXqnSl/m1IUPLx6XrOy6s0SFv3CLE14vcZy63bz7g==} - '@oxc-project/types@0.89.0': - resolution: {integrity: sha512-yuo+ECPIW5Q9mSeNmCDC2im33bfKuwW18mwkaHMQh8KakHYDzj4ci/q7wxf2qS3dMlVVCIyrs3kFtH5LmnlYnw==} + '@oxc-project/types@0.92.0': + resolution: {integrity: sha512-PDLfCbwgXjGdTBxzcuDOUxJYNBl6P8dOp3eDKWw54dYvqONan9rwGDRQU0zrkdEMiItfXQQUOI17uOcMX5Zm7A==} '@parcel/watcher-android-arm64@2.5.1': resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} @@ -1754,8 +1767,8 @@ packages: pinia: ^2.2.6 || ^3.0.0 vue: ^3.5.17 - '@pinia/nuxt@0.11.1': - resolution: {integrity: sha512-tCD8ioWhhIHKwm8Y9VvyhBAV/kK4W5uGBIYbI5iM4N1t7duOqK6ECBUavrMxMolELayqqMLb9+evegrh3S7s2A==} + '@pinia/nuxt@0.11.2': + resolution: {integrity: sha512-CgvSWpbktxxWBV7ModhAcsExsQZqpPq6vMYEe9DexmmY6959ev8ukL4iFhr/qov2Nb9cQAWd7niFDnaWkN+FHg==} peerDependencies: pinia: ^3.0.3 @@ -1814,8 +1827,8 @@ packages: '@quansync/fs@0.1.5': resolution: {integrity: sha512-lNS9hL2aS2NZgNW7BBj+6EBl4rOf8l+tQ0eRY6JWCI8jI2kc53gSoqbjojU0OnAWhzoXiOjFyGsHcDGePB3lhA==} - '@rolldown/binding-android-arm64@1.0.0-beta.38': - resolution: {integrity: sha512-AE3HFQrjWCKLFZD1Vpiy+qsqTRwwoil1oM5WsKPSmfQ5fif/A+ZtOZetF32erZdsR7qyvns6qHEteEsF6g6rsQ==} + '@rolldown/binding-android-arm64@1.0.0-beta.40': + resolution: {integrity: sha512-9Ii9phC7QU6Lb+ncMfG1Xlosq0NBB1N/4sw+EGZ3y0BBWGy02TOb5ghWZalphAKv9rn1goqo5WkBjyd2YvsLmA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] @@ -1825,8 +1838,8 @@ packages: cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-arm64@1.0.0-beta.38': - resolution: {integrity: sha512-RaoWOKc0rrFsVmKOjQpebMY6c6/I7GR1FBc25v7L/R7NlM0166mUotwGEv7vxu7ruXH4SJcFeVrfADFUUXUmmQ==} + '@rolldown/binding-darwin-arm64@1.0.0-beta.40': + resolution: {integrity: sha512-5O6d0y2tBQTL+ecQY3qXIwSnF1/Zik8q7LZMKeyF+VJ9l194d0IdMhl2zUF0cqWbYHuF4Pnxplk4OhurPQ/Z9Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] @@ -1836,8 +1849,8 @@ packages: cpu: [x64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-beta.38': - resolution: {integrity: sha512-Ymojqc2U35iUc8NFU2XX1WQPfBRRHN6xHcrxAf9WS8BFFBn8pDrH5QPvH1tYs3lDkw6UGGbanr1RGzARqdUp1g==} + '@rolldown/binding-darwin-x64@1.0.0-beta.40': + resolution: {integrity: sha512-izB9jygt3miPQbOTZfSu5K51isUplqa8ysByOKQqcJHgrBWmbTU8TM9eouv6tRmBR0kjcEcID9xhmA1CeZ1VIg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] @@ -1847,8 +1860,8 @@ packages: cpu: [x64] os: [freebsd] - '@rolldown/binding-freebsd-x64@1.0.0-beta.38': - resolution: {integrity: sha512-0ermTQ//WzSI0nOL3z/LUWMNiE9xeM5cLGxjewPFEexqxV/0uM8/lNp9QageQ8jfc/VO1OURsGw34HYO5PaL8w==} + '@rolldown/binding-freebsd-x64@1.0.0-beta.40': + resolution: {integrity: sha512-2fdpEpKT+wwP0vig9dqxu+toTeWmVSjo3psJQVDeLJ51rO+GXcCJ1IkCXjhMKVEevNtZS7B8T8Z2vvmRV9MAdA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] @@ -1858,8 +1871,8 @@ packages: cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.38': - resolution: {integrity: sha512-GADxzVUTCTp6EWI52831A29Tt7PukFe94nhg/SUsfkI33oTiNQtPxyLIT/3oRegizGuPSZSlrdBurkjDwxyEUQ==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.40': + resolution: {integrity: sha512-HP2lo78OWULN+8TewpLbS9PS00jh0CaF04tA2u8z2I+6QgVgrYOYKvX+T0hlO5smgso4+qb3YchzumWJl3yCPQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] @@ -1869,8 +1882,8 @@ packages: cpu: [arm64] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.38': - resolution: {integrity: sha512-SKO7Exl5Yem/OSNoA5uLHzyrptUQ8Hg70kHDxuwEaH0+GUg+SQe9/7PWmc4hFKBMrJGdQtii8WZ0uIz9Dofg5Q==} + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.40': + resolution: {integrity: sha512-ng00gfr9BhA2NPAOU5RWAlTiL+JcwAD+L+4yUD1sbBy6tgHdLiNBOvKtHISIF9RM9/eQeS0tAiWOYZGIH9JMew==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] @@ -1880,8 +1893,8 @@ packages: cpu: [arm64] os: [linux] - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.38': - resolution: {integrity: sha512-SOo6+WqhXPBaShLxLT0eCgH17d3Yu1lMAe4mFP0M9Bvr/kfMSOPQXuLxBcbBU9IFM9w3N6qP9xWOHO+oUJvi8Q==} + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.40': + resolution: {integrity: sha512-mF0R1l9kLcaag/9cLEiYYdNZ4v1uuX4jklSDZ1s6vJE4RB3LirUney0FavdVRwCJ5sDvfvsPgXgtBXWYr2M2tQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] @@ -1891,8 +1904,8 @@ packages: cpu: [x64] os: [linux] - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.38': - resolution: {integrity: sha512-yvsQ3CyrodOX+lcoi+lejZGCOvJZa9xTsNB8OzpMDmHeZq3QzJfpYjXSAS6vie70fOkLVJb77UqYO193Cl8XBQ==} + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.40': + resolution: {integrity: sha512-+wi08S7wT5iLPHRZb0USrS6n+T6m+yY++dePYedE5uvKIpWCJJioFTaRtWjpm0V6dVNLcq2OukrvfdlGtH9Wgg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] @@ -1902,14 +1915,14 @@ packages: cpu: [x64] os: [linux] - '@rolldown/binding-linux-x64-musl@1.0.0-beta.38': - resolution: {integrity: sha512-84qzKMwUwikfYeOuJ4Kxm/3z15rt0nFGGQArHYIQQNSTiQdxGHxOkqXtzPFqrVfBJUdxBAf+jYzR1pttFJuWyg==} + '@rolldown/binding-linux-x64-musl@1.0.0-beta.40': + resolution: {integrity: sha512-W5qBGAemUocIBKCcOsDjlV9GUt28qhl/+M6etWBeLS5gQK0J6XDg0YVzfOQdvq57ZGjYNP0NvhYzqhOOnEx+4g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - '@rolldown/binding-openharmony-arm64@1.0.0-beta.38': - resolution: {integrity: sha512-QrNiWlce01DYH0rL8K3yUBu+lNzY+B0DyCbIc2Atan6/S6flxOL0ow5DLQvMamOI/oKhrJ4xG+9MkMb9dDHbLQ==} + '@rolldown/binding-openharmony-arm64@1.0.0-beta.40': + resolution: {integrity: sha512-vJwoDehtt+yqj2zacq1AqNc2uE/oh7mnRGqAUbuldV6pgvU01OSQUJ7Zu+35hTopnjFoDNN6mIezkYlGAv5RFA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] @@ -1919,8 +1932,8 @@ packages: engines: {node: '>=14.21.3'} cpu: [wasm32] - '@rolldown/binding-wasm32-wasi@1.0.0-beta.38': - resolution: {integrity: sha512-fnLtHyjwEsG4/aNV3Uv3Qd1ZbdH+CopwJNoV0RgBqrcQB8V6/Qdikd5JKvnO23kb3QvIpP+dAMGZMv1c2PJMzw==} + '@rolldown/binding-wasm32-wasi@1.0.0-beta.40': + resolution: {integrity: sha512-Oj3YyqVUPurr1FlMpEE/bJmMC+VWAWPM/SGUfklO5KUX97bk5Q/733nPg4RykK8q8/TluJoQYvRc05vL/B74dw==} engines: {node: '>=14.0.0'} cpu: [wasm32] @@ -1929,8 +1942,8 @@ packages: cpu: [arm64] os: [win32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.38': - resolution: {integrity: sha512-19cTfnGedem+RY+znA9J6ARBOCEFD4YSjnx0p5jiTm9tR6pHafRfFIfKlTXhun+NL0WWM/M0eb2IfPPYUa8+wg==} + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.40': + resolution: {integrity: sha512-0ZtO6yN8XjVoFfN4HDWQj4nDu3ndMybr7jIM00DJqOmc+yFhly7rdOy7fNR9Sky3leCpBtsXfepVqRmVpYKPVA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] @@ -1940,8 +1953,8 @@ packages: cpu: [ia32] os: [win32] - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.38': - resolution: {integrity: sha512-HcICm4YzFJZV+fI0O0bFLVVlsWvRNo/AB9EfUXvNYbtAxakCnQZ15oq22deFdz6sfi9Y4/SagH2kPU723dhCFA==} + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.40': + resolution: {integrity: sha512-BPl1inoJXPpIe38Ja46E4y11vXlJyuleo+9Rmu//pYL5fIDYJkXUj/oAXqjSuwLcssrcwnuPgzvzvlz9++cr3w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] @@ -1951,8 +1964,8 @@ packages: cpu: [x64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.38': - resolution: {integrity: sha512-4Qx6cgEPXLb0XsCyLoQcUgYBpfL0sjugftob+zhUH0EOk/NVCAIT+h0NJhY+jn7pFpeKxhNMqhvTNx3AesxIAQ==} + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.40': + resolution: {integrity: sha512-UguA4ltbAk+nbwHRxqaUP/etpTbR0HjyNlsu4Zjbh/ytNbFsbw8CA4tEBkwDyjgI5NIPea6xY11zpl7R2/ddVA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -1963,8 +1976,11 @@ packages: '@rolldown/pluginutils@1.0.0-beta.29': resolution: {integrity: sha512-NIJgOsMjbxAXvoGq/X0gD7VPMQ8j9g0BiDaNjVNVjvl+iKXxL3Jre0v31RmBYeLEmkbj2s02v8vFTbUXi5XS2Q==} - '@rolldown/pluginutils@1.0.0-beta.38': - resolution: {integrity: sha512-N/ICGKleNhA5nc9XXQG/kkKHJ7S55u0x0XUJbbkmdCnFuoRkM1Il12q9q0eX19+M7KKUEPw/daUPIRnxhcxAIw==} + '@rolldown/pluginutils@1.0.0-beta.33': + resolution: {integrity: sha512-she25NCG6NoEPC/SEB4pHs5STcnfI4VBFOzjeI63maSPrWME5J2XC8ogrBgp8NaE/xzj28/kbpSaebiMvFRj+w==} + + '@rolldown/pluginutils@1.0.0-beta.40': + resolution: {integrity: sha512-s3GeJKSQOwBlzdUrj4ISjJj5SfSh+aqn0wjOar4Bx95iV1ETI7F6S/5hLcfAxZ9kXDcyrAkxPlqmd1ZITttf+w==} '@rollup/plugin-alias@5.1.1': resolution: {integrity: sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==} @@ -2038,113 +2054,113 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.52.0': - resolution: {integrity: sha512-VxDYCDqOaR7NXzAtvRx7G1u54d2kEHopb28YH/pKzY6y0qmogP3gG7CSiWsq9WvDFxOQMpNEyjVAHZFXfH3o/A==} + '@rollup/rollup-android-arm-eabi@4.52.2': + resolution: {integrity: sha512-o3pcKzJgSGt4d74lSZ+OCnHwkKBeAbFDmbEm5gg70eA8VkyCuC/zV9TwBnmw6VjDlRdF4Pshfb+WE9E6XY1PoQ==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.52.0': - resolution: {integrity: sha512-pqDirm8koABIKvzL59YI9W9DWbRlTX7RWhN+auR8HXJxo89m4mjqbah7nJZjeKNTNYopqL+yGg+0mhCpf3xZtQ==} + '@rollup/rollup-android-arm64@4.52.2': + resolution: {integrity: sha512-cqFSWO5tX2vhC9hJTK8WAiPIm4Q8q/cU8j2HQA0L3E1uXvBYbOZMhE2oFL8n2pKB5sOCHY6bBuHaRwG7TkfJyw==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.52.0': - resolution: {integrity: sha512-YCdWlY/8ltN6H78HnMsRHYlPiKvqKagBP1r+D7SSylxX+HnsgXGCmLiV3Y4nSyY9hW8qr8U9LDUx/Lo7M6MfmQ==} + '@rollup/rollup-darwin-arm64@4.52.2': + resolution: {integrity: sha512-vngduywkkv8Fkh3wIZf5nFPXzWsNsVu1kvtLETWxTFf/5opZmflgVSeLgdHR56RQh71xhPhWoOkEBvbehwTlVA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.52.0': - resolution: {integrity: sha512-z4nw6y1j+OOSGzuVbSWdIp1IUks9qNw4dc7z7lWuWDKojY38VMWBlEN7F9jk5UXOkUcp97vA1N213DF+Lz8BRg==} + '@rollup/rollup-darwin-x64@4.52.2': + resolution: {integrity: sha512-h11KikYrUCYTrDj6h939hhMNlqU2fo/X4NB0OZcys3fya49o1hmFaczAiJWVAFgrM1NCP6RrO7lQKeVYSKBPSQ==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.52.0': - resolution: {integrity: sha512-Q/dv9Yvyr5rKlK8WQJZVrp5g2SOYeZUs9u/t2f9cQ2E0gJjYB/BWoedXfUT0EcDJefi2zzVfhcOj8drWCzTviw==} + '@rollup/rollup-freebsd-arm64@4.52.2': + resolution: {integrity: sha512-/eg4CI61ZUkLXxMHyVlmlGrSQZ34xqWlZNW43IAU4RmdzWEx0mQJ2mN/Cx4IHLVZFL6UBGAh+/GXhgvGb+nVxw==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.52.0': - resolution: {integrity: sha512-kdBsLs4Uile/fbjZVvCRcKB4q64R+1mUq0Yd7oU1CMm1Av336ajIFqNFovByipciuUQjBCPMxwJhCgfG2re3rg==} + '@rollup/rollup-freebsd-x64@4.52.2': + resolution: {integrity: sha512-QOWgFH5X9+p+S1NAfOqc0z8qEpJIoUHf7OWjNUGOeW18Mx22lAUOiA9b6r2/vpzLdfxi/f+VWsYjUOMCcYh0Ng==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.52.0': - resolution: {integrity: sha512-aL6hRwu0k7MTUESgkg7QHY6CoqPgr6gdQXRJI1/VbFlUMwsSzPGSR7sG5d+MCbYnJmJwThc2ol3nixj1fvI/zQ==} + '@rollup/rollup-linux-arm-gnueabihf@4.52.2': + resolution: {integrity: sha512-kDWSPafToDd8LcBYd1t5jw7bD5Ojcu12S3uT372e5HKPzQt532vW+rGFFOaiR0opxePyUkHrwz8iWYEyH1IIQA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.52.0': - resolution: {integrity: sha512-BTs0M5s1EJejgIBJhCeiFo7GZZ2IXWkFGcyZhxX4+8usnIo5Mti57108vjXFIQmmJaRyDwmV59Tw64Ap1dkwMw==} + '@rollup/rollup-linux-arm-musleabihf@4.52.2': + resolution: {integrity: sha512-gKm7Mk9wCv6/rkzwCiUC4KnevYhlf8ztBrDRT9g/u//1fZLapSRc+eDZj2Eu2wpJ+0RzUKgtNijnVIB4ZxyL+w==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.52.0': - resolution: {integrity: sha512-uj672IVOU9m08DBGvoPKPi/J8jlVgjh12C9GmjjBxCTQc3XtVmRkRKyeHSmIKQpvJ7fIm1EJieBUcnGSzDVFyw==} + '@rollup/rollup-linux-arm64-gnu@4.52.2': + resolution: {integrity: sha512-66lA8vnj5mB/rtDNwPgrrKUOtCLVQypkyDa2gMfOefXK6rcZAxKLO9Fy3GkW8VkPnENv9hBkNOFfGLf6rNKGUg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.52.0': - resolution: {integrity: sha512-/+IVbeDMDCtB/HP/wiWsSzduD10SEGzIZX2945KSgZRNi4TSkjHqRJtNTVtVb8IRwhJ65ssI56krlLik+zFWkw==} + '@rollup/rollup-linux-arm64-musl@4.52.2': + resolution: {integrity: sha512-s+OPucLNdJHvuZHuIz2WwncJ+SfWHFEmlC5nKMUgAelUeBUnlB4wt7rXWiyG4Zn07uY2Dd+SGyVa9oyLkVGOjA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.52.0': - resolution: {integrity: sha512-U1vVzvSWtSMWKKrGoROPBXMh3Vwn93TA9V35PldokHGqiUbF6erSzox/5qrSMKp6SzakvyjcPiVF8yB1xKr9Pg==} + '@rollup/rollup-linux-loong64-gnu@4.52.2': + resolution: {integrity: sha512-8wTRM3+gVMDLLDdaT6tKmOE3lJyRy9NpJUS/ZRWmLCmOPIJhVyXwjBo+XbrrwtV33Em1/eCTd5TuGJm4+DmYjw==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.52.0': - resolution: {integrity: sha512-X/4WfuBAdQRH8cK3DYl8zC00XEE6aM472W+QCycpQJeLWVnHfkv7RyBFVaTqNUMsTgIX8ihMjCvFF9OUgeABzw==} + '@rollup/rollup-linux-ppc64-gnu@4.52.2': + resolution: {integrity: sha512-6yqEfgJ1anIeuP2P/zhtfBlDpXUb80t8DpbYwXQ3bQd95JMvUaqiX+fKqYqUwZXqdJDd8xdilNtsHM2N0cFm6A==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.52.0': - resolution: {integrity: sha512-xIRYc58HfWDBZoLmWfWXg2Sq8VCa2iJ32B7mqfWnkx5mekekl0tMe7FHpY8I72RXEcUkaWawRvl3qA55og+cwQ==} + '@rollup/rollup-linux-riscv64-gnu@4.52.2': + resolution: {integrity: sha512-sshYUiYVSEI2B6dp4jMncwxbrUqRdNApF2c3bhtLAU0qA8Lrri0p0NauOsTWh3yCCCDyBOjESHMExonp7Nzc0w==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.52.0': - resolution: {integrity: sha512-mbsoUey05WJIOz8U1WzNdf+6UMYGwE3fZZnQqsM22FZ3wh1N887HT6jAOjXs6CNEK3Ntu2OBsyQDXfIjouI4dw==} + '@rollup/rollup-linux-riscv64-musl@4.52.2': + resolution: {integrity: sha512-duBLgd+3pqC4MMwBrKkFxaZerUxZcYApQVC5SdbF5/e/589GwVvlRUnyqMFbM8iUSb1BaoX/3fRL7hB9m2Pj8Q==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.52.0': - resolution: {integrity: sha512-qP6aP970bucEi5KKKR4AuPFd8aTx9EF6BvutvYxmZuWLJHmnq4LvBfp0U+yFDMGwJ+AIJEH5sIP+SNypauMWzg==} + '@rollup/rollup-linux-s390x-gnu@4.52.2': + resolution: {integrity: sha512-tzhYJJidDUVGMgVyE+PmxENPHlvvqm1KILjjZhB8/xHYqAGeizh3GBGf9u6WdJpZrz1aCpIIHG0LgJgH9rVjHQ==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.52.0': - resolution: {integrity: sha512-nmSVN+F2i1yKZ7rJNKO3G7ZzmxJgoQBQZ/6c4MuS553Grmr7WqR7LLDcYG53Z2m9409z3JLt4sCOhLdbKQ3HmA==} + '@rollup/rollup-linux-x64-gnu@4.52.2': + resolution: {integrity: sha512-opH8GSUuVcCSSyHHcl5hELrmnk4waZoVpgn/4FDao9iyE4WpQhyWJ5ryl5M3ocp4qkRuHfyXnGqg8M9oKCEKRA==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.52.0': - resolution: {integrity: sha512-2d0qRo33G6TfQVjaMR71P+yJVGODrt5V6+T0BDYH4EMfGgdC/2HWDVjSSFw888GSzAZUwuska3+zxNUCDco6rQ==} + '@rollup/rollup-linux-x64-musl@4.52.2': + resolution: {integrity: sha512-LSeBHnGli1pPKVJ79ZVJgeZWWZXkEe/5o8kcn23M8eMKCUANejchJbF/JqzM4RRjOJfNRhKJk8FuqL1GKjF5oQ==} cpu: [x64] os: [linux] - '@rollup/rollup-openharmony-arm64@4.52.0': - resolution: {integrity: sha512-A1JalX4MOaFAAyGgpO7XP5khquv/7xKzLIyLmhNrbiCxWpMlnsTYr8dnsWM7sEeotNmxvSOEL7F65j0HXFcFsw==} + '@rollup/rollup-openharmony-arm64@4.52.2': + resolution: {integrity: sha512-uPj7MQ6/s+/GOpolavm6BPo+6CbhbKYyZHUDvZ/SmJM7pfDBgdGisFX3bY/CBDMg2ZO4utfhlApkSfZ92yXw7Q==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.52.0': - resolution: {integrity: sha512-YQugafP/rH0eOOHGjmNgDURrpYHrIX0yuojOI8bwCyXwxC9ZdTd3vYkmddPX0oHONLXu9Rb1dDmT0VNpjkzGGw==} + '@rollup/rollup-win32-arm64-msvc@4.52.2': + resolution: {integrity: sha512-Z9MUCrSgIaUeeHAiNkm3cQyst2UhzjPraR3gYYfOjAuZI7tcFRTOD+4cHLPoS/3qinchth+V56vtqz1Tv+6KPA==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.52.0': - resolution: {integrity: sha512-zYdUYhi3Qe2fndujBqL5FjAFzvNeLxtIqfzNEVKD1I7C37/chv1VxhscWSQHTNfjPCrBFQMnynwA3kpZpZ8w4A==} + '@rollup/rollup-win32-ia32-msvc@4.52.2': + resolution: {integrity: sha512-+GnYBmpjldD3XQd+HMejo+0gJGwYIOfFeoBQv32xF/RUIvccUz20/V6Otdv+57NE70D5pa8W/jVGDoGq0oON4A==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.52.0': - resolution: {integrity: sha512-fGk03kQylNaCOQ96HDMeT7E2n91EqvCDd3RwvT5k+xNdFCeMGnj5b5hEgTGrQuyidqSsD3zJDQ21QIaxXqTBJw==} + '@rollup/rollup-win32-x64-gnu@4.52.2': + resolution: {integrity: sha512-ApXFKluSB6kDQkAqZOKXBjiaqdF1BlKi+/eqnYe9Ee7U2K3pUDKsIyr8EYm/QDHTJIM+4X+lI0gJc3TTRhd+dA==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.52.0': - resolution: {integrity: sha512-6iKDCVSIUQ8jPMoIV0OytRKniaYyy5EbY/RRydmLW8ZR3cEBhxbWl5ro0rkUNe0ef6sScvhbY79HrjRm8i3vDQ==} + '@rollup/rollup-win32-x64-msvc@4.52.2': + resolution: {integrity: sha512-ARz+Bs8kY6FtitYM96PqPEVvPXqEZmPZsSkXvyX19YzDqkCaIlhCieLLMI5hxO9SRZ2XtCtm8wxhy0iJ2jxNfw==} cpu: [x64] os: [win32] @@ -2302,12 +2318,15 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@20.19.4': - resolution: {integrity: sha512-OP+We5WV8Xnbuvw0zC2m4qfB/BJvjyCwtNjhHdJxV1639SGSKrLmJkc3fMnp2Qy8nJyHp8RO6umxELN/dS1/EA==} + '@types/node@20.19.11': + resolution: {integrity: sha512-uug3FEEGv0r+jrecvUUpbY8lLisvIjg6AAic6a2bSP5OEOLeJsDSnvhCDov7ipFFMXS3orMpzlmi0ZcuGkBbow==} '@types/node@22.18.6': resolution: {integrity: sha512-r8uszLPpeIWbNKtvWRt/DbVi5zbqZyj1PTmhRMqBMvDnaz1QpmSKujUtJLrqGZeoM8v72MfYggDceY4K1itzWQ==} + '@types/node@24.3.0': + resolution: {integrity: sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==} + '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -2526,8 +2545,8 @@ packages: '@vue/devtools-api@7.7.6': resolution: {integrity: sha512-b2Xx0KvXZObePpXPYHvBRRJLDQn5nhKjXh7vUhMEtWxz1AYNFOVIsh5+HLP8xDGL7sy+Q7hXeUxPHB/KgbtsPw==} - '@vue/devtools-api@8.0.1': - resolution: {integrity: sha512-YBvjfpM7LEp5+b7ZDm4+mFrC+TgGjUmN8ff9lZcbHQ1MKhmftT/urCTZP0y1j26YQWr25l9TPaEbNLbILRiGoQ==} + '@vue/devtools-api@8.0.2': + resolution: {integrity: sha512-RdwsaYoSTumwZ7XOt5yIPP1/T4O0bTs+c5XaEjmUB6f9x+FvDSL9AekxW1vuhK1lmA9TfewpXVt2r5LIax3LHw==} '@vue/devtools-core@7.7.7': resolution: {integrity: sha512-9z9TLbfC+AjAi1PQyWX+OErjIaJmdFlbDHcD+cAMYKY6Bh5VlsAtCeGyRMrXwIlMEQPukvnWt3gZBLwTAIMKzQ==} @@ -2542,18 +2561,12 @@ packages: '@vue/devtools-kit@7.7.7': resolution: {integrity: sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA==} - '@vue/devtools-kit@8.0.1': - resolution: {integrity: sha512-7kiPhgTKNtNeXltEHnJJjIDlndlJP4P+UJvCw54uVHNDlI6JzwrSiRmW4cxKTug2wDbc/dkGaMnlZghcwV+aWA==} - '@vue/devtools-kit@8.0.2': resolution: {integrity: sha512-yjZKdEmhJzQqbOh4KFBfTOQjDPMrjjBNCnHBvnTGJX+YLAqoUtY2J+cg7BE+EA8KUv8LprECq04ts75wCoIGWA==} '@vue/devtools-shared@7.7.7': resolution: {integrity: sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw==} - '@vue/devtools-shared@8.0.1': - resolution: {integrity: sha512-PqtWqPPRpMwZ9FjTzyugb5KeV9kmg2C3hjxZHwjl0lijT4QIJDd0z6AWcnbM9w2nayjDymyTt0+sbdTv3pVeNg==} - '@vue/devtools-shared@8.0.2': resolution: {integrity: sha512-mLU0QVdy5Lp40PMGSixDw/Kbd6v5dkQXltd2r+mdVQV7iUog2NlZuLxFZApFZ/mObUBDhoCpf0T3zF2FWWdeHw==} @@ -2604,9 +2617,6 @@ packages: '@vue/shared@3.5.18': resolution: {integrity: sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==} - '@vue/shared@3.5.19': - resolution: {integrity: sha512-IhXCOn08wgKrLQxRFKKlSacWg4Goi1BolrdEeLYn6tgHjJNXVrWJ5nzoxZqNwl5p88aLlQ8LOaoMa3AYvaKJ/Q==} - '@vue/shared@3.5.21': resolution: {integrity: sha512-+2k1EQpnYuVuu3N7atWyG3/xoFWIVJZq4Mz8XNOdScFI0etES75fbny/oU4lKWk/577P1zmg0ioYvpGEDZ3DLw==} @@ -2936,8 +2946,8 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.25.0: - resolution: {integrity: sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==} + browserslist@4.25.2: + resolution: {integrity: sha512-0si2SJK3ooGzIawRu61ZdPCO1IncZwS8IzuX73sPZsXW6EQ/w/DAfPyKI8l1ETTCr2MnvqWitmlCUxgdul45jA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -2978,6 +2988,14 @@ packages: magicast: optional: true + c12@3.2.0: + resolution: {integrity: sha512-ixkEtbYafL56E6HiFuonMm1ZjoKtIo7TH68/uiEq4DAwv9NcUX2nJ95F8TrbMeNjqIkZpruo3ojXQJ+MGG5gcQ==} + peerDependencies: + magicast: ^0.3.5 + peerDependenciesMeta: + magicast: + optional: true + cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -2999,6 +3017,9 @@ packages: caniuse-lite@1.0.30001720: resolution: {integrity: sha512-Ec/2yV2nNPwb4DnTANEV99ZWwm3ZWfdlfkQbWSDDt+PsXEVYwlhPH8tdMaPunYTKKmz7AnHi2oNEi1GcmKCD8g==} + caniuse-lite@1.0.30001735: + resolution: {integrity: sha512-EV/laoX7Wq2J9TQlyIXRxTJqIw4sxfXS4OYgudGxBYRuTv0q7AM6yMEpU/Vo1I94thg9U6EZ2NfZx9GJq83u7w==} + ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -3056,9 +3077,9 @@ packages: resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} engines: {node: '>=18'} - cli-truncate@4.0.0: - resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} - engines: {node: '>=18'} + cli-truncate@5.1.0: + resolution: {integrity: sha512-7JDGG+4Zp0CsknDCedl0DYdaeOhc46QNpXi3NLQblkZpXXgA6LncLDUUyvrjSvZeF3VRQa+KiMGomazQrC1V8g==} + engines: {node: '>=20'} clipboardy@4.0.0: resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==} @@ -3556,6 +3577,10 @@ packages: resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} engines: {node: '>=12'} + dotenv@17.2.1: + resolution: {integrity: sha512-kQhDYKZecqnM0fCnzI5eIv5L4cAe/iRI+HqMbO/hbRdTAeXDG+M9FjipUxNfbARuEg4iHIbhnhs78BCHNbSxEQ==} + engines: {node: '>=12'} + dts-resolver@2.1.2: resolution: {integrity: sha512-xeXHBQkn2ISSXxbJWD828PFjtyg+/UrMDo7W4Ffcs7+YWCquxU8YjV1KoxuiL+eJ5pg3ll+bC6flVv61L3LKZg==} engines: {node: '>=20.18.0'} @@ -3583,8 +3608,8 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.5.161: - resolution: {integrity: sha512-hwtetwfKNZo/UlwHIVBlKZVdy7o8bIZxxKs0Mv/ROPiQQQmDgdm5a+KvKtBsxM8ZjFzTaCeLoodZ8jiBE3o9rA==} + electron-to-chromium@1.5.202: + resolution: {integrity: sha512-NxbYjRmiHcHXV1Ws3fWUW+SLb62isauajk45LUJ/HgIOkUA7jLZu/X2Iif+X9FBNK8QkF9Zb4Q2mcwXCcY30mg==} emoji-regex-xs@1.0.0: resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} @@ -3619,8 +3644,8 @@ packages: end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - enhanced-resolve@5.18.1: - resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} + enhanced-resolve@5.18.3: + resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} engines: {node: '>=10.13.0'} entities@4.5.0: @@ -3816,6 +3841,14 @@ packages: fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + fdir@6.4.6: + resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -4222,10 +4255,6 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - is-fullwidth-code-point@4.0.0: - resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} - engines: {node: '>=12'} - is-fullwidth-code-point@5.0.0: resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} engines: {node: '>=18'} @@ -4537,8 +4566,8 @@ packages: resolution: {integrity: sha512-I8oW2+QL5KJo8zXNWX046M134WchxsXC7SawLPvRQpogCbkyQIaFxPE89A2HiwR7vAK2Dm2ERBAmyjTYGYEpBg==} hasBin: true - listr2@9.0.3: - resolution: {integrity: sha512-0aeh5HHHgmq1KRdMMDHfhMWQmIT/m7nRDTlxlFqni2Sp0had9baqsjJRvDGdlvgd6NmPE0nPloOipiQJGFtTHQ==} + listr2@9.0.4: + resolution: {integrity: sha512-1wd/kpAdKRLwv7/3OKC8zZ5U8e/fajCfWMxacUvB79S5nLrYGPtUI/8chMQhn3LQjsRVErTb9i1ECAwW0ZIHnQ==} engines: {node: '>=20.0.0'} loader-runner@4.3.0: @@ -4630,9 +4659,6 @@ packages: magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} - magic-string@0.30.18: - resolution: {integrity: sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==} - magic-string@0.30.19: resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} @@ -5543,8 +5569,8 @@ packages: proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} - protobufjs@7.5.0: - resolution: {integrity: sha512-Z2E/kOY1QjoMlCytmexzYfDm/w5fKAiRwpSzGtdnXW1zC88Z2yXazHHrOtwCzn+7wSxyE8PYM4rvVcMphF9sOA==} + protobufjs@7.5.3: + resolution: {integrity: sha512-sildjKwVqOI2kmFDiXQ6aEB0fjYTafpEvIBs8tOR8qI4spuL9OPROLVu2qZqi/xgCfsHIwVqlaF8JBjWFHnKbw==} engines: {node: '>=12.0.0'} protocols@2.0.2: @@ -5715,8 +5741,8 @@ packages: engines: {node: 20 || >=22} hasBin: true - rolldown-plugin-dts@0.16.7: - resolution: {integrity: sha512-9iDzS4MHXMyieisFbWxuz96i/idGJNpvWILqCH06mrEZvn8Q2el3Q63xxjOt7HJjTOUNFhB1isvZFy4dA87lPQ==} + rolldown-plugin-dts@0.16.8: + resolution: {integrity: sha512-lsx7yrYA0ZXfARLEcPKgHIw8DX4fLQOhmMChgZbn5eFhqibY2Bav1+/Yn5WNm+ATtw+cefXYgEYO/7njeHsgAA==} engines: {node: '>=20.18.0'} peerDependencies: '@ts-macro/tsc': ^0.3.6 @@ -5738,8 +5764,8 @@ packages: resolution: {integrity: sha512-D+iim+DHIwK9kbZvubENmtnYFqHfFV0OKwzT8yU/W+xyUK1A71+iRFmJYBGqNUo3fJ2Ob4oIQfan63mhzh614A==} hasBin: true - rolldown@1.0.0-beta.38: - resolution: {integrity: sha512-58frPNX55Je1YsyrtPJv9rOSR3G5efUZpRqok94Efsj0EUa8dnqJV3BldShyI7A+bVPleucOtzXHwVpJRcR0kQ==} + rolldown@1.0.0-beta.40: + resolution: {integrity: sha512-VqEHbKpOgTPmQrZ4fVn4eshDQS/6g/fRpNE7cFSJY+eQLDZn4B9X61J6L+hnlt1u2uRI+pF7r1USs6S5fuWCvw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -5756,8 +5782,8 @@ packages: rollup: optional: true - rollup@4.52.0: - resolution: {integrity: sha512-+IuescNkTJQgX7AkIDtITipZdIGcWF0pnVvZTWStiazUmcGA2ag8dfg0urest2XlXUi9kuhfQ+qmdc5Stc3z7g==} + rollup@4.52.2: + resolution: {integrity: sha512-I25/2QgoROE1vYV+NQ1En9T9UFB9Cmfm2CJ83zZOlaDpvz29wGQSZXWKw7MiNXau7wYgB/T9fVIdIuEQ+KbiiA==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -5912,10 +5938,6 @@ packages: resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} engines: {node: '>=14.16'} - slice-ansi@5.0.0: - resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} - engines: {node: '>=12'} - slice-ansi@7.1.0: resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} engines: {node: '>=18'} @@ -5998,6 +6020,10 @@ packages: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} + string-width@8.1.0: + resolution: {integrity: sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==} + engines: {node: '>=20'} + string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} @@ -6123,6 +6149,11 @@ packages: engines: {node: '>=10'} hasBin: true + terser@5.43.1: + resolution: {integrity: sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==} + engines: {node: '>=10'} + hasBin: true + test-exclude@7.0.1: resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} engines: {node: '>=18'} @@ -6300,6 +6331,9 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici-types@7.10.0: + resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} + unenv@2.0.0-rc.18: resolution: {integrity: sha512-O0oVQVJ2X3Q8H4HITJr4e2cWxMYBeZ+p8S25yoKCxVCgDWtIJDcgwWNonYz12tI3ylVQCRyPV/Bdq0KJeXo7AA==} @@ -6593,8 +6627,8 @@ packages: vite: ^6.0.0 || ^7.0.0 vue: ^3.5.0 - vite@5.4.20: - resolution: {integrity: sha512-j3lYzGC3P+B5Yfy/pfKNgVEg4+UtcIJcVRt2cDjIOmhLourAqPqf8P7acgxeiSgUB7E3p2P8/3gNIgDLpwzs4g==} + vite@5.4.19: + resolution: {integrity: sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -6624,8 +6658,8 @@ packages: terser: optional: true - vite@6.3.6: - resolution: {integrity: sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA==} + vite@6.3.5: + resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: @@ -7129,7 +7163,7 @@ snapshots: '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) '@babel/helpers': 7.27.4 - '@babel/parser': 7.28.4 + '@babel/parser': 7.28.3 '@babel/template': 7.27.2 '@babel/traverse': 7.27.4 '@babel/types': 7.28.4 @@ -7145,8 +7179,8 @@ snapshots: dependencies: '@babel/parser': 7.28.4 '@babel/types': 7.28.4 - '@jridgewell/gen-mapping': 0.3.12 - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.30 jsesc: 3.1.0 '@babel/helper-annotate-as-pure@7.27.1': @@ -7157,7 +7191,7 @@ snapshots: dependencies: '@babel/compat-data': 7.27.2 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.25.0 + browserslist: 4.25.2 lru-cache: 5.1.1 semver: 6.3.1 @@ -7290,14 +7324,14 @@ snapshots: '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 - '@babel/parser': 7.28.4 + '@babel/parser': 7.28.3 '@babel/types': 7.28.4 '@babel/traverse@7.27.4': dependencies: '@babel/code-frame': 7.27.1 '@babel/generator': 7.28.3 - '@babel/parser': 7.28.4 + '@babel/parser': 7.28.3 '@babel/template': 7.27.2 '@babel/types': 7.28.4 debug: 4.4.1(supports-color@5.5.0) @@ -8034,7 +8068,7 @@ snapshots: dependencies: lodash.camelcase: 4.3.0 long: 5.3.2 - protobufjs: 7.5.0 + protobufjs: 7.5.3 yargs: 17.7.2 '@hutson/parse-repository-url@5.0.0': {} @@ -8070,26 +8104,41 @@ snapshots: '@jridgewell/gen-mapping@0.3.12': dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/remapping@2.3.5': dependencies: - '@jridgewell/gen-mapping': 0.3.12 - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.30 '@jridgewell/resolve-uri@3.1.2': {} + '@jridgewell/source-map@0.3.11': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/source-map@0.3.6': dependencies: - '@jridgewell/gen-mapping': 0.3.12 - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.30 '@jridgewell/sourcemap-codec@1.5.0': {} '@jridgewell/sourcemap-codec@1.5.5': {} '@jridgewell/trace-mapping@0.3.29': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@jridgewell/trace-mapping@0.3.30': dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 @@ -8167,12 +8216,12 @@ snapshots: uuid: 11.1.0 write-file-atomic: 6.0.0 - '@netlify/functions@3.1.10(encoding@0.1.13)(rollup@4.52.0)': + '@netlify/functions@3.1.10(encoding@0.1.13)(rollup@4.52.2)': dependencies: '@netlify/blobs': 9.1.2 '@netlify/dev-utils': 2.2.0 '@netlify/serverless-functions-api': 1.41.2 - '@netlify/zip-it-and-ship-it': 12.1.1(encoding@0.1.13)(rollup@4.52.0) + '@netlify/zip-it-and-ship-it': 12.1.1(encoding@0.1.13)(rollup@4.52.2) cron-parser: 4.9.0 decache: 4.6.2 extract-zip: 2.0.1 @@ -8192,13 +8241,13 @@ snapshots: '@netlify/serverless-functions-api@1.41.2': {} - '@netlify/zip-it-and-ship-it@12.1.1(encoding@0.1.13)(rollup@4.52.0)': + '@netlify/zip-it-and-ship-it@12.1.1(encoding@0.1.13)(rollup@4.52.2)': dependencies: - '@babel/parser': 7.28.4 + '@babel/parser': 7.28.3 '@babel/types': 7.27.3 '@netlify/binary-info': 1.0.0 '@netlify/serverless-functions-api': 1.41.2 - '@vercel/nft': 0.29.3(encoding@0.1.13)(rollup@4.52.0) + '@vercel/nft': 0.29.3(encoding@0.1.13)(rollup@4.52.2) archiver: 7.0.1 common-path-prefix: 3.0.0 copy-file: 11.0.0 @@ -8276,11 +8325,11 @@ snapshots: '@nuxt/devalue@2.0.2': {} - '@nuxt/devtools-kit@2.6.2(magicast@0.3.5)(vite@7.1.6(@types/node@22.18.6)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1))': + '@nuxt/devtools-kit@2.6.2(magicast@0.3.5)(vite@7.1.6(@types/node@24.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1))': dependencies: - '@nuxt/kit': 3.17.6(magicast@0.3.5) + '@nuxt/kit': 3.18.1(magicast@0.3.5) execa: 8.0.1 - vite: 7.1.6(@types/node@22.18.6)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1) + vite: 7.1.6(@types/node@24.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1) transitivePeerDependencies: - magicast @@ -8295,12 +8344,12 @@ snapshots: prompts: 2.4.2 semver: 7.7.2 - '@nuxt/devtools@2.6.2(vite@7.1.6(@types/node@22.18.6)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1))(vue@3.5.18(typescript@5.9.2))': + '@nuxt/devtools@2.6.2(vite@7.1.6(@types/node@24.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1))(vue@3.5.18(typescript@5.9.2))': dependencies: - '@nuxt/devtools-kit': 2.6.2(magicast@0.3.5)(vite@7.1.6(@types/node@22.18.6)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1)) + '@nuxt/devtools-kit': 2.6.2(magicast@0.3.5)(vite@7.1.6(@types/node@24.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1)) '@nuxt/devtools-wizard': 2.6.2 '@nuxt/kit': 3.17.6(magicast@0.3.5) - '@vue/devtools-core': 7.7.7(vite@7.1.6(@types/node@22.18.6)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1))(vue@3.5.18(typescript@5.9.2)) + '@vue/devtools-core': 7.7.7(vite@7.1.6(@types/node@24.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1))(vue@3.5.18(typescript@5.9.2)) '@vue/devtools-kit': 7.7.7 birpc: 2.5.0 consola: 3.4.2 @@ -8325,9 +8374,9 @@ snapshots: sirv: 3.0.1 structured-clone-es: 1.0.0 tinyglobby: 0.2.15 - vite: 7.1.6(@types/node@22.18.6)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1) - vite-plugin-inspect: 11.3.0(@nuxt/kit@3.17.6(magicast@0.3.5))(vite@7.1.6(@types/node@22.18.6)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1)) - vite-plugin-vue-tracer: 1.0.0(vite@7.1.6(@types/node@22.18.6)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1))(vue@3.5.18(typescript@5.9.2)) + vite: 7.1.6(@types/node@24.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1) + vite-plugin-inspect: 11.3.0(@nuxt/kit@3.17.6(magicast@0.3.5))(vite@7.1.6(@types/node@24.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1)) + vite-plugin-vue-tracer: 1.0.0(vite@7.1.6(@types/node@24.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1))(vue@3.5.18(typescript@5.9.2)) which: 5.0.0 ws: 8.18.3 transitivePeerDependencies: @@ -8363,9 +8412,36 @@ snapshots: transitivePeerDependencies: - magicast + '@nuxt/kit@3.18.1(magicast@0.3.5)': + dependencies: + c12: 3.2.0(magicast@0.3.5) + consola: 3.4.2 + defu: 6.1.4 + destr: 2.0.5 + errx: 0.1.0 + exsolve: 1.0.7 + ignore: 7.0.5 + jiti: 2.5.1 + klona: 2.0.6 + knitwork: 1.2.0 + mlly: 1.8.0 + ohash: 2.0.11 + pathe: 2.0.3 + pkg-types: 2.2.0 + scule: 1.3.0 + semver: 7.7.2 + std-env: 3.9.0 + tinyglobby: 0.2.15 + ufo: 1.6.1 + unctx: 2.4.1 + unimport: 5.2.0 + untyped: 2.0.0 + transitivePeerDependencies: + - magicast + '@nuxt/schema@3.17.6': dependencies: - '@vue/shared': 3.5.19 + '@vue/shared': 3.5.18 consola: 3.4.2 defu: 6.1.4 pathe: 2.0.3 @@ -8388,17 +8464,17 @@ snapshots: transitivePeerDependencies: - magicast - '@nuxt/vite-builder@3.17.6(@types/node@22.18.6)(lightningcss@1.29.3)(magicast@0.3.5)(meow@13.2.0)(rolldown@1.0.0-beta.10-commit.87188ed)(rollup@4.52.0)(terser@5.40.0)(typescript@5.9.2)(vue-tsc@2.2.10(typescript@5.9.2))(vue@3.5.18(typescript@5.9.2))(yaml@2.8.1)': + '@nuxt/vite-builder@3.17.6(@types/node@24.3.0)(lightningcss@1.29.3)(magicast@0.3.5)(meow@13.2.0)(rolldown@1.0.0-beta.10-commit.87188ed)(rollup@4.52.2)(terser@5.43.1)(typescript@5.9.2)(vue-tsc@2.2.10(typescript@5.9.2))(vue@3.5.18(typescript@5.9.2))(yaml@2.8.1)': dependencies: '@nuxt/kit': 3.17.6(magicast@0.3.5) - '@rollup/plugin-replace': 6.0.2(rollup@4.52.0) - '@vitejs/plugin-vue': 5.2.4(vite@6.3.6(@types/node@22.18.6)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1))(vue@3.5.18(typescript@5.9.2)) - '@vitejs/plugin-vue-jsx': 4.2.0(vite@6.3.6(@types/node@22.18.6)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1))(vue@3.5.18(typescript@5.9.2)) + '@rollup/plugin-replace': 6.0.2(rollup@4.52.2) + '@vitejs/plugin-vue': 5.2.4(vite@6.3.5(@types/node@24.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1))(vue@3.5.18(typescript@5.9.2)) + '@vitejs/plugin-vue-jsx': 4.2.0(vite@6.3.5(@types/node@24.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1))(vue@3.5.18(typescript@5.9.2)) autoprefixer: 10.4.21(postcss@8.5.6) consola: 3.4.2 cssnano: 7.0.7(postcss@8.5.6) defu: 6.1.4 - esbuild: 0.25.9 + esbuild: 0.25.5 escape-string-regexp: 5.0.0 exsolve: 1.0.7 externality: 1.0.2 @@ -8414,13 +8490,13 @@ snapshots: perfect-debounce: 1.0.0 pkg-types: 2.2.0 postcss: 8.5.6 - rollup-plugin-visualizer: 6.0.3(rolldown@1.0.0-beta.10-commit.87188ed)(rollup@4.52.0) + rollup-plugin-visualizer: 6.0.3(rolldown@1.0.0-beta.10-commit.87188ed)(rollup@4.52.2) std-env: 3.9.0 ufo: 1.6.1 unenv: 2.0.0-rc.18 - vite: 6.3.6(@types/node@22.18.6)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1) - vite-node: 3.2.4(@types/node@22.18.6)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1) - vite-plugin-checker: 0.9.3(meow@13.2.0)(typescript@5.9.2)(vite@6.3.6(@types/node@22.18.6)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1))(vue-tsc@2.2.10(typescript@5.9.2)) + vite: 6.3.5(@types/node@24.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@24.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1) + vite-plugin-checker: 0.9.3(meow@13.2.0)(typescript@5.9.2)(vite@6.3.5(@types/node@24.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1))(vue-tsc@2.2.10(typescript@5.9.2)) vue: 3.5.18(typescript@5.9.2) vue-bundle-renderer: 2.1.1 transitivePeerDependencies: @@ -8505,7 +8581,7 @@ snapshots: '@oxc-project/types@0.75.1': {} - '@oxc-project/types@0.89.0': {} + '@oxc-project/types@0.92.0': {} '@parcel/watcher-android-arm64@2.5.1': optional: true @@ -8586,13 +8662,13 @@ snapshots: '@pinia/colada@0.17.5(pinia@3.0.3(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2)))(vue@3.5.21(typescript@5.9.2))': dependencies: - '@vue/devtools-api': 8.0.1 + '@vue/devtools-api': 8.0.2 pinia: 3.0.3(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2)) vue: 3.5.21(typescript@5.9.2) - '@pinia/nuxt@0.11.1(magicast@0.3.5)(pinia@3.0.3(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2)))': + '@pinia/nuxt@0.11.2(magicast@0.3.5)(pinia@3.0.3(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2)))': dependencies: - '@nuxt/kit': 3.17.6(magicast@0.3.5) + '@nuxt/kit': 3.18.1(magicast@0.3.5) pinia: 3.0.3(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2)) transitivePeerDependencies: - magicast @@ -8646,64 +8722,64 @@ snapshots: dependencies: quansync: 0.2.11 - '@rolldown/binding-android-arm64@1.0.0-beta.38': + '@rolldown/binding-android-arm64@1.0.0-beta.40': optional: true '@rolldown/binding-darwin-arm64@1.0.0-beta.10-commit.87188ed': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-beta.38': + '@rolldown/binding-darwin-arm64@1.0.0-beta.40': optional: true '@rolldown/binding-darwin-x64@1.0.0-beta.10-commit.87188ed': optional: true - '@rolldown/binding-darwin-x64@1.0.0-beta.38': + '@rolldown/binding-darwin-x64@1.0.0-beta.40': optional: true '@rolldown/binding-freebsd-x64@1.0.0-beta.10-commit.87188ed': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-beta.38': + '@rolldown/binding-freebsd-x64@1.0.0-beta.40': optional: true '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.10-commit.87188ed': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.38': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.40': optional: true '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.10-commit.87188ed': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.38': + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.40': optional: true '@rolldown/binding-linux-arm64-musl@1.0.0-beta.10-commit.87188ed': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.38': + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.40': optional: true '@rolldown/binding-linux-x64-gnu@1.0.0-beta.10-commit.87188ed': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.38': + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.40': optional: true '@rolldown/binding-linux-x64-musl@1.0.0-beta.10-commit.87188ed': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-beta.38': + '@rolldown/binding-linux-x64-musl@1.0.0-beta.40': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-beta.38': + '@rolldown/binding-openharmony-arm64@1.0.0-beta.40': optional: true '@rolldown/binding-wasm32-wasi@1.0.0-beta.10-commit.87188ed': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-beta.38': + '@rolldown/binding-wasm32-wasi@1.0.0-beta.40': dependencies: '@napi-rs/wasm-runtime': 1.0.5 optional: true @@ -8711,34 +8787,37 @@ snapshots: '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.10-commit.87188ed': optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.38': + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.40': optional: true '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.10-commit.87188ed': optional: true - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.38': + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.40': optional: true '@rolldown/binding-win32-x64-msvc@1.0.0-beta.10-commit.87188ed': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.38': + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.40': optional: true - '@rolldown/pluginutils@1.0.0-beta.10-commit.87188ed': {} + '@rolldown/pluginutils@1.0.0-beta.10-commit.87188ed': + optional: true '@rolldown/pluginutils@1.0.0-beta.29': {} - '@rolldown/pluginutils@1.0.0-beta.38': {} + '@rolldown/pluginutils@1.0.0-beta.33': {} - '@rollup/plugin-alias@5.1.1(rollup@4.52.0)': + '@rolldown/pluginutils@1.0.0-beta.40': {} + + '@rollup/plugin-alias@5.1.1(rollup@4.52.2)': optionalDependencies: - rollup: 4.52.0 + rollup: 4.52.2 - '@rollup/plugin-commonjs@28.0.6(rollup@4.52.0)': + '@rollup/plugin-commonjs@28.0.6(rollup@4.52.2)': dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.52.0) + '@rollup/pluginutils': 5.1.4(rollup@4.52.2) commondir: 1.0.1 estree-walker: 2.0.2 fdir: 6.5.0(picomatch@4.0.3) @@ -8746,119 +8825,119 @@ snapshots: magic-string: 0.30.19 picomatch: 4.0.3 optionalDependencies: - rollup: 4.52.0 + rollup: 4.52.2 - '@rollup/plugin-inject@5.0.5(rollup@4.52.0)': + '@rollup/plugin-inject@5.0.5(rollup@4.52.2)': dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.52.0) + '@rollup/pluginutils': 5.1.4(rollup@4.52.2) estree-walker: 2.0.2 magic-string: 0.30.19 optionalDependencies: - rollup: 4.52.0 + rollup: 4.52.2 - '@rollup/plugin-json@6.1.0(rollup@4.52.0)': + '@rollup/plugin-json@6.1.0(rollup@4.52.2)': dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.52.0) + '@rollup/pluginutils': 5.1.4(rollup@4.52.2) optionalDependencies: - rollup: 4.52.0 + rollup: 4.52.2 - '@rollup/plugin-node-resolve@16.0.1(rollup@4.52.0)': + '@rollup/plugin-node-resolve@16.0.1(rollup@4.52.2)': dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.52.0) + '@rollup/pluginutils': 5.1.4(rollup@4.52.2) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 resolve: 1.22.10 optionalDependencies: - rollup: 4.52.0 + rollup: 4.52.2 - '@rollup/plugin-replace@6.0.2(rollup@4.52.0)': + '@rollup/plugin-replace@6.0.2(rollup@4.52.2)': dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.52.0) + '@rollup/pluginutils': 5.1.4(rollup@4.52.2) magic-string: 0.30.19 optionalDependencies: - rollup: 4.52.0 + rollup: 4.52.2 - '@rollup/plugin-terser@0.4.4(rollup@4.52.0)': + '@rollup/plugin-terser@0.4.4(rollup@4.52.2)': dependencies: serialize-javascript: 6.0.2 smob: 1.5.0 terser: 5.40.0 optionalDependencies: - rollup: 4.52.0 + rollup: 4.52.2 - '@rollup/pluginutils@5.1.4(rollup@4.52.0)': + '@rollup/pluginutils@5.1.4(rollup@4.52.2)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.3 optionalDependencies: - rollup: 4.52.0 + rollup: 4.52.2 - '@rollup/rollup-android-arm-eabi@4.52.0': + '@rollup/rollup-android-arm-eabi@4.52.2': optional: true - '@rollup/rollup-android-arm64@4.52.0': + '@rollup/rollup-android-arm64@4.52.2': optional: true - '@rollup/rollup-darwin-arm64@4.52.0': + '@rollup/rollup-darwin-arm64@4.52.2': optional: true - '@rollup/rollup-darwin-x64@4.52.0': + '@rollup/rollup-darwin-x64@4.52.2': optional: true - '@rollup/rollup-freebsd-arm64@4.52.0': + '@rollup/rollup-freebsd-arm64@4.52.2': optional: true - '@rollup/rollup-freebsd-x64@4.52.0': + '@rollup/rollup-freebsd-x64@4.52.2': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.52.0': + '@rollup/rollup-linux-arm-gnueabihf@4.52.2': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.52.0': + '@rollup/rollup-linux-arm-musleabihf@4.52.2': optional: true - '@rollup/rollup-linux-arm64-gnu@4.52.0': + '@rollup/rollup-linux-arm64-gnu@4.52.2': optional: true - '@rollup/rollup-linux-arm64-musl@4.52.0': + '@rollup/rollup-linux-arm64-musl@4.52.2': optional: true - '@rollup/rollup-linux-loong64-gnu@4.52.0': + '@rollup/rollup-linux-loong64-gnu@4.52.2': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.52.0': + '@rollup/rollup-linux-ppc64-gnu@4.52.2': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.52.0': + '@rollup/rollup-linux-riscv64-gnu@4.52.2': optional: true - '@rollup/rollup-linux-riscv64-musl@4.52.0': + '@rollup/rollup-linux-riscv64-musl@4.52.2': optional: true - '@rollup/rollup-linux-s390x-gnu@4.52.0': + '@rollup/rollup-linux-s390x-gnu@4.52.2': optional: true - '@rollup/rollup-linux-x64-gnu@4.52.0': + '@rollup/rollup-linux-x64-gnu@4.52.2': optional: true - '@rollup/rollup-linux-x64-musl@4.52.0': + '@rollup/rollup-linux-x64-musl@4.52.2': optional: true - '@rollup/rollup-openharmony-arm64@4.52.0': + '@rollup/rollup-openharmony-arm64@4.52.2': optional: true - '@rollup/rollup-win32-arm64-msvc@4.52.0': + '@rollup/rollup-win32-arm64-msvc@4.52.2': optional: true - '@rollup/rollup-win32-ia32-msvc@4.52.0': + '@rollup/rollup-win32-ia32-msvc@4.52.2': optional: true - '@rollup/rollup-win32-x64-gnu@4.52.0': + '@rollup/rollup-win32-x64-gnu@4.52.2': optional: true - '@rollup/rollup-win32-x64-msvc@4.52.0': + '@rollup/rollup-win32-x64-msvc@4.52.2': optional: true '@sec-ant/readable-stream@0.4.1': {} @@ -9073,7 +9152,7 @@ snapshots: '@types/ms@2.1.0': {} - '@types/node@20.19.4': + '@types/node@20.19.11': dependencies: undici-types: 6.21.0 @@ -9081,6 +9160,11 @@ snapshots: dependencies: undici-types: 6.21.0 + '@types/node@24.3.0': + dependencies: + undici-types: 7.10.0 + optional: true + '@types/normalize-package-data@2.4.4': {} '@types/parse-path@7.1.0': @@ -9110,7 +9194,7 @@ snapshots: dependencies: '@typescript-eslint/tsconfig-utils': 8.33.0(typescript@5.9.2) '@typescript-eslint/types': 8.33.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.3 transitivePeerDependencies: - supports-color - typescript @@ -9127,7 +9211,7 @@ snapshots: '@typescript-eslint/tsconfig-utils': 8.33.0(typescript@5.9.2) '@typescript-eslint/types': 8.33.0 '@typescript-eslint/visitor-keys': 8.33.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.3 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 @@ -9144,7 +9228,7 @@ snapshots: '@typescript/vfs@1.6.1(typescript@5.9.2)': dependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.3 typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -9157,10 +9241,10 @@ snapshots: unhead: 2.0.11 vue: 3.5.18(typescript@5.9.2) - '@vercel/nft@0.29.3(encoding@0.1.13)(rollup@4.52.0)': + '@vercel/nft@0.29.3(encoding@0.1.13)(rollup@4.52.2)': dependencies: '@mapbox/node-pre-gyp': 2.0.0(encoding@0.1.13) - '@rollup/pluginutils': 5.1.4(rollup@4.52.0) + '@rollup/pluginutils': 5.1.4(rollup@4.52.2) acorn: 8.15.0 acorn-import-attributes: 1.9.5(acorn@8.15.0) async-sema: 3.1.1 @@ -9176,10 +9260,10 @@ snapshots: - rollup - supports-color - '@vercel/nft@0.29.4(encoding@0.1.13)(rollup@4.52.0)': + '@vercel/nft@0.29.4(encoding@0.1.13)(rollup@4.52.2)': dependencies: '@mapbox/node-pre-gyp': 2.0.0(encoding@0.1.13) - '@rollup/pluginutils': 5.1.4(rollup@4.52.0) + '@rollup/pluginutils': 5.1.4(rollup@4.52.2) acorn: 8.15.0 acorn-import-attributes: 1.9.5(acorn@8.15.0) async-sema: 3.1.1 @@ -9195,31 +9279,31 @@ snapshots: - rollup - supports-color - '@vitejs/plugin-vue-jsx@4.2.0(vite@6.3.6(@types/node@22.18.6)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1))(vue@3.5.18(typescript@5.9.2))': + '@vitejs/plugin-vue-jsx@4.2.0(vite@6.3.5(@types/node@24.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1))(vue@3.5.18(typescript@5.9.2))': dependencies: '@babel/core': 7.27.4 '@babel/plugin-transform-typescript': 7.27.1(@babel/core@7.27.4) - '@rolldown/pluginutils': 1.0.0-beta.10-commit.87188ed + '@rolldown/pluginutils': 1.0.0-beta.33 '@vue/babel-plugin-jsx': 1.4.0(@babel/core@7.27.4) - vite: 6.3.6(@types/node@22.18.6)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1) + vite: 6.3.5(@types/node@24.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1) vue: 3.5.18(typescript@5.9.2) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@5.2.4(vite@5.4.20(@types/node@22.18.6)(lightningcss@1.29.3)(terser@5.40.0))(vue@3.5.21(typescript@5.9.2))': + '@vitejs/plugin-vue@5.2.4(vite@5.4.19(@types/node@22.18.6)(lightningcss@1.29.3)(terser@5.43.1))(vue@3.5.21(typescript@5.9.2))': dependencies: - vite: 5.4.20(@types/node@22.18.6)(lightningcss@1.29.3)(terser@5.40.0) + vite: 5.4.19(@types/node@22.18.6)(lightningcss@1.29.3)(terser@5.43.1) vue: 3.5.21(typescript@5.9.2) - '@vitejs/plugin-vue@5.2.4(vite@6.3.6(@types/node@22.18.6)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1))(vue@3.5.18(typescript@5.9.2))': + '@vitejs/plugin-vue@5.2.4(vite@6.3.5(@types/node@24.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1))(vue@3.5.18(typescript@5.9.2))': dependencies: - vite: 6.3.6(@types/node@22.18.6)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1) + vite: 6.3.5(@types/node@24.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1) vue: 3.5.18(typescript@5.9.2) - '@vitejs/plugin-vue@6.0.1(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2))': + '@vitejs/plugin-vue@6.0.1(vite@7.1.6(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2))': dependencies: '@rolldown/pluginutils': 1.0.0-beta.29 - vite: 7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1) + vite: 7.1.6(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1) vue: 3.5.21(typescript@5.9.2) '@vitest/coverage-v8@3.2.4(vitest@3.2.4)': @@ -9237,7 +9321,7 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.6)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.6)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -9249,13 +9333,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1))': + '@vitest/mocker@3.2.4(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.19 optionalDependencies: - vite: 7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1) + vite: 7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1) '@vitest/pretty-format@3.2.4': dependencies: @@ -9286,7 +9370,7 @@ snapshots: sirv: 3.0.1 tinyglobby: 0.2.15 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.6)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.6)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1) '@vitest/utils@3.2.4': dependencies: @@ -9338,7 +9422,7 @@ snapshots: '@babel/types': 7.28.4 '@vue/babel-helper-vue-transform-on': 1.4.0 '@vue/babel-plugin-resolve-type': 1.4.0(@babel/core@7.27.4) - '@vue/shared': 3.5.21 + '@vue/shared': 3.5.18 optionalDependencies: '@babel/core': 7.27.4 transitivePeerDependencies: @@ -9350,14 +9434,14 @@ snapshots: '@babel/core': 7.27.4 '@babel/helper-module-imports': 7.27.1 '@babel/helper-plugin-utils': 7.27.1 - '@babel/parser': 7.28.4 + '@babel/parser': 7.28.3 '@vue/compiler-sfc': 3.5.21 transitivePeerDependencies: - supports-color '@vue/compiler-core@3.5.18': dependencies: - '@babel/parser': 7.28.3 + '@babel/parser': 7.28.0 '@vue/shared': 3.5.18 entities: 4.5.0 estree-walker: 2.0.2 @@ -9401,7 +9485,7 @@ snapshots: '@vue/compiler-ssr': 3.5.21 '@vue/shared': 3.5.21 estree-walker: 2.0.2 - magic-string: 0.30.18 + magic-string: 0.30.19 postcss: 8.5.6 source-map-js: 1.2.1 @@ -9426,30 +9510,30 @@ snapshots: dependencies: '@vue/devtools-kit': 7.7.7 - '@vue/devtools-api@8.0.1': + '@vue/devtools-api@8.0.2': dependencies: - '@vue/devtools-kit': 8.0.1 + '@vue/devtools-kit': 8.0.2 - '@vue/devtools-core@7.7.7(vite@7.1.6(@types/node@22.18.6)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1))(vue@3.5.18(typescript@5.9.2))': + '@vue/devtools-core@7.7.7(vite@7.1.6(@types/node@24.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1))(vue@3.5.18(typescript@5.9.2))': dependencies: '@vue/devtools-kit': 7.7.7 '@vue/devtools-shared': 7.7.7 mitt: 3.0.1 nanoid: 5.1.5 pathe: 2.0.3 - vite-hot-client: 2.1.0(vite@7.1.6(@types/node@22.18.6)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1)) + vite-hot-client: 2.1.0(vite@7.1.6(@types/node@24.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1)) vue: 3.5.18(typescript@5.9.2) transitivePeerDependencies: - vite - '@vue/devtools-core@8.0.2(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2))': + '@vue/devtools-core@8.0.2(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2))': dependencies: '@vue/devtools-kit': 8.0.2 '@vue/devtools-shared': 8.0.2 mitt: 3.0.1 nanoid: 5.1.5 pathe: 2.0.3 - vite-hot-client: 2.1.0(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1)) + vite-hot-client: 2.1.0(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1)) vue: 3.5.21(typescript@5.9.2) transitivePeerDependencies: - vite @@ -9464,16 +9548,6 @@ snapshots: speakingurl: 14.0.1 superjson: 2.2.2 - '@vue/devtools-kit@8.0.1': - dependencies: - '@vue/devtools-shared': 8.0.1 - birpc: 2.5.0 - hookable: 5.5.3 - mitt: 3.0.1 - perfect-debounce: 1.0.0 - speakingurl: 14.0.1 - superjson: 2.2.2 - '@vue/devtools-kit@8.0.2': dependencies: '@vue/devtools-shared': 8.0.2 @@ -9488,10 +9562,6 @@ snapshots: dependencies: rfdc: 1.4.1 - '@vue/devtools-shared@8.0.1': - dependencies: - rfdc: 1.4.1 - '@vue/devtools-shared@8.0.2': dependencies: rfdc: 1.4.1 @@ -9513,9 +9583,9 @@ snapshots: '@vue/language-core@3.0.7(typescript@5.9.2)': dependencies: '@volar/language-core': 2.4.23 - '@vue/compiler-dom': 3.5.21 + '@vue/compiler-dom': 3.5.18 '@vue/compiler-vue2': 2.7.16 - '@vue/shared': 3.5.21 + '@vue/shared': 3.5.18 alien-signals: 2.0.5 muggle-string: 0.4.1 path-browserify: 1.0.1 @@ -9569,8 +9639,6 @@ snapshots: '@vue/shared@3.5.18': {} - '@vue/shared@3.5.19': {} - '@vue/shared@3.5.21': {} '@vue/test-utils@2.4.6': @@ -9840,7 +9908,7 @@ snapshots: ast-kit@2.1.2: dependencies: - '@babel/parser': 7.28.4 + '@babel/parser': 7.28.3 pathe: 2.0.3 ast-module-types@6.0.1: {} @@ -9862,7 +9930,7 @@ snapshots: autoprefixer@10.4.21(postcss@8.5.6): dependencies: - browserslist: 4.25.0 + browserslist: 4.25.2 caniuse-lite: 1.0.30001720 fraction.js: 4.3.7 normalize-range: 0.1.2 @@ -9925,12 +9993,12 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.25.0: + browserslist@4.25.2: dependencies: - caniuse-lite: 1.0.30001720 - electron-to-chromium: 1.5.161 + caniuse-lite: 1.0.30001735 + electron-to-chromium: 1.5.202 node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.25.0) + update-browserslist-db: 1.1.3(browserslist@4.25.2) buffer-crc32@0.2.13: {} @@ -9970,6 +10038,23 @@ snapshots: optionalDependencies: magicast: 0.3.5 + c12@3.2.0(magicast@0.3.5): + dependencies: + chokidar: 4.0.3 + confbox: 0.2.2 + defu: 6.1.4 + dotenv: 17.2.1 + exsolve: 1.0.7 + giget: 2.0.0 + jiti: 2.5.1 + ohash: 2.0.11 + pathe: 2.0.3 + perfect-debounce: 1.0.0 + pkg-types: 2.2.0 + rc9: 2.1.2 + optionalDependencies: + magicast: 0.3.5 + cac@6.7.14: {} call-bind-apply-helpers@1.0.2: @@ -9986,13 +10071,15 @@ snapshots: caniuse-api@3.0.0: dependencies: - browserslist: 4.25.0 - caniuse-lite: 1.0.30001720 + browserslist: 4.25.2 + caniuse-lite: 1.0.30001735 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 caniuse-lite@1.0.30001720: {} + caniuse-lite@1.0.30001735: {} + ccount@2.0.1: {} chai@5.2.0: @@ -10051,10 +10138,10 @@ snapshots: dependencies: restore-cursor: 5.1.0 - cli-truncate@4.0.0: + cli-truncate@5.1.0: dependencies: - slice-ansi: 5.0.0 - string-width: 7.2.0 + slice-ansi: 7.1.0 + string-width: 8.1.0 clipboardy@4.0.0: dependencies: @@ -10334,7 +10421,7 @@ snapshots: cssnano-preset-default@7.0.7(postcss@8.5.6): dependencies: - browserslist: 4.25.0 + browserslist: 4.25.2 css-declaration-sorter: 7.2.0(postcss@8.5.6) cssnano-utils: 5.0.1(postcss@8.5.6) postcss: 8.5.6 @@ -10537,6 +10624,8 @@ snapshots: dotenv@16.5.0: {} + dotenv@17.2.1: {} + dts-resolver@2.1.2: {} dunder-proto@1.0.1: @@ -10558,7 +10647,7 @@ snapshots: ee-first@1.1.1: {} - electron-to-chromium@1.5.161: {} + electron-to-chromium@1.5.202: {} emoji-regex-xs@1.0.0: {} @@ -10585,7 +10674,7 @@ snapshots: dependencies: once: 1.4.0 - enhanced-resolve@5.18.1: + enhanced-resolve@5.18.3: dependencies: graceful-fs: 4.2.11 tapable: 2.2.2 @@ -10865,14 +10954,14 @@ snapshots: externality@1.0.2: dependencies: - enhanced-resolve: 5.18.1 + enhanced-resolve: 5.18.3 mlly: 1.8.0 pathe: 1.1.2 ufo: 1.6.1 extract-zip@2.0.1: dependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.3 get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -10912,6 +11001,10 @@ snapshots: dependencies: pend: 1.2.0 + fdir@6.4.6(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + fdir@6.5.0(picomatch@4.0.3): optionalDependencies: picomatch: 4.0.3 @@ -11203,7 +11296,7 @@ snapshots: happy-dom@18.0.1: dependencies: - '@types/node': 20.19.4 + '@types/node': 20.19.11 '@types/whatwg-mimetype': 3.0.2 whatwg-mimetype: 3.0.0 @@ -11262,7 +11355,7 @@ snapshots: https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.3 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -11318,7 +11411,7 @@ snapshots: dependencies: '@ioredis/commands': 1.2.0 cluster-key-slot: 1.1.2 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.3 denque: 2.1.0 lodash.defaults: 4.2.0 lodash.isarguments: 3.1.0 @@ -11360,8 +11453,6 @@ snapshots: is-fullwidth-code-point@3.0.0: {} - is-fullwidth-code-point@4.0.0: {} - is-fullwidth-code-point@5.0.0: dependencies: get-east-asian-width: 1.3.0 @@ -11628,7 +11719,7 @@ snapshots: commander: 14.0.0 debug: 4.4.1(supports-color@5.5.0) lilconfig: 3.1.3 - listr2: 9.0.3 + listr2: 9.0.4 micromatch: 4.0.8 nano-spawn: 1.0.2 pidtree: 0.6.0 @@ -11658,9 +11749,9 @@ snapshots: untun: 0.1.3 uqr: 0.1.2 - listr2@9.0.3: + listr2@9.0.4: dependencies: - cli-truncate: 4.0.0 + cli-truncate: 5.1.0 colorette: 2.0.20 eventemitter3: 5.0.1 log-update: 6.1.0 @@ -11753,10 +11844,6 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 - magic-string@0.30.18: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - magic-string@0.30.19: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -12221,15 +12308,15 @@ snapshots: nitropack@2.11.13(@netlify/blobs@8.2.0)(encoding@0.1.13)(rolldown@1.0.0-beta.10-commit.87188ed): dependencies: '@cloudflare/kv-asset-handler': 0.4.0 - '@netlify/functions': 3.1.10(encoding@0.1.13)(rollup@4.52.0) - '@rollup/plugin-alias': 5.1.1(rollup@4.52.0) - '@rollup/plugin-commonjs': 28.0.6(rollup@4.52.0) - '@rollup/plugin-inject': 5.0.5(rollup@4.52.0) - '@rollup/plugin-json': 6.1.0(rollup@4.52.0) - '@rollup/plugin-node-resolve': 16.0.1(rollup@4.52.0) - '@rollup/plugin-replace': 6.0.2(rollup@4.52.0) - '@rollup/plugin-terser': 0.4.4(rollup@4.52.0) - '@vercel/nft': 0.29.4(encoding@0.1.13)(rollup@4.52.0) + '@netlify/functions': 3.1.10(encoding@0.1.13)(rollup@4.52.2) + '@rollup/plugin-alias': 5.1.1(rollup@4.52.2) + '@rollup/plugin-commonjs': 28.0.6(rollup@4.52.2) + '@rollup/plugin-inject': 5.0.5(rollup@4.52.2) + '@rollup/plugin-json': 6.1.0(rollup@4.52.2) + '@rollup/plugin-node-resolve': 16.0.1(rollup@4.52.2) + '@rollup/plugin-replace': 6.0.2(rollup@4.52.2) + '@rollup/plugin-terser': 0.4.4(rollup@4.52.2) + '@vercel/nft': 0.29.4(encoding@0.1.13)(rollup@4.52.2) archiver: 7.0.1 c12: 3.0.4(magicast@0.3.5) chokidar: 4.0.3 @@ -12244,7 +12331,7 @@ snapshots: defu: 6.1.4 destr: 2.0.5 dot-prop: 9.0.0 - esbuild: 0.25.9 + esbuild: 0.25.5 escape-string-regexp: 5.0.0 etag: 1.8.1 exsolve: 1.0.7 @@ -12271,8 +12358,8 @@ snapshots: pkg-types: 2.2.0 pretty-bytes: 6.1.1 radix3: 1.1.2 - rollup: 4.52.0 - rollup-plugin-visualizer: 6.0.3(rolldown@1.0.0-beta.10-commit.87188ed)(rollup@4.52.0) + rollup: 4.52.2 + rollup-plugin-visualizer: 6.0.3(rolldown@1.0.0-beta.10-commit.87188ed)(rollup@4.52.2) scule: 1.3.0 semver: 7.7.2 serve-placeholder: 2.0.2 @@ -12346,7 +12433,7 @@ snapshots: node-source-walk@7.0.1: dependencies: - '@babel/parser': 7.28.4 + '@babel/parser': 7.28.3 nodemon@3.1.10: dependencies: @@ -12402,15 +12489,15 @@ snapshots: dependencies: boolbase: 1.0.0 - nuxt@3.17.6(@netlify/blobs@8.2.0)(@parcel/watcher@2.5.1)(@types/node@22.18.6)(@vue/compiler-sfc@3.5.21)(db0@0.3.2)(encoding@0.1.13)(ioredis@5.6.1)(lightningcss@1.29.3)(magicast@0.3.5)(meow@13.2.0)(rolldown@1.0.0-beta.10-commit.87188ed)(rollup@4.52.0)(terser@5.40.0)(typescript@5.9.2)(vite@7.1.6(@types/node@22.18.6)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1))(vue-tsc@2.2.10(typescript@5.9.2))(yaml@2.8.1): + nuxt@3.17.6(@netlify/blobs@8.2.0)(@parcel/watcher@2.5.1)(@types/node@24.3.0)(@vue/compiler-sfc@3.5.21)(db0@0.3.2)(encoding@0.1.13)(ioredis@5.6.1)(lightningcss@1.29.3)(magicast@0.3.5)(meow@13.2.0)(rolldown@1.0.0-beta.10-commit.87188ed)(rollup@4.52.2)(terser@5.43.1)(typescript@5.9.2)(vite@7.1.6(@types/node@24.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1))(vue-tsc@2.2.10(typescript@5.9.2))(yaml@2.8.1): dependencies: '@nuxt/cli': 3.25.1(magicast@0.3.5) '@nuxt/devalue': 2.0.2 - '@nuxt/devtools': 2.6.2(vite@7.1.6(@types/node@22.18.6)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1))(vue@3.5.18(typescript@5.9.2)) + '@nuxt/devtools': 2.6.2(vite@7.1.6(@types/node@24.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1))(vue@3.5.18(typescript@5.9.2)) '@nuxt/kit': 3.17.6(magicast@0.3.5) '@nuxt/schema': 3.17.6 '@nuxt/telemetry': 2.6.6(magicast@0.3.5) - '@nuxt/vite-builder': 3.17.6(@types/node@22.18.6)(lightningcss@1.29.3)(magicast@0.3.5)(meow@13.2.0)(rolldown@1.0.0-beta.10-commit.87188ed)(rollup@4.52.0)(terser@5.40.0)(typescript@5.9.2)(vue-tsc@2.2.10(typescript@5.9.2))(vue@3.5.18(typescript@5.9.2))(yaml@2.8.1) + '@nuxt/vite-builder': 3.17.6(@types/node@24.3.0)(lightningcss@1.29.3)(magicast@0.3.5)(meow@13.2.0)(rolldown@1.0.0-beta.10-commit.87188ed)(rollup@4.52.2)(terser@5.43.1)(typescript@5.9.2)(vue-tsc@2.2.10(typescript@5.9.2))(vue@3.5.18(typescript@5.9.2))(yaml@2.8.1) '@unhead/vue': 2.0.11(vue@3.5.18(typescript@5.9.2)) '@vue/shared': 3.5.18 c12: 3.0.4(magicast@0.3.5) @@ -12467,7 +12554,7 @@ snapshots: vue-router: 4.5.1(vue@3.5.21(typescript@5.9.2)) optionalDependencies: '@parcel/watcher': 2.5.1 - '@types/node': 22.18.6 + '@types/node': 24.3.0 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -12772,7 +12859,7 @@ snapshots: postcss-colormin@7.0.3(postcss@8.5.6): dependencies: - browserslist: 4.25.0 + browserslist: 4.25.2 caniuse-api: 3.0.0 colord: 2.9.3 postcss: 8.5.6 @@ -12780,7 +12867,7 @@ snapshots: postcss-convert-values@7.0.5(postcss@8.5.6): dependencies: - browserslist: 4.25.0 + browserslist: 4.25.2 postcss: 8.5.6 postcss-value-parser: 4.2.0 @@ -12809,7 +12896,7 @@ snapshots: postcss-merge-rules@7.0.5(postcss@8.5.6): dependencies: - browserslist: 4.25.0 + browserslist: 4.25.2 caniuse-api: 3.0.0 cssnano-utils: 5.0.1(postcss@8.5.6) postcss: 8.5.6 @@ -12829,7 +12916,7 @@ snapshots: postcss-minify-params@7.0.3(postcss@8.5.6): dependencies: - browserslist: 4.25.0 + browserslist: 4.25.2 cssnano-utils: 5.0.1(postcss@8.5.6) postcss: 8.5.6 postcss-value-parser: 4.2.0 @@ -12871,7 +12958,7 @@ snapshots: postcss-normalize-unicode@7.0.3(postcss@8.5.6): dependencies: - browserslist: 4.25.0 + browserslist: 4.25.2 postcss: 8.5.6 postcss-value-parser: 4.2.0 @@ -12893,7 +12980,7 @@ snapshots: postcss-reduce-initial@7.0.3(postcss@8.5.6): dependencies: - browserslist: 4.25.0 + browserslist: 4.25.2 caniuse-api: 3.0.0 postcss: 8.5.6 @@ -12978,7 +13065,7 @@ snapshots: proto-list@1.2.4: {} - protobufjs@7.5.0: + protobufjs@7.5.3: dependencies: '@protobufjs/aspromise': 1.1.2 '@protobufjs/base64': 1.1.2 @@ -13191,7 +13278,7 @@ snapshots: glob: 11.0.0 package-json-from-dist: 1.0.0 - rolldown-plugin-dts@0.16.7(rolldown@1.0.0-beta.38)(typescript@5.9.2)(vue-tsc@3.0.7(typescript@5.9.2)): + rolldown-plugin-dts@0.16.8(rolldown@1.0.0-beta.40)(typescript@5.9.2)(vue-tsc@3.0.7(typescript@5.9.2)): dependencies: '@babel/generator': 7.28.3 '@babel/parser': 7.28.4 @@ -13202,7 +13289,7 @@ snapshots: dts-resolver: 2.1.2 get-tsconfig: 4.10.1 magic-string: 0.30.19 - rolldown: 1.0.0-beta.38 + rolldown: 1.0.0-beta.40 optionalDependencies: typescript: 5.9.2 vue-tsc: 3.0.7(typescript@5.9.2) @@ -13231,28 +13318,28 @@ snapshots: '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.10-commit.87188ed optional: true - rolldown@1.0.0-beta.38: + rolldown@1.0.0-beta.40: dependencies: - '@oxc-project/types': 0.89.0 - '@rolldown/pluginutils': 1.0.0-beta.38 + '@oxc-project/types': 0.92.0 + '@rolldown/pluginutils': 1.0.0-beta.40 ansis: 4.1.0 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-beta.38 - '@rolldown/binding-darwin-arm64': 1.0.0-beta.38 - '@rolldown/binding-darwin-x64': 1.0.0-beta.38 - '@rolldown/binding-freebsd-x64': 1.0.0-beta.38 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.38 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.38 - '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.38 - '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.38 - '@rolldown/binding-linux-x64-musl': 1.0.0-beta.38 - '@rolldown/binding-openharmony-arm64': 1.0.0-beta.38 - '@rolldown/binding-wasm32-wasi': 1.0.0-beta.38 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.38 - '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.38 - '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.38 - - rollup-plugin-visualizer@6.0.3(rolldown@1.0.0-beta.10-commit.87188ed)(rollup@4.52.0): + '@rolldown/binding-android-arm64': 1.0.0-beta.40 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.40 + '@rolldown/binding-darwin-x64': 1.0.0-beta.40 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.40 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.40 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.40 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.40 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.40 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.40 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.40 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.40 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.40 + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.40 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.40 + + rollup-plugin-visualizer@6.0.3(rolldown@1.0.0-beta.10-commit.87188ed)(rollup@4.52.2): dependencies: open: 8.4.2 picomatch: 4.0.3 @@ -13260,34 +13347,34 @@ snapshots: yargs: 17.7.2 optionalDependencies: rolldown: 1.0.0-beta.10-commit.87188ed - rollup: 4.52.0 + rollup: 4.52.2 - rollup@4.52.0: + rollup@4.52.2: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.52.0 - '@rollup/rollup-android-arm64': 4.52.0 - '@rollup/rollup-darwin-arm64': 4.52.0 - '@rollup/rollup-darwin-x64': 4.52.0 - '@rollup/rollup-freebsd-arm64': 4.52.0 - '@rollup/rollup-freebsd-x64': 4.52.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.52.0 - '@rollup/rollup-linux-arm-musleabihf': 4.52.0 - '@rollup/rollup-linux-arm64-gnu': 4.52.0 - '@rollup/rollup-linux-arm64-musl': 4.52.0 - '@rollup/rollup-linux-loong64-gnu': 4.52.0 - '@rollup/rollup-linux-ppc64-gnu': 4.52.0 - '@rollup/rollup-linux-riscv64-gnu': 4.52.0 - '@rollup/rollup-linux-riscv64-musl': 4.52.0 - '@rollup/rollup-linux-s390x-gnu': 4.52.0 - '@rollup/rollup-linux-x64-gnu': 4.52.0 - '@rollup/rollup-linux-x64-musl': 4.52.0 - '@rollup/rollup-openharmony-arm64': 4.52.0 - '@rollup/rollup-win32-arm64-msvc': 4.52.0 - '@rollup/rollup-win32-ia32-msvc': 4.52.0 - '@rollup/rollup-win32-x64-gnu': 4.52.0 - '@rollup/rollup-win32-x64-msvc': 4.52.0 + '@rollup/rollup-android-arm-eabi': 4.52.2 + '@rollup/rollup-android-arm64': 4.52.2 + '@rollup/rollup-darwin-arm64': 4.52.2 + '@rollup/rollup-darwin-x64': 4.52.2 + '@rollup/rollup-freebsd-arm64': 4.52.2 + '@rollup/rollup-freebsd-x64': 4.52.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.2 + '@rollup/rollup-linux-arm-musleabihf': 4.52.2 + '@rollup/rollup-linux-arm64-gnu': 4.52.2 + '@rollup/rollup-linux-arm64-musl': 4.52.2 + '@rollup/rollup-linux-loong64-gnu': 4.52.2 + '@rollup/rollup-linux-ppc64-gnu': 4.52.2 + '@rollup/rollup-linux-riscv64-gnu': 4.52.2 + '@rollup/rollup-linux-riscv64-musl': 4.52.2 + '@rollup/rollup-linux-s390x-gnu': 4.52.2 + '@rollup/rollup-linux-x64-gnu': 4.52.2 + '@rollup/rollup-linux-x64-musl': 4.52.2 + '@rollup/rollup-openharmony-arm64': 4.52.2 + '@rollup/rollup-win32-arm64-msvc': 4.52.2 + '@rollup/rollup-win32-ia32-msvc': 4.52.2 + '@rollup/rollup-win32-x64-gnu': 4.52.2 + '@rollup/rollup-win32-x64-msvc': 4.52.2 fsevents: 2.3.3 run-applescript@7.0.0: {} @@ -13346,7 +13433,7 @@ snapshots: send@1.2.0: dependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.3 encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -13492,11 +13579,6 @@ snapshots: slash@5.1.0: {} - slice-ansi@5.0.0: - dependencies: - ansi-styles: 6.2.1 - is-fullwidth-code-point: 4.0.0 - slice-ansi@7.1.0: dependencies: ansi-styles: 6.2.1 @@ -13576,6 +13658,11 @@ snapshots: get-east-asian-width: 1.3.0 strip-ansi: 7.1.0 + string-width@8.1.0: + dependencies: + get-east-asian-width: 1.3.0 + strip-ansi: 7.1.0 + string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 @@ -13615,7 +13702,7 @@ snapshots: stylehacks@7.0.5(postcss@8.5.6): dependencies: - browserslist: 4.25.0 + browserslist: 4.25.2 postcss: 8.5.6 postcss-selector-parser: 7.1.0 @@ -13678,11 +13765,11 @@ snapshots: terser-webpack-plugin@5.3.14(webpack@5.101.3): dependencies: - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/trace-mapping': 0.3.30 jest-worker: 27.5.1 schema-utils: 4.3.2 serialize-javascript: 6.0.2 - terser: 5.40.0 + terser: 5.43.1 webpack: 5.101.3 terser@5.40.0: @@ -13692,6 +13779,13 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 + terser@5.43.1: + dependencies: + '@jridgewell/source-map': 0.3.11 + acorn: 8.15.0 + commander: 2.20.3 + source-map-support: 0.5.21 + test-exclude@7.0.1: dependencies: '@istanbuljs/schema': 0.1.3 @@ -13714,7 +13808,7 @@ snapshots: tinyglobby@0.2.14: dependencies: - fdir: 6.5.0(picomatch@4.0.3) + fdir: 6.4.6(picomatch@4.0.3) picomatch: 4.0.3 tinyglobby@0.2.15: @@ -13773,8 +13867,8 @@ snapshots: diff: 8.0.2 empathic: 2.0.0 hookable: 5.5.3 - rolldown: 1.0.0-beta.38 - rolldown-plugin-dts: 0.16.7(rolldown@1.0.0-beta.38)(typescript@5.9.2)(vue-tsc@3.0.7(typescript@5.9.2)) + rolldown: 1.0.0-beta.40 + rolldown-plugin-dts: 0.16.8(rolldown@1.0.0-beta.40)(typescript@5.9.2)(vue-tsc@3.0.7(typescript@5.9.2)) semver: 7.7.2 tinyexec: 1.0.1 tinyglobby: 0.2.15 @@ -13848,6 +13942,9 @@ snapshots: undici-types@6.21.0: {} + undici-types@7.10.0: + optional: true + unenv@2.0.0-rc.18: dependencies: defu: 6.1.4 @@ -13901,7 +13998,7 @@ snapshots: mlly: 1.8.0 pathe: 2.0.3 picomatch: 4.0.3 - pkg-types: 2.3.0 + pkg-types: 2.2.0 scule: 1.3.0 strip-literal: 3.0.0 tinyglobby: 0.2.15 @@ -13964,7 +14061,7 @@ snapshots: pathe: 2.0.3 picomatch: 4.0.3 - unplugin-vue-markdown@29.1.0(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1)): + unplugin-vue-markdown@29.1.0(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1)): dependencies: '@mdit-vue/plugin-component': 2.1.4 '@mdit-vue/plugin-frontmatter': 2.1.4 @@ -13974,7 +14071,7 @@ snapshots: markdown-it-async: 2.2.0 unplugin: 2.3.10 unplugin-utils: 0.2.5 - vite: 7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1) + vite: 7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1) unplugin-vue-router@0.14.0(@vue/compiler-sfc@3.5.21)(vue-router@4.5.1(vue@3.5.18(typescript@5.9.2)))(vue@3.5.18(typescript@5.9.2)): dependencies: @@ -14054,9 +14151,9 @@ snapshots: pkg-types: 1.3.1 unplugin: 1.16.1 - update-browserslist-db@1.1.3(browserslist@4.25.0): + update-browserslist-db@1.1.3(browserslist@4.25.2): dependencies: - browserslist: 4.25.0 + browserslist: 4.25.2 escalade: 3.2.0 picocolors: 1.1.1 @@ -14089,33 +14186,33 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-dev-rpc@1.1.0(vite@7.1.6(@types/node@22.18.6)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1)): + vite-dev-rpc@1.1.0(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1)): dependencies: birpc: 2.5.0 - vite: 7.1.6(@types/node@22.18.6)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1) - vite-hot-client: 2.1.0(vite@7.1.6(@types/node@22.18.6)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1)) + vite: 7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1) + vite-hot-client: 2.1.0(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1)) - vite-dev-rpc@1.1.0(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1)): + vite-dev-rpc@1.1.0(vite@7.1.6(@types/node@24.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1)): dependencies: birpc: 2.5.0 - vite: 7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1) - vite-hot-client: 2.1.0(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1)) + vite: 7.1.6(@types/node@24.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1) + vite-hot-client: 2.1.0(vite@7.1.6(@types/node@24.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1)) - vite-hot-client@2.1.0(vite@7.1.6(@types/node@22.18.6)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1)): + vite-hot-client@2.1.0(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1)): dependencies: - vite: 7.1.6(@types/node@22.18.6)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1) + vite: 7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1) - vite-hot-client@2.1.0(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1)): + vite-hot-client@2.1.0(vite@7.1.6(@types/node@24.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1)): dependencies: - vite: 7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1) + vite: 7.1.6(@types/node@24.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1) - vite-node@3.2.4(@types/node@22.18.6)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1): + vite-node@3.2.4(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1): dependencies: cac: 6.7.14 debug: 4.4.1(supports-color@5.5.0) es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.1.6(@types/node@22.18.6)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1) + vite: 7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - jiti @@ -14130,13 +14227,13 @@ snapshots: - tsx - yaml - vite-node@3.2.4(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1): + vite-node@3.2.4(@types/node@24.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1): dependencies: cac: 6.7.14 debug: 4.4.1(supports-color@5.5.0) es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1) + vite: 7.1.6(@types/node@24.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - jiti @@ -14151,7 +14248,7 @@ snapshots: - tsx - yaml - vite-plugin-checker@0.9.3(meow@13.2.0)(typescript@5.9.2)(vite@6.3.6(@types/node@22.18.6)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1))(vue-tsc@2.2.10(typescript@5.9.2)): + vite-plugin-checker@0.9.3(meow@13.2.0)(typescript@5.9.2)(vite@6.3.5(@types/node@24.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1))(vue-tsc@2.2.10(typescript@5.9.2)): dependencies: '@babel/code-frame': 7.27.1 chokidar: 4.0.3 @@ -14161,14 +14258,14 @@ snapshots: strip-ansi: 7.1.0 tiny-invariant: 1.3.3 tinyglobby: 0.2.15 - vite: 6.3.6(@types/node@22.18.6)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1) + vite: 6.3.5(@types/node@24.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1) vscode-uri: 3.1.0 optionalDependencies: meow: 13.2.0 typescript: 5.9.2 vue-tsc: 2.2.10(typescript@5.9.2) - vite-plugin-inspect@11.3.0(@nuxt/kit@3.17.6(magicast@0.3.5))(vite@7.1.6(@types/node@22.18.6)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1)): + vite-plugin-inspect@11.3.0(@nuxt/kit@3.17.6(magicast@0.3.5))(vite@7.1.6(@types/node@24.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1)): dependencies: ansis: 4.1.0 debug: 4.4.1(supports-color@5.5.0) @@ -14178,14 +14275,14 @@ snapshots: perfect-debounce: 1.0.0 sirv: 3.0.1 unplugin-utils: 0.2.5 - vite: 7.1.6(@types/node@22.18.6)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1) - vite-dev-rpc: 1.1.0(vite@7.1.6(@types/node@22.18.6)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1)) + vite: 7.1.6(@types/node@24.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1) + vite-dev-rpc: 1.1.0(vite@7.1.6(@types/node@24.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1)) optionalDependencies: '@nuxt/kit': 3.17.6(magicast@0.3.5) transitivePeerDependencies: - supports-color - vite-plugin-inspect@11.3.3(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1)): + vite-plugin-inspect@11.3.3(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1)): dependencies: ansis: 4.1.0 debug: 4.4.1(supports-color@5.5.0) @@ -14195,27 +14292,27 @@ snapshots: perfect-debounce: 2.0.0 sirv: 3.0.2 unplugin-utils: 0.3.0 - vite: 7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1) - vite-dev-rpc: 1.1.0(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1)) + vite: 7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1) + vite-dev-rpc: 1.1.0(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1)) transitivePeerDependencies: - supports-color - vite-plugin-vue-devtools@8.0.2(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2)): + vite-plugin-vue-devtools@8.0.2(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2)): dependencies: - '@vue/devtools-core': 8.0.2(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2)) + '@vue/devtools-core': 8.0.2(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2)) '@vue/devtools-kit': 8.0.2 '@vue/devtools-shared': 8.0.2 execa: 9.6.0 sirv: 3.0.2 - vite: 7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1) - vite-plugin-inspect: 11.3.3(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1)) - vite-plugin-vue-inspector: 5.3.2(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1)) + vite: 7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1) + vite-plugin-inspect: 11.3.3(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1)) + vite-plugin-vue-inspector: 5.3.2(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1)) transitivePeerDependencies: - '@nuxt/kit' - supports-color - vue - vite-plugin-vue-inspector@5.3.2(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1)): + vite-plugin-vue-inspector@5.3.2(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1)): dependencies: '@babel/core': 7.27.4 '@babel/plugin-proposal-decorators': 7.25.9(@babel/core@7.27.4) @@ -14223,80 +14320,96 @@ snapshots: '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.27.4) '@babel/plugin-transform-typescript': 7.27.1(@babel/core@7.27.4) '@vue/babel-plugin-jsx': 1.4.0(@babel/core@7.27.4) - '@vue/compiler-dom': 3.5.21 + '@vue/compiler-dom': 3.5.18 kolorist: 1.8.0 magic-string: 0.30.19 - vite: 7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1) + vite: 7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1) transitivePeerDependencies: - supports-color - vite-plugin-vue-tracer@1.0.0(vite@7.1.6(@types/node@22.18.6)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1))(vue@3.5.18(typescript@5.9.2)): + vite-plugin-vue-tracer@1.0.0(vite@7.1.6(@types/node@24.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1))(vue@3.5.18(typescript@5.9.2)): dependencies: estree-walker: 3.0.3 exsolve: 1.0.7 magic-string: 0.30.19 pathe: 2.0.3 source-map-js: 1.2.1 - vite: 7.1.6(@types/node@22.18.6)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1) + vite: 7.1.6(@types/node@24.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1) vue: 3.5.18(typescript@5.9.2) - vite@5.4.20(@types/node@22.18.6)(lightningcss@1.29.3)(terser@5.40.0): + vite@5.4.19(@types/node@22.18.6)(lightningcss@1.29.3)(terser@5.43.1): dependencies: esbuild: 0.21.5 postcss: 8.5.6 - rollup: 4.52.0 + rollup: 4.52.2 optionalDependencies: '@types/node': 22.18.6 fsevents: 2.3.3 lightningcss: 1.29.3 - terser: 5.40.0 + terser: 5.43.1 - vite@6.3.6(@types/node@22.18.6)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1): + vite@6.3.5(@types/node@24.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1): dependencies: esbuild: 0.25.9 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.52.0 + rollup: 4.52.2 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 22.18.6 + '@types/node': 24.3.0 fsevents: 2.3.3 jiti: 2.4.2 lightningcss: 1.29.3 - terser: 5.40.0 + terser: 5.43.1 yaml: 2.8.1 - vite@7.1.6(@types/node@22.18.6)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1): + vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1): dependencies: esbuild: 0.25.9 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.52.0 + rollup: 4.52.2 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 22.18.6 fsevents: 2.3.3 + jiti: 2.5.1 + lightningcss: 1.29.3 + terser: 5.43.1 + yaml: 2.8.1 + + vite@7.1.6(@types/node@24.3.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1): + dependencies: + esbuild: 0.25.9 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.52.2 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 24.3.0 + fsevents: 2.3.3 jiti: 2.4.2 lightningcss: 1.29.3 - terser: 5.40.0 + terser: 5.43.1 yaml: 2.8.1 - vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1): + vite@7.1.6(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1): dependencies: esbuild: 0.25.9 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.52.0 + rollup: 4.52.2 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 22.18.6 + '@types/node': 24.3.0 fsevents: 2.3.3 jiti: 2.5.1 lightningcss: 1.29.3 - terser: 5.40.0 + terser: 5.43.1 yaml: 2.8.1 vitepress-plugin-llms@1.7.5: @@ -14317,7 +14430,7 @@ snapshots: transitivePeerDependencies: - supports-color - vitepress@1.6.4(@algolia/client-search@5.20.0)(@types/node@22.18.6)(change-case@5.4.4)(fuse.js@7.1.0)(jwt-decode@4.0.0)(lightningcss@1.29.3)(postcss@8.5.6)(search-insights@2.17.2)(terser@5.40.0)(typescript@5.9.2): + vitepress@1.6.4(@algolia/client-search@5.20.0)(@types/node@22.18.6)(change-case@5.4.4)(fuse.js@7.1.0)(jwt-decode@4.0.0)(lightningcss@1.29.3)(postcss@8.5.6)(search-insights@2.17.2)(terser@5.43.1)(typescript@5.9.2): dependencies: '@docsearch/css': 3.8.2 '@docsearch/js': 3.8.2(@algolia/client-search@5.20.0)(search-insights@2.17.2) @@ -14326,7 +14439,7 @@ snapshots: '@shikijs/transformers': 2.1.0 '@shikijs/types': 2.3.2 '@types/markdown-it': 14.1.2 - '@vitejs/plugin-vue': 5.2.4(vite@5.4.20(@types/node@22.18.6)(lightningcss@1.29.3)(terser@5.40.0))(vue@3.5.21(typescript@5.9.2)) + '@vitejs/plugin-vue': 5.2.4(vite@5.4.19(@types/node@22.18.6)(lightningcss@1.29.3)(terser@5.43.1))(vue@3.5.21(typescript@5.9.2)) '@vue/devtools-api': 7.7.6 '@vue/shared': 3.5.18 '@vueuse/core': 12.5.0(typescript@5.9.2) @@ -14335,7 +14448,7 @@ snapshots: mark.js: 8.11.1 minisearch: 7.1.1 shiki: 2.3.2 - vite: 5.4.20(@types/node@22.18.6)(lightningcss@1.29.3)(terser@5.40.0) + vite: 5.4.19(@types/node@22.18.6)(lightningcss@1.29.3)(terser@5.43.1) vue: 3.5.21(typescript@5.9.2) optionalDependencies: postcss: 8.5.6 @@ -14366,11 +14479,11 @@ snapshots: - typescript - universal-cookie - vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.6)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.6)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -14388,8 +14501,8 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1) - vite-node: 3.2.4(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.40.0)(yaml@2.8.1) + vite: 7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 @@ -14504,9 +14617,9 @@ snapshots: '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.15.0 acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.25.0 + browserslist: 4.25.2 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.1 + enhanced-resolve: 5.18.3 es-module-lexer: 1.7.0 eslint-scope: 5.1.1 events: 3.3.0 diff --git a/src/options.ts b/src/options.ts index 7fe1f7e0f..2e1cf9f3b 100644 --- a/src/options.ts +++ b/src/options.ts @@ -225,9 +225,27 @@ export interface Options { * page component. */ autoExportsDataLoaders?: string | string[] + + /** + * Enable experimental support for the new custom resolvers. + */ + paramMatchers?: boolean | ParamMatcherOptions } } +export interface ParamMatcherOptions { + /** + * Folder(s) to scan for param matchers. + * + * @default `['src/params']` + */ + dir?: string | string[] +} + +export const DEFAULT_PARAM_MATCHER_OPTIONS = { + dir: ['src/params'], +} satisfies Required + export const DEFAULT_OPTIONS = { extensions: ['.vue'], exclude: [], @@ -304,6 +322,14 @@ export function resolveOptions(options: Options) { })) const experimental = { ...options.experimental } + experimental.paramMatchers = + experimental.paramMatchers && + (experimental.paramMatchers === true + ? DEFAULT_PARAM_MATCHER_OPTIONS + : { + ...DEFAULT_PARAM_MATCHER_OPTIONS, + ...experimental.paramMatchers, + }) if (experimental.autoExportsDataLoaders) { experimental.autoExportsDataLoaders = ( @@ -351,6 +377,9 @@ export function resolveOptions(options: Options) { } } +/** + * @internal + */ export type ResolvedOptions = ReturnType /** From fe9da993c0b6a7a11da22379eedc2deaa512acc3 Mon Sep 17 00:00:00 2001 From: Eduardo San Martin Morote Date: Thu, 7 Aug 2025 17:46:23 +0200 Subject: [PATCH 02/81] feat: support static paths for resolver --- src/codegen/generateRouteRecords.ts | 2 +- src/codegen/generateRouteResolver.spec.ts | 142 ++++++++++++++++++++++ src/codegen/generateRouteResolver.ts | 137 +++++++++++++++++++++ src/core/tree.ts | 6 + 4 files changed, 286 insertions(+), 1 deletion(-) create mode 100644 src/codegen/generateRouteResolver.spec.ts create mode 100644 src/codegen/generateRouteResolver.ts diff --git a/src/codegen/generateRouteRecords.ts b/src/codegen/generateRouteRecords.ts index 3dca451b4..3ac7738c9 100644 --- a/src/codegen/generateRouteRecords.ts +++ b/src/codegen/generateRouteRecords.ts @@ -145,7 +145,7 @@ ${indentStr}},` * @param importsMap - the import list to fill * @returns */ -function generatePageImport( +export function generatePageImport( filepath: string, importMode: ResolvedOptions['importMode'], importsMap: ImportsMap diff --git a/src/codegen/generateRouteResolver.spec.ts b/src/codegen/generateRouteResolver.spec.ts new file mode 100644 index 000000000..52dd9d4ba --- /dev/null +++ b/src/codegen/generateRouteResolver.spec.ts @@ -0,0 +1,142 @@ +import { beforeEach, describe, expect, it } from 'vitest' +import { PrefixTree } from '../core/tree' +import { resolveOptions } from '../options' +import { + generateRouteResolver, + generateRouteRecord, +} from './generateRouteResolver' +import { ImportsMap } from '../core/utils' + +const DEFAULT_OPTIONS = resolveOptions({}) +let DEFAULT_STATE: Parameters[0]['state'] = { + id: 0, + recordVarNames: [], +} + +beforeEach(() => { + DEFAULT_STATE = { + id: 0, + recordVarNames: [], + } +}) + +describe('generateRouteRecord', () => { + it('serializes a simple static path', () => { + const tree = new PrefixTree(DEFAULT_OPTIONS) + const importsMap = new ImportsMap() + expect( + generateRouteRecord({ + node: tree.insert('a', 'a.vue'), + parentVar: null, + state: DEFAULT_STATE, + options: DEFAULT_OPTIONS, + importsMap, + }) + ).toMatchInlineSnapshot(` + "const r_0 = normalizeRouteRecord({ + name: '/a', + path: new MatcherPatternPathStatic('/a'), + components: { + 'default': () => import('a.vue') + }, + })" + `) + expect( + generateRouteRecord({ + node: tree.insert('a/b/c', 'a/b/c.vue'), + parentVar: null, + state: DEFAULT_STATE, + options: DEFAULT_OPTIONS, + importsMap, + }) + ).toMatchInlineSnapshot(` + "const r_1 = normalizeRouteRecord({ + name: '/a/b/c', + path: new MatcherPatternPathStatic('/a/b/c'), + components: { + 'default': () => import('a/b/c.vue') + }, + })" + `) + }) +}) + +describe('generateRouteResolver', () => { + it('generates a resolver for a simple tree', () => { + const tree = new PrefixTree(DEFAULT_OPTIONS) + const importsMap = new ImportsMap() + tree.insert('a', 'a.vue') + tree.insert('b/c', 'b/c.vue') + tree.insert('b/c/d', 'b/c/d.vue') + tree.insert('b/e/f', 'b/c/f.vue') + console.log(tree.getChildrenSorted()) + const resolver = generateRouteResolver(tree, DEFAULT_OPTIONS, importsMap) + + expect(resolver).toMatchInlineSnapshot(` + " + import { + createStaticResolver, + MatcherPatternPathStatic, + MatcherPatternPathCustomParams, + MatcherPatternPathStar, + normalizeRouteRecord, + // param matchers + PARAM_NUMBER, + } from 'vue-router/experimental' + import type { + EXPERIMENTAL_RouteRecordNormalized_Matchable, + MatcherPatternHash, + MatcherPatternQuery, + EmptyParams, + } from 'vue-router/experimental' + + const r_0 = normalizeRouteRecord({ + name: '/a', + path: new MatcherPatternPathStatic('/a'), + components: { + 'default': () => import('a.vue') + }, + }) + + const r_1 = normalizeRouteRecord({ + /* internal name: '/b' */ + }) + const r_2 = normalizeRouteRecord({ + name: '/b/c', + path: new MatcherPatternPathStatic('/b/c'), + components: { + 'default': () => import('b/c.vue') + }, + parent: r_1, + }) + const r_3 = normalizeRouteRecord({ + name: '/b/c/d', + path: new MatcherPatternPathStatic('/b/c/d'), + components: { + 'default': () => import('b/c/d.vue') + }, + parent: r_2, + }) + const r_4 = normalizeRouteRecord({ + /* internal name: '/b/e' */ + parent: r_1, + }) + const r_5 = normalizeRouteRecord({ + name: '/b/e/f', + path: new MatcherPatternPathStatic('/b/e/f'), + components: { + 'default': () => import('b/c/f.vue') + }, + parent: r_4, + }) + + export const resolver = createStaticResolver([ + r_0, + r_2, + r_3, + r_5, + ]) + " + `) + }) +}) diff --git a/src/codegen/generateRouteResolver.ts b/src/codegen/generateRouteResolver.ts new file mode 100644 index 000000000..6b8d67b25 --- /dev/null +++ b/src/codegen/generateRouteResolver.ts @@ -0,0 +1,137 @@ +import { PrefixTree, type TreeNode } from '../core/tree' +import { ImportsMap } from '../core/utils' +import { type ResolvedOptions } from '../options' +import { ts } from '../utils' +import { generatePageImport } from './generateRouteRecords' + +export function generateRouteResolver( + tree: PrefixTree, + options: ResolvedOptions, + importsMap: ImportsMap +): string { + const state = { id: 0, recordVarNames: [] } + const records = tree + .getChildrenSorted() + .map((node) => + generateRouteRecord({ node, parentVar: null, state, options, importsMap }) + ) + + return ts` +import { + createStaticResolver, + MatcherPatternPathStatic, + MatcherPatternPathCustomParams, + MatcherPatternPathStar, + normalizeRouteRecord, + // param matchers + PARAM_NUMBER, +} from 'vue-router/experimental' +import type { + EXPERIMENTAL_RouteRecordNormalized_Matchable, + MatcherPatternHash, + MatcherPatternQuery, + EmptyParams, +} from 'vue-router/experimental' + +${records.join('\n\n')} + +export const resolver = createStaticResolver([ +${state.recordVarNames.map((varName) => ` ${varName},`).join('\n')} +]) +` +} + +export function generateRouteRecord({ + node, + parentVar, + state, + options, + importsMap, +}: { + node: TreeNode + parentVar: string | null | undefined + state: { + id: number + recordVarNames: string[] + } + options: ResolvedOptions + importsMap: ImportsMap +}): string { + const varName = `r_${state.id++}` + + let recordName: string + let recordComponents: string + + if (node.isMatchable()) { + state.recordVarNames.push(varName) + recordName = `name: '${node.name}',` + recordComponents = generateRouteRecordComponent( + node, + ' ', + options.importMode, + importsMap + ) + } else { + recordName = node.name ? `/* internal name: '${node.name}' */` : `` + recordComponents = '' + } + + const recordDeclaration = ` +const ${varName} = normalizeRouteRecord({ + ${recordName} + ${generateRouteRecordPathMatcher({ node })} + ${recordComponents} + ${parentVar ? `parent: ${parentVar},` : ''} +}) +` + .trim() + .split('\n') + // remove empty lines + .filter((l) => l.trimStart().length > 0) + .join('\n') + + const children = node.getChildrenSorted().map((child) => + generateRouteRecord({ + node: child, + parentVar: varName, + state, + options, + importsMap, + }) + ) + + return recordDeclaration + (children.length ? '\n' + children.join('\n') : '') +} + +function generateRouteRecordComponent( + node: TreeNode, + indentStr: string, + importMode: ResolvedOptions['importMode'], + importsMap: ImportsMap +): string { + const files = Array.from(node.value.components) + return `components: { +${files + .map( + ([key, path]) => + `${indentStr + ' '}'${key}': ${generatePageImport( + path, + importMode, + importsMap + )}` + ) + .join(',\n')} +${indentStr}},` +} + +export function generateRouteRecordPathMatcher({ node }: { node: TreeNode }) { + if (!node.isMatchable()) { + return '' + } else if (node.value.isStatic()) { + return `path: new MatcherPatternPathStatic('${node.fullPath}'),` + } else if (node.value.isParam()) { + return `path: new MatcherPatternPathCustomParams('${node.fullPath}'),` + } + + return `/* UNSUPPORTED path matcher for: "${node.fullPath}" */` +} diff --git a/src/core/tree.ts b/src/core/tree.ts index 25fff6644..abc9335ea 100644 --- a/src/core/tree.ts +++ b/src/core/tree.ts @@ -279,6 +279,12 @@ export class TreeNode { return params } + isMatchable(): this is TreeNode & { name: string } { + // a node is matchable if it has at least one component + // and the name is not false + return this.value.components.size > 0 && this.name !== false + } + /** * Returns wether this tree node is the root node of the tree. * From 8e0a7a2181a5d58559ebf1974c86604f019b4802 Mon Sep 17 00:00:00 2001 From: Eduardo San Martin Morote Date: Thu, 7 Aug 2025 17:46:39 +0200 Subject: [PATCH 03/81] refactor: missing import type --- src/data-loaders/meta-extensions.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/data-loaders/meta-extensions.ts b/src/data-loaders/meta-extensions.ts index 5835aa53c..0949cd7c5 100644 --- a/src/data-loaders/meta-extensions.ts +++ b/src/data-loaders/meta-extensions.ts @@ -10,6 +10,7 @@ import type { IS_SSR_KEY, } from './symbols' import { type NavigationResult } from './navigation-guard' +import { type RouteLocationNormalizedLoaded } from 'vue-router' /** * Map type for the entries used by data loaders. From f4ad320687cc7bfc8c353a74ce10bdb2b2b634e4 Mon Sep 17 00:00:00 2001 From: Eduardo San Martin Morote Date: Thu, 7 Aug 2025 17:46:50 +0200 Subject: [PATCH 04/81] chore: remove baseUrl from tsconfig --- tsconfig.json | 27 ++++++++------------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/tsconfig.json b/tsconfig.json index 83731b6cd..75cb476c5 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,15 +14,13 @@ "dist" ], "compilerOptions": { - "baseUrl": ".", + // this makes auto import canonical (e.g. 'src/utils' instead of '../utils') + // "baseUrl": ".", "rootDir": ".", "jsx": "preserve", "target": "ESNext", "module": "ESNext", - "lib": [ - "ESNext", - "DOM" - ], + "lib": ["ESNext", "DOM"], "moduleResolution": "Bundler", "skipDefaultLibCheck": true, "skipLibCheck": true, @@ -42,25 +40,16 @@ "strictNullChecks": true, "resolveJsonModule": true, "paths": { - "unplugin-vue-router": [ - "./src/index.ts" - ], - "unplugin-vue-router/types": [ - "./src/types.ts" - ], - "unplugin-vue-router/runtime": [ - "./src/runtime.ts" - ], + "unplugin-vue-router": ["./src/index.ts"], + "unplugin-vue-router/types": ["./src/types.ts"], + "unplugin-vue-router/runtime": ["./src/runtime.ts"], "unplugin-vue-router/data-loaders": [ "./src/data-loaders/entries/index.ts" ] }, - "types": [ - "node", - "vite/client" - ] + "types": ["node", "vite/client"] }, "vueCompilerOptions": { "plugins": [] - }, + } } From 81e088e9845bbd403dd081c2aa8544796b71af64 Mon Sep 17 00:00:00 2001 From: Eduardo San Martin Morote Date: Fri, 8 Aug 2025 17:51:59 +0200 Subject: [PATCH 05/81] chore: add experimental playground --- client.d.ts | 2 +- playground-experimental/.gitignore | 1 + playground-experimental/auto-imports.d.ts | 14 ++ playground-experimental/db.json | 24 +++ playground-experimental/env.d.ts | 2 + playground-experimental/index.html | 17 ++ playground-experimental/package.json | 23 +++ playground-experimental/src/App.vue | 103 +++++++++++++ playground-experimental/src/main.ts | 29 ++++ playground-experimental/src/pages/(home).vue | 5 + playground-experimental/src/pages/[name].vue | 6 + .../src/pages/a.[b].c.[d].vue | 5 + .../src/pages/users/[userId].vue | 5 + .../src/pages/users/sub-[first]-[second].vue | 5 + playground-experimental/src/router.ts | 32 ++++ playground-experimental/src/utils.ts | 40 +++++ playground-experimental/tsconfig.config.json | 8 + playground-experimental/tsconfig.json | 41 +++++ playground-experimental/typed-router.d.ts | 71 +++++++++ playground-experimental/vite.config.ts | 145 ++++++++++++++++++ pnpm-lock.yaml | 61 ++++++++ pnpm-workspace.yaml | 1 + src/codegen/generateRouteResolver.spec.ts | 1 - src/codegen/generateRouteResolver.ts | 23 +-- src/core/context.ts | 22 ++- src/core/moduleConstants.ts | 7 +- src/core/tree.ts | 40 +++++ src/core/treeNodeValue.ts | 16 ++ src/index.ts | 15 +- 29 files changed, 748 insertions(+), 16 deletions(-) create mode 100644 playground-experimental/.gitignore create mode 100644 playground-experimental/auto-imports.d.ts create mode 100644 playground-experimental/db.json create mode 100644 playground-experimental/env.d.ts create mode 100644 playground-experimental/index.html create mode 100644 playground-experimental/package.json create mode 100644 playground-experimental/src/App.vue create mode 100644 playground-experimental/src/main.ts create mode 100644 playground-experimental/src/pages/(home).vue create mode 100644 playground-experimental/src/pages/[name].vue create mode 100644 playground-experimental/src/pages/a.[b].c.[d].vue create mode 100644 playground-experimental/src/pages/users/[userId].vue create mode 100644 playground-experimental/src/pages/users/sub-[first]-[second].vue create mode 100644 playground-experimental/src/router.ts create mode 100644 playground-experimental/src/utils.ts create mode 100644 playground-experimental/tsconfig.config.json create mode 100644 playground-experimental/tsconfig.json create mode 100644 playground-experimental/typed-router.d.ts create mode 100644 playground-experimental/vite.config.ts diff --git a/client.d.ts b/client.d.ts index e6afb9f3b..fed885230 100644 --- a/client.d.ts +++ b/client.d.ts @@ -4,7 +4,7 @@ declare module 'vue-router/auto-routes' { /** * Array of routes generated by unplugin-vue-router */ - export const routes: RouteRecordRaw[] + export const routes: readonly RouteRecordRaw[] /** * Setups hot module replacement for routes. diff --git a/playground-experimental/.gitignore b/playground-experimental/.gitignore new file mode 100644 index 000000000..cc1b7f164 --- /dev/null +++ b/playground-experimental/.gitignore @@ -0,0 +1 @@ +tsconfig.tsbuildinfo diff --git a/playground-experimental/auto-imports.d.ts b/playground-experimental/auto-imports.d.ts new file mode 100644 index 000000000..f77a9b47b --- /dev/null +++ b/playground-experimental/auto-imports.d.ts @@ -0,0 +1,14 @@ +/* eslint-disable */ +/* prettier-ignore */ +// @ts-nocheck +// noinspection JSUnusedGlobalSymbols +// Generated by unplugin-auto-import +// biome-ignore lint: disable +export {} +declare global { + const defineBasicLoader: typeof import('../src/data-loaders/entries/basic')['defineBasicLoader'] + const onBeforeRouteLeave: typeof import('vue-router')['onBeforeRouteLeave'] + const onBeforeRouteUpdate: typeof import('vue-router')['onBeforeRouteUpdate'] + const useRoute: typeof import('vue-router')['useRoute'] + const useRouter: typeof import('vue-router')['useRouter'] +} diff --git a/playground-experimental/db.json b/playground-experimental/db.json new file mode 100644 index 000000000..53e4f7413 --- /dev/null +++ b/playground-experimental/db.json @@ -0,0 +1,24 @@ +{ + "todos": [ + { + "id": 2, + "title": "Walking", + "completed": true + }, + { + "id": 3, + "title": "Cleaning", + "completed": false + }, + { + "id": 4, + "title": "Cooking", + "completed": true + }, + { + "title": "hello", + "completed": false, + "id": 7 + } + ] +} \ No newline at end of file diff --git a/playground-experimental/env.d.ts b/playground-experimental/env.d.ts new file mode 100644 index 000000000..dabd0deba --- /dev/null +++ b/playground-experimental/env.d.ts @@ -0,0 +1,2 @@ +/// +/// diff --git a/playground-experimental/index.html b/playground-experimental/index.html new file mode 100644 index 000000000..7795da29a --- /dev/null +++ b/playground-experimental/index.html @@ -0,0 +1,17 @@ + + + + + + + + visit /__inspect/ to inspect the intermediate state +
+ + + diff --git a/playground-experimental/package.json b/playground-experimental/package.json new file mode 100644 index 000000000..72945de4e --- /dev/null +++ b/playground-experimental/package.json @@ -0,0 +1,23 @@ +{ + "private": true, + "type": "module", + "scripts": { + "dev": "nodemon -w '../src/**/*.ts' -e .ts -x vite", + "json-server": "json-server --watch db.json --port 4000", + "playground:build": "vite build" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^6.0.1", + "@vue/compiler-sfc": "^3.5.18", + "@vue/tsconfig": "^0.7.0", + "json-server": "^0.17.4", + "unplugin-vue-router": "workspace:*", + "vite": "^7.0.6" + }, + "dependencies": { + "mande": "^2.0.9", + "pinia": "^3.0.3", + "vue": "^3.5.18", + "vue-router": "file:/Users/posva/oss/vuejs/router/packages/router/vue-router-4.5.1.tgz" + } +} diff --git a/playground-experimental/src/App.vue b/playground-experimental/src/App.vue new file mode 100644 index 000000000..6ec2bac35 --- /dev/null +++ b/playground-experimental/src/App.vue @@ -0,0 +1,103 @@ + + + + + diff --git a/playground-experimental/src/main.ts b/playground-experimental/src/main.ts new file mode 100644 index 000000000..13178acb5 --- /dev/null +++ b/playground-experimental/src/main.ts @@ -0,0 +1,29 @@ +import { createApp } from 'vue' +import App from './App.vue' +import { createPinia } from 'pinia' +import { PiniaColada } from '@pinia/colada' +import { router } from './router' +import { DataLoaderPlugin } from 'unplugin-vue-router/data-loaders' +import { RouterLink, RouterView } from 'vue-router' + +const app = createApp(App) + +app.use(createPinia()) +app.use(PiniaColada, {}) +// @ts-expect-error: FIXME: should be doable +app.use(DataLoaderPlugin, { router }) +app.component('RouterLink', RouterLink) +app.component('RouterView', RouterView) +app.use(router) + +// @ts-expect-error: for debugging on browser +window.$router = router + +app.mount('#app') + +// small logger for navigations, useful to check HMR +router.isReady().then(() => { + router.beforeEach((to, from) => { + console.log('🧭', from.fullPath, '->', to.fullPath) + }) +}) diff --git a/playground-experimental/src/pages/(home).vue b/playground-experimental/src/pages/(home).vue new file mode 100644 index 000000000..9522e259e --- /dev/null +++ b/playground-experimental/src/pages/(home).vue @@ -0,0 +1,5 @@ + + + diff --git a/playground-experimental/src/pages/[name].vue b/playground-experimental/src/pages/[name].vue new file mode 100644 index 000000000..bc207c40c --- /dev/null +++ b/playground-experimental/src/pages/[name].vue @@ -0,0 +1,6 @@ + + + diff --git a/playground-experimental/src/pages/a.[b].c.[d].vue b/playground-experimental/src/pages/a.[b].c.[d].vue new file mode 100644 index 000000000..29b5f2e77 --- /dev/null +++ b/playground-experimental/src/pages/a.[b].c.[d].vue @@ -0,0 +1,5 @@ + + + diff --git a/playground-experimental/src/pages/users/[userId].vue b/playground-experimental/src/pages/users/[userId].vue new file mode 100644 index 000000000..29b5f2e77 --- /dev/null +++ b/playground-experimental/src/pages/users/[userId].vue @@ -0,0 +1,5 @@ + + + diff --git a/playground-experimental/src/pages/users/sub-[first]-[second].vue b/playground-experimental/src/pages/users/sub-[first]-[second].vue new file mode 100644 index 000000000..29b5f2e77 --- /dev/null +++ b/playground-experimental/src/pages/users/sub-[first]-[second].vue @@ -0,0 +1,5 @@ + + + diff --git a/playground-experimental/src/router.ts b/playground-experimental/src/router.ts new file mode 100644 index 000000000..cb785aca7 --- /dev/null +++ b/playground-experimental/src/router.ts @@ -0,0 +1,32 @@ +import { experimental_createRouter } from 'vue-router/experimental' +import { resolver } from 'vue-router/auto-resolver' +import { + type RouteRecordInfo, + type ParamValue, + createWebHistory, +} from 'vue-router' + +export const router = experimental_createRouter({ + history: createWebHistory(), + resolver, +}) + +// manual extension of route types +declare module 'vue-router/auto-routes' { + export interface RouteNamedMap { + 'custom-dynamic-name': RouteRecordInfo< + 'custom-dynamic-name', + '/added-during-runtime/[...path]', + { path: ParamValue }, + { path: ParamValue }, + 'custom-dynamic-child-name' + > + 'custom-dynamic-child-name': RouteRecordInfo< + 'custom-dynamic-child-name', + '/added-during-runtime/[...path]/child', + { path: ParamValue }, + { path: ParamValue }, + never + > + } +} diff --git a/playground-experimental/src/utils.ts b/playground-experimental/src/utils.ts new file mode 100644 index 000000000..07a8d448d --- /dev/null +++ b/playground-experimental/src/utils.ts @@ -0,0 +1,40 @@ +import { inject, toValue, onUnmounted } from 'vue' +import type { RouteLocation, RouteLocationNormalizedLoaded } from 'vue-router' +import { viewDepthKey, useRoute, useRouter } from 'vue-router' +import type { RouteNamedMap } from 'vue-router/auto-routes' + +type NavigationReturn = RouteLocation | boolean | void + +export function useParamMatcher( + _name: Name, + fn: ( + to: RouteLocationNormalizedLoaded + ) => NavigationReturn | Promise +) { + const route = useRoute() + const router = useRouter() + const depth = inject(viewDepthKey, 0) + // we only need it the first time + const matchedRecord = route.matched[toValue(depth) - 1]?.name + console.log(matchedRecord) + + if (!matchedRecord) return + + console.log('add guard') + + const removeGuard = router.beforeEach((to) => { + console.log('beforeEach', to) + if (to.matched.find((record) => record.name === matchedRecord)) { + return fn(to as RouteLocationNormalizedLoaded) + } + }) + + onUnmounted(removeGuard) +} + +export function dummy(arg: unknown) { + return 'ok' +} + +export const dummy_id = 'dummy_id' +export const dummy_number = 42 diff --git a/playground-experimental/tsconfig.config.json b/playground-experimental/tsconfig.config.json new file mode 100644 index 000000000..fdcee2d99 --- /dev/null +++ b/playground-experimental/tsconfig.config.json @@ -0,0 +1,8 @@ +{ + "extends": "@vue/tsconfig/tsconfig.json", + "include": ["vite.config.*", "vitest.config.*", "cypress.config.*"], + "compilerOptions": { + "composite": true, + "types": ["node"] + } +} diff --git a/playground-experimental/tsconfig.json b/playground-experimental/tsconfig.json new file mode 100644 index 000000000..5fe7d55ab --- /dev/null +++ b/playground-experimental/tsconfig.json @@ -0,0 +1,41 @@ +{ + "extends": "@vue/tsconfig/tsconfig.dom.json", + "include": [ + "./env.d.ts", + "./src/**/*.ts", + "./src/**/*.vue", + "./typed-router.d.ts", + "./auto-imports.d.ts", + "../src" + ], + "compilerOptions": { + // "baseUrl": ".", + "composite": true, + "moduleResolution": "Bundler", + "paths": { + "@/*": ["./src/*"], + "unplugin-vue-router/runtime": ["../src/runtime.ts"], + "unplugin-vue-router/types": ["../src/types.ts"], + "unplugin-vue-router/data-loaders": [ + "../src/data-loaders/entries/index.ts" + ], + "unplugin-vue-router/data-loaders/basic": [ + "../src/data-loaders/entries/basic.ts" + ], + "unplugin-vue-router/data-loaders/pinia-colada": [ + "../src/data-loaders/entries/pinia-colada.ts" + ] + } + }, + "vueCompilerOptions": { + "plugins": [ + "unplugin-vue-router/volar/sfc-route-blocks", + "unplugin-vue-router/volar/sfc-typed-router" + ] + }, + "references": [ + { + "path": "./tsconfig.config.json" + } + ] +} diff --git a/playground-experimental/typed-router.d.ts b/playground-experimental/typed-router.d.ts new file mode 100644 index 000000000..7d3994fa7 --- /dev/null +++ b/playground-experimental/typed-router.d.ts @@ -0,0 +1,71 @@ +/* eslint-disable */ +/* prettier-ignore */ +// @ts-nocheck +// Generated by unplugin-vue-router. ‼️ DO NOT MODIFY THIS FILE ‼️ +// It's recommended to commit this file. +// Make sure to add this file to your tsconfig.json file as an "includes" or "files" entry. + +declare module 'vue-router/auto-routes' { + import type { + RouteRecordInfo, + ParamValue, + ParamValueOneOrMore, + ParamValueZeroOrMore, + ParamValueZeroOrOne, + } from 'vue-router' + + /** + * Route name map generated by unplugin-vue-router + */ + export interface RouteNamedMap { + '/(home)': RouteRecordInfo<'/(home)', '/', Record, Record>, + '/[name]': RouteRecordInfo<'/[name]', '/:name', { name: ParamValue }, { name: ParamValue }>, + '/a.[b].c.[d]': RouteRecordInfo<'/a.[b].c.[d]', '/a/:b/c/:d', { b: ParamValue, d: ParamValue }, { b: ParamValue, d: ParamValue }>, + '/users/[userId]': RouteRecordInfo<'/users/[userId]', '/users/:userId', { userId: ParamValue }, { userId: ParamValue }>, + '/users/sub-[first]-[second]': RouteRecordInfo<'/users/sub-[first]-[second]', '/users/sub-:first-:second', { first: ParamValue, second: ParamValue }, { first: ParamValue, second: ParamValue }>, + } + + /** + * Route file to route info map by unplugin-vue-router. + * Used by the volar plugin to automatically type useRoute() + * + * Each key is a file path relative to the project root with 2 properties: + * - routes: union of route names of the possible routes when in this page (passed to useRoute<...>()) + * - views: names of nested views (can be passed to ) + * + * @internal + */ + export interface _RouteFileInfoMap { + 'src/pages/(home).vue': { + routes: '/(home)' + views: never + } + 'src/pages/[name].vue': { + routes: '/[name]' + views: never + } + 'src/pages/a.[b].c.[d].vue': { + routes: '/a.[b].c.[d]' + views: never + } + 'src/pages/users/[userId].vue': { + routes: '/users/[userId]' + views: never + } + 'src/pages/users/sub-[first]-[second].vue': { + routes: '/users/sub-[first]-[second]' + views: never + } + } + + /** + * Get a union of possible route names in a certain route component file. + * Used by the volar plugin to automatically type useRoute() + * + * @internal + */ + export type _RouteNamesForFilePath = + _RouteFileInfoMap extends Record + ? Info['routes'] + : keyof RouteNamedMap +} diff --git a/playground-experimental/vite.config.ts b/playground-experimental/vite.config.ts new file mode 100644 index 000000000..3c6cd7af5 --- /dev/null +++ b/playground-experimental/vite.config.ts @@ -0,0 +1,145 @@ +import { fileURLToPath, URL } from 'url' +import { defineConfig } from 'vite' +import { join } from 'node:path' +import Markdown from 'unplugin-vue-markdown/vite' +// @ts-ignore: the plugin should not be checked in the playground +import VueRouter from '../src/vite' +import { VueRouterAutoImports } from '../src' +import Vue from '@vitejs/plugin-vue' +import AutoImport from 'unplugin-auto-import/vite' +import VueDevtools from 'vite-plugin-vue-devtools' + +export default defineConfig({ + clearScreen: false, + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)), + '~': fileURLToPath(new URL('./src', import.meta.url)), + 'unplugin-vue-router/runtime': fileURLToPath( + new URL('../src/runtime.ts', import.meta.url) + ), + 'unplugin-vue-router/types': fileURLToPath( + new URL('../src/types.ts', import.meta.url) + ), + 'unplugin-vue-router/data-loaders/basic': fileURLToPath( + new URL('../src/data-loaders/entries/basic.ts', import.meta.url) + ), + 'unplugin-vue-router/data-loaders/pinia-colada': fileURLToPath( + new URL('../src/data-loaders/entries/pinia-colada.ts', import.meta.url) + ), + 'unplugin-vue-router/data-loaders': fileURLToPath( + new URL('../src/data-loaders/entries/index.ts', import.meta.url) + ), + }, + }, + build: { + sourcemap: true, + }, + optimizeDeps: { + exclude: [ + // easier to test with yalc + '@pinia/colada', + ], + }, + + plugins: [ + VueRouter({ + extensions: ['.page.vue', '.vue'], + importMode: 'async', + logs: true, + // getRouteName: getPascalCaseRouteName, + experimental: { + autoExportsDataLoaders: ['src/loaders/**/*', '@/loaders/**/*'], + paramMatchers: true, + }, + extendRoute(route) { + // example of deleting routes + // if (route.name.startsWith('/users')) { + // route.delete() + // } + + if (route.name === '/a.[b].c.[d]') { + console.log(route.node) + } + + if (route.name === '/[name]') { + // TODO: implement aliases + // route.addAlias('/hello-vite-:name') + } + + // TODO: implement insertions + // const newRoute = root.insert( + // '/custom/page', + // route.components.get('default')! + // ) + // newRoute.components.set('default', route.components.get('default')!) + // newRoute.meta = { + // 'custom-meta': 'works', + // } + // } + }, + beforeWriteFiles(root) { + // root.insert('/from-root', join(__dirname, './src/pages/index.vue')) + }, + routesFolder: [ + // can add multiple routes folders + { + src: 'src/pages', + }, + { + src: 'src/docs', + path: 'docs/[lang]/', + // doesn't take into account files directly at src/docs, only subfolders + filePatterns: ['*/**'], + // ignores .vue files + extensions: ['.md'], + }, + { + src: 'src/features', + filePatterns: '*/pages/**/*', + path: (file) => { + const prefix = 'src/features' + // +1 for the starting slash + file = file + .slice(file.lastIndexOf(prefix) + prefix.length + 1) + .replace('/pages', '') + // console.log('👉 FILE', file) + return file + }, + }, + ], + exclude: [ + '**/ignored/**', + // '**/ignored/**/*', + '**/__*', + '**/__**/*', + '**/*.component.vue', + // resolve(__dirname, './src/pages/ignored'), + // + // './src/pages/**/*.spec.ts', + ], + }), + Vue({ + include: [/\.vue$/, /\.md$/], + }), + Markdown({}), + AutoImport({ + imports: [ + VueRouterAutoImports, + { + // NOTE: we need to match the resolved paths to local files for development + // instead of just 'unplugin-vue-router/data-loaders/basic': ['defineBasicLoader'], + [fileURLToPath( + new URL('../src/data-loaders/entries/basic.ts', import.meta.url) + )]: ['defineBasicLoader'], + // [fileURLToPath( + // new URL('../src/data-loaders/entries/pinia-colada.ts', import.meta.url) + // )]: ['defineColadaLoader'], + }, + ], + }), + // currently the devtools use 0.8.8 but we care more about + // inspecting virtual files + VueDevtools(), + ], +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 79cf034ae..273bc208e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -249,6 +249,40 @@ importers: specifier: ^7.1.6 version: 7.1.6(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1) + playground-experimental: + dependencies: + mande: + specifier: ^2.0.9 + version: 2.0.9 + pinia: + specifier: ^3.0.3 + version: 3.0.3(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2)) + vue: + specifier: ^3.5.18 + version: 3.5.21(typescript@5.9.2) + vue-router: + specifier: file:/Users/posva/oss/vuejs/router/packages/router/vue-router-4.5.1.tgz + version: file:../vuejs/router/packages/router/vue-router-4.5.1.tgz(vue@3.5.21(typescript@5.9.2)) + devDependencies: + '@vitejs/plugin-vue': + specifier: ^6.0.1 + version: 6.0.1(vite@7.1.6(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2)) + '@vue/compiler-sfc': + specifier: ^3.5.18 + version: 3.5.21 + '@vue/tsconfig': + specifier: ^0.7.0 + version: 0.7.0(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2)) + json-server: + specifier: ^0.17.4 + version: 0.17.4 + unplugin-vue-router: + specifier: workspace:* + version: link:.. + vite: + specifier: ^7.0.6 + version: 7.1.6(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.29.3)(terser@5.43.1)(yaml@2.8.1) + packages: '@algolia/autocomplete-core@1.17.7': @@ -2623,6 +2657,17 @@ packages: '@vue/test-utils@2.4.6': resolution: {integrity: sha512-FMxEjOpYNYiFe0GkaHsnJPXFHxQ6m4t8vI/ElPGpMWxZKpmRvQ33OIrvRXemy6yha03RxhOlQuy+gZMC3CQSow==} + '@vue/tsconfig@0.7.0': + resolution: {integrity: sha512-ku2uNz5MaZ9IerPPUyOHzyjhXoX2kVJaVf7hL315DC17vS6IiZRmmCPfggNbU16QTvM80+uYYy3eYJB59WCtvg==} + peerDependencies: + typescript: 5.x + vue: ^3.4.0 + peerDependenciesMeta: + typescript: + optional: true + vue: + optional: true + '@vue/tsconfig@0.8.1': resolution: {integrity: sha512-aK7feIWPXFSUhsCP9PFqPyFOcz4ENkb8hZ2pneL6m2UjCkccvaOhC/5KCKluuBufvp2KzkbdA2W2pk20vLzu3g==} peerDependencies: @@ -6820,6 +6865,12 @@ packages: peerDependencies: vue: ^3.2.0 + vue-router@file:../vuejs/router/packages/router/vue-router-4.5.1.tgz: + resolution: {integrity: sha512-aBPR/DiVyr5ns0dQiI6cAQl7JRgq7uVeM/OZGt+gy4xvc9HgZh/nPc3FaF1IzM6Efap6tQ9z1K6gvX1RT6JN+Q==, tarball: file:../vuejs/router/packages/router/vue-router-4.5.1.tgz} + version: 4.5.1 + peerDependencies: + vue: ^3.2.0 + vue-tsc@2.2.10: resolution: {integrity: sha512-jWZ1xSaNbabEV3whpIDMbjVSVawjAyW+x1n3JeGQo7S0uv2n9F/JMgWW90tGWNFRKya4YwKMZgCtr0vRAM7DeQ==} hasBin: true @@ -9646,6 +9697,11 @@ snapshots: js-beautify: 1.15.1 vue-component-type-helpers: 2.0.22 + '@vue/tsconfig@0.7.0(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2))': + optionalDependencies: + typescript: 5.9.2 + vue: 3.5.21(typescript@5.9.2) + '@vue/tsconfig@0.8.1(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2))': optionalDependencies: typescript: 5.9.2 @@ -14551,6 +14607,11 @@ snapshots: '@vue/devtools-api': 6.6.4 vue: 3.5.21(typescript@5.9.2) + vue-router@file:../vuejs/router/packages/router/vue-router-4.5.1.tgz(vue@3.5.21(typescript@5.9.2)): + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.5.21(typescript@5.9.2) + vue-tsc@2.2.10(typescript@5.9.2): dependencies: '@volar/typescript': 2.4.23 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 09b39bb23..016b9ff5e 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,5 +1,6 @@ packages: - playground + - playground-experimental - examples/* ignoredBuiltDependencies: - '@firebase/util' diff --git a/src/codegen/generateRouteResolver.spec.ts b/src/codegen/generateRouteResolver.spec.ts index 52dd9d4ba..19c96ddf3 100644 --- a/src/codegen/generateRouteResolver.spec.ts +++ b/src/codegen/generateRouteResolver.spec.ts @@ -69,7 +69,6 @@ describe('generateRouteResolver', () => { tree.insert('b/c', 'b/c.vue') tree.insert('b/c/d', 'b/c/d.vue') tree.insert('b/e/f', 'b/c/f.vue') - console.log(tree.getChildrenSorted()) const resolver = generateRouteResolver(tree, DEFAULT_OPTIONS, importsMap) expect(resolver).toMatchInlineSnapshot(` diff --git a/src/codegen/generateRouteResolver.ts b/src/codegen/generateRouteResolver.ts index 6b8d67b25..d547ed9ff 100644 --- a/src/codegen/generateRouteResolver.ts +++ b/src/codegen/generateRouteResolver.ts @@ -9,13 +9,15 @@ export function generateRouteResolver( options: ResolvedOptions, importsMap: ImportsMap ): string { - const state = { id: 0, recordVarNames: [] } + const state = { id: 0, recordVarNames: [] as string[] } const records = tree .getChildrenSorted() .map((node) => generateRouteRecord({ node, parentVar: null, state, options, importsMap }) ) + // TODO: add these imports to the import map instead + return ts` import { createStaticResolver, @@ -23,14 +25,6 @@ import { MatcherPatternPathCustomParams, MatcherPatternPathStar, normalizeRouteRecord, - // param matchers - PARAM_NUMBER, -} from 'vue-router/experimental' -import type { - EXPERIMENTAL_RouteRecordNormalized_Matchable, - MatcherPatternHash, - MatcherPatternQuery, - EmptyParams, } from 'vue-router/experimental' ${records.join('\n\n')} @@ -57,11 +51,13 @@ export function generateRouteRecord({ options: ResolvedOptions importsMap: ImportsMap }): string { + // TODO: skip nodes that add no value. Maybe it should be done at the level of the tree? const varName = `r_${state.id++}` let recordName: string let recordComponents: string + // TODO: what about groups? if (node.isMatchable()) { state.recordVarNames.push(varName) recordName = `name: '${node.name}',` @@ -127,10 +123,15 @@ ${indentStr}},` export function generateRouteRecordPathMatcher({ node }: { node: TreeNode }) { if (!node.isMatchable()) { return '' - } else if (node.value.isStatic()) { + // TODO: do we really need isGroup? + } else if (node.value.isStatic() || node.value.isGroup()) { return `path: new MatcherPatternPathStatic('${node.fullPath}'),` } else if (node.value.isParam()) { - return `path: new MatcherPatternPathCustomParams('${node.fullPath}'),` + return `path: new MatcherPatternPathCustomParams( + ${node.regexp}, + ${JSON.stringify(node.matcherParams)}, + ${JSON.stringify(node.matcherParts)}, + ),` } return `/* UNSUPPORTED path matcher for: "${node.fullPath}" */` diff --git a/src/core/context.ts b/src/core/context.ts index f07494aae..555c2fbec 100644 --- a/src/core/context.ts +++ b/src/core/context.ts @@ -21,6 +21,7 @@ import { definePageTransform, extractDefinePageNameAndPath } from './definePage' import { EditableTreeNode } from './extendRoutes' import { isPackageExists as isPackageInstalled } from 'local-pkg' import { ts } from '../utils' +import { generateRouteResolver } from '../codegen/generateRouteResolver' export function createRoutesContext(options: ResolvedOptions) { const { dts: preferDTS, root, routesFolder } = options @@ -181,6 +182,24 @@ export function createRoutesContext(options: ResolvedOptions) { // unlinkDir event } + function generateResolver() { + const importsMap = new ImportsMap() + + const resolverCode = generateRouteResolver(routeTree, options, importsMap) + + // generate the list of imports + let imports = importsMap.toString() + // add an empty line for readability + if (imports) { + imports += '\n' + } + + const newAutoRoutes = `${imports}${resolverCode}\n` + + // prepend it to the code + return newAutoRoutes + } + function generateRoutes() { const importsMap = new ImportsMap() @@ -190,7 +209,7 @@ export function createRoutesContext(options: ResolvedOptions) { importsMap )}\n` - let hmr = ts` + const hmr = ts` export function handleHotUpdate(_router, _hotUpdateCallback) { if (import.meta.hot) { import.meta.hot.data.router = _router @@ -305,6 +324,7 @@ if (import.meta.hot) { stopWatcher, generateRoutes, + generateResolver, generateVueRouterProxy, definePageTransform(code: string, id: string) { diff --git a/src/core/moduleConstants.ts b/src/core/moduleConstants.ts index c7dfa03d0..a21969340 100644 --- a/src/core/moduleConstants.ts +++ b/src/core/moduleConstants.ts @@ -4,6 +4,7 @@ export const MODULE_VUE_ROUTER_AUTO = 'vue-router/auto' // vue-router/auto/routes was more natural but didn't work well with TS export const MODULE_ROUTES_PATH = `${MODULE_VUE_ROUTER_AUTO}-routes` +export const MODULE_RESOLVER_PATH = `vue-router/auto-resolver` // NOTE: not sure if needed. Used for HMR the virtual routes let time = Date.now() @@ -27,7 +28,11 @@ export const VIRTUAL_PREFIX = '/__' // allows removing the route block from the code export const ROUTE_BLOCK_ID = `${VIRTUAL_PREFIX}/vue-router/auto/route-block` -export const MODULES_ID_LIST = [MODULE_VUE_ROUTER_AUTO, MODULE_ROUTES_PATH] +export const MODULES_ID_LIST = [ + MODULE_VUE_ROUTER_AUTO, + MODULE_ROUTES_PATH, + MODULE_RESOLVER_PATH, +] export function getVirtualId(id: string) { return id.startsWith(VIRTUAL_PREFIX) ? id.slice(VIRTUAL_PREFIX.length) : null diff --git a/src/core/tree.ts b/src/core/tree.ts index abc9335ea..2ea270d92 100644 --- a/src/core/tree.ts +++ b/src/core/tree.ts @@ -279,6 +279,46 @@ export class TreeNode { return params } + get regexp(): string { + let re = '' + let parent: TreeNode | undefined = this + + while (parent) { + if (parent.value.isParam() && parent.value.re) { + re = parent.value.re + (re ? '\\/' : '') + re + } else { + re = parent.value.pathSegment + (re ? '\\/' : '') + re + } + + parent = parent.parent + } + + return '/^' + re + '$/i' + } + + get matcherParams() { + const params: Record = {} + for (const param of this.params) { + params[param.paramName] = { + repeat: param.repeatable, + // TODO: parser + } + } + return params + } + + get matcherParts(): Array { + const parts: Array = [] + let node: TreeNode | undefined = this + + while (node && !node.isRoot()) { + parts.unshift(node.value.isParam() ? 0 : node.value.pathSegment) + node = node.parent + } + + return parts + } + isMatchable(): this is TreeNode & { name: string } { // a node is matchable if it has at least one component // and the name is not false diff --git a/src/core/treeNodeValue.ts b/src/core/treeNodeValue.ts index e2aabecc2..8dd0fc07e 100644 --- a/src/core/treeNodeValue.ts +++ b/src/core/treeNodeValue.ts @@ -228,6 +228,22 @@ export class TreeNodeValueParam extends _TreeNodeValueBase { super(rawSegment, parent, pathSegment, subSegments) this.params = params } + + get re(): string { + return this.subSegments + .filter(Boolean) + .map((segment) => { + if (typeof segment === 'string') { + // TODO: escape regexp from vue router source code + return segment.replaceAll('/', '\\/') + } + return ( + (segment.repeatable ? '(.+)' : '([^/]+)') + + (segment.optional ? '?' : '') + ) + }) + .join('') + } } export type TreeNodeValue = diff --git a/src/index.ts b/src/index.ts index 623d5304b..a6015cf46 100644 --- a/src/index.ts +++ b/src/index.ts @@ -10,6 +10,7 @@ import { ROUTES_LAST_LOAD_TIME, VIRTUAL_PREFIX, DEFINE_PAGE_QUERY_RE, + MODULE_RESOLVER_PATH, } from './core/moduleConstants' import { Options, @@ -66,6 +67,7 @@ export default createUnplugin((opt = {}, _meta) => { include: [ new RegExp(`^${MODULE_VUE_ROUTER_AUTO}$`), new RegExp(`^${MODULE_ROUTES_PATH}$`), + new RegExp(`^${MODULE_RESOLVER_PATH}$`), routeBlockQueryRE, ], }, @@ -73,7 +75,11 @@ export default createUnplugin((opt = {}, _meta) => { handler(id) { // vue-router/auto // vue-router/auto-routes - if (id === MODULE_ROUTES_PATH || id === MODULE_VUE_ROUTER_AUTO) { + if ( + id === MODULE_ROUTES_PATH || + id === MODULE_VUE_ROUTER_AUTO || + id === MODULE_RESOLVER_PATH + ) { // must be a virtual module return asVirtualId(id) } @@ -113,6 +119,7 @@ export default createUnplugin((opt = {}, _meta) => { new RegExp(`^${ROUTE_BLOCK_ID}$`), new RegExp(`^${VIRTUAL_PREFIX}${MODULE_VUE_ROUTER_AUTO}$`), new RegExp(`^${VIRTUAL_PREFIX}${MODULE_ROUTES_PATH}$`), + new RegExp(`^${VIRTUAL_PREFIX}${MODULE_RESOLVER_PATH}$`), ], }, }, @@ -136,6 +143,12 @@ export default createUnplugin((opt = {}, _meta) => { return ctx.generateRoutes() } + // vue-router/auto-resolver + if (resolvedId === MODULE_RESOLVER_PATH) { + ROUTES_LAST_LOAD_TIME.update() + return ctx.generateResolver() + } + // vue-router/auto if (resolvedId === MODULE_VUE_ROUTER_AUTO) { return ctx.generateVueRouterProxy() From 8a6cbb33f363ee8cc53be37a2b782fd1421a9f25 Mon Sep 17 00:00:00 2001 From: Eduardo San Martin Morote Date: Fri, 8 Aug 2025 17:52:08 +0200 Subject: [PATCH 06/81] chore: fix name in layout --- playground/src/pages/(some-layout).vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/playground/src/pages/(some-layout).vue b/playground/src/pages/(some-layout).vue index cf0fff14d..ba4dd01c9 100644 --- a/playground/src/pages/(some-layout).vue +++ b/playground/src/pages/(some-layout).vue @@ -1,6 +1,6 @@ From 672b1602476e9ac22796e1d1b8dcfe86d9e5bf01 Mon Sep 17 00:00:00 2001 From: Eduardo San Martin Morote Date: Fri, 8 Aug 2025 23:33:06 +0200 Subject: [PATCH 07/81] feat: sorting of experimental resolver --- src/codegen/generateRouteResolver.spec.ts | 64 +++++++++++++++-------- src/codegen/generateRouteResolver.ts | 44 ++++++++++------ src/core/tree.ts | 24 ++++++--- src/core/treeNodeValue.ts | 37 +++++++++++++ 4 files changed, 125 insertions(+), 44 deletions(-) diff --git a/src/codegen/generateRouteResolver.spec.ts b/src/codegen/generateRouteResolver.spec.ts index 19c96ddf3..e4ec21aeb 100644 --- a/src/codegen/generateRouteResolver.spec.ts +++ b/src/codegen/generateRouteResolver.spec.ts @@ -10,13 +10,13 @@ import { ImportsMap } from '../core/utils' const DEFAULT_OPTIONS = resolveOptions({}) let DEFAULT_STATE: Parameters[0]['state'] = { id: 0, - recordVarNames: [], + matchableRecords: [], } beforeEach(() => { DEFAULT_STATE = { id: 0, - recordVarNames: [], + matchableRecords: [], } }) @@ -73,22 +73,6 @@ describe('generateRouteResolver', () => { expect(resolver).toMatchInlineSnapshot(` " - import { - createStaticResolver, - MatcherPatternPathStatic, - MatcherPatternPathCustomParams, - MatcherPatternPathStar, - normalizeRouteRecord, - // param matchers - PARAM_NUMBER, - } from 'vue-router/experimental' - import type { - EXPERIMENTAL_RouteRecordNormalized_Matchable, - MatcherPatternHash, - MatcherPatternQuery, - EmptyParams, - } from 'vue-router/experimental' - const r_0 = normalizeRouteRecord({ name: '/a', path: new MatcherPatternPathStatic('/a'), @@ -130,10 +114,46 @@ describe('generateRouteResolver', () => { }) export const resolver = createStaticResolver([ - r_0, - r_2, - r_3, - r_5, + r_0, /* /a */ + r_2, /* /b/c */ + r_3, /* /b/c/d */ + r_5, /* /b/e/f */ + ]) + " + `) + }) + + it('orders records based on specificity of paths', () => { + const tree = new PrefixTree(DEFAULT_OPTIONS) + const importsMap = new ImportsMap() + tree.insert('a', 'a.vue') + tree.insert('b/a-b', 'b/c/d.vue') + tree.insert('b/a-[a]', 'b/c/d.vue') + tree.insert('b/a-[a]+', 'b/c/d.vue') + tree.insert('b/a-[[a]]', 'b/c/d.vue') + tree.insert('b/a-[[a]]+', 'b/c/d.vue') + tree.insert('b/[a]', 'b/c.vue') + tree.insert('b/[a]+', 'b/c/d.vue') + tree.insert('b/[[a]]', 'b/c/d.vue') + tree.insert('b/[[a]]+', 'b/c/d.vue') + tree.insert('[...all]', 'b/c/f.vue') + const resolver = generateRouteResolver(tree, DEFAULT_OPTIONS, importsMap) + + expect( + resolver.replace(/^.*?createStaticResolver/s, '') + ).toMatchInlineSnapshot(` + "([ + r_1, // /a + r_11, // /b/a-b + r_7, // /b/a-:a + r_8, // /b/a-:a? + r_10, // /b/a-:a+ + r_9, // /b/a-:a* + r_3, // /b/:a + r_4, // /b/:a? + r_6, // /b/:a+ + r_5, // /b/:a* + r_0, // /:all(.*) ]) " `) diff --git a/src/codegen/generateRouteResolver.ts b/src/codegen/generateRouteResolver.ts index d547ed9ff..e45694994 100644 --- a/src/codegen/generateRouteResolver.ts +++ b/src/codegen/generateRouteResolver.ts @@ -4,33 +4,44 @@ import { type ResolvedOptions } from '../options' import { ts } from '../utils' import { generatePageImport } from './generateRouteRecords' +interface GenerateRouteResolverState { + id: number + matchableRecords: { + path: string + varName: string + score: number + }[] +} + export function generateRouteResolver( tree: PrefixTree, options: ResolvedOptions, importsMap: ImportsMap ): string { - const state = { id: 0, recordVarNames: [] as string[] } + const state: GenerateRouteResolverState = { id: 0, matchableRecords: [] } const records = tree .getChildrenSorted() .map((node) => generateRouteRecord({ node, parentVar: null, state, options, importsMap }) ) - // TODO: add these imports to the import map instead + importsMap.add('vue-router/experimental', 'createStaticResolver') + importsMap.add('vue-router/experimental', 'MatcherPatternPathStatic') + importsMap.add('vue-router/experimental', 'MatcherPatternPathCustomParams') + importsMap.add('vue-router/experimental', 'MatcherPatternPathStar') + importsMap.add('vue-router/experimental', 'normalizeRouteRecord') return ts` -import { - createStaticResolver, - MatcherPatternPathStatic, - MatcherPatternPathCustomParams, - MatcherPatternPathStar, - normalizeRouteRecord, -} from 'vue-router/experimental' - ${records.join('\n\n')} export const resolver = createStaticResolver([ -${state.recordVarNames.map((varName) => ` ${varName},`).join('\n')} +${state.matchableRecords + .sort((a, b) => b.score - a.score) + .map( + ({ varName, path }) => + ` ${varName}, ${' '.repeat(String(state.id).length - varName.length + 2)}// ${path}` + ) + .join('\n')} ]) ` } @@ -44,10 +55,7 @@ export function generateRouteRecord({ }: { node: TreeNode parentVar: string | null | undefined - state: { - id: number - recordVarNames: string[] - } + state: GenerateRouteResolverState options: ResolvedOptions importsMap: ImportsMap }): string { @@ -59,7 +67,11 @@ export function generateRouteRecord({ // TODO: what about groups? if (node.isMatchable()) { - state.recordVarNames.push(varName) + state.matchableRecords.push({ + path: node.fullPath, + varName, + score: node.score, + }) recordName = `name: '${node.name}',` recordComponents = generateRouteRecordComponent( node, diff --git a/src/core/tree.ts b/src/core/tree.ts index 2ea270d92..3437a00ac 100644 --- a/src/core/tree.ts +++ b/src/core/tree.ts @@ -281,21 +281,33 @@ export class TreeNode { get regexp(): string { let re = '' - let parent: TreeNode | undefined = this + let node: TreeNode | undefined = this - while (parent) { - if (parent.value.isParam() && parent.value.re) { - re = parent.value.re + (re ? '\\/' : '') + re + while (node) { + if (node.value.isParam() && node.value.re) { + re = node.value.re + (re ? '\\/' : '') + re } else { - re = parent.value.pathSegment + (re ? '\\/' : '') + re + re = node.value.pathSegment + (re ? '\\/' : '') + re } - parent = parent.parent + node = node.parent } return '/^' + re + '$/i' } + get score(): number { + let score = 666 + let node: TreeNode | undefined = this + + while (node && !node.isRoot()) { + score = Math.min(score, node.value.score) + node = node.parent + } + + return score + } + get matcherParams() { const params: Record = {} for (const param of this.params) { diff --git a/src/core/treeNodeValue.ts b/src/core/treeNodeValue.ts index 8dd0fc07e..575f63069 100644 --- a/src/core/treeNodeValue.ts +++ b/src/core/treeNodeValue.ts @@ -179,9 +179,24 @@ class _TreeNodeValueBase { } } +/** + * - Static + * - Static + Custom Param (subSegments) + * - Static + Param (subSegments) + * - Custom Param + * - Param + * - CatchAll + */ + +/** + * Static path like `/users`, `/users/list`, etc + * @extends _TreeNodeValueBase + */ export class TreeNodeValueStatic extends _TreeNodeValueBase { override _type: TreeNodeType.static = TreeNodeType.static + readonly score = 300 + constructor( rawSegment: string, parent: TreeNodeValue | undefined, @@ -195,6 +210,8 @@ export class TreeNodeValueGroup extends _TreeNodeValueBase { override _type: TreeNodeType.group = TreeNodeType.group groupName: string + readonly score = 300 + constructor( rawSegment: string, parent: TreeNodeValue | undefined, @@ -229,6 +246,26 @@ export class TreeNodeValueParam extends _TreeNodeValueBase { this.params = params } + get score(): number { + const malus = Math.max( + ...this.params.map((p) => + p.isSplat ? 500 : (p.optional ? 10 : 0) + (p.repeatable ? 20 : 0) + ) + ) + + console.log(this.subSegments) + + return ( + 80 - + malus + + (this.params.length > 0 && + this.subSegments.length > 1 && + this.subSegments.some((s) => typeof s === 'string' && s.length > 0) + ? 35 + : 0) + ) + } + get re(): string { return this.subSegments .filter(Boolean) From 613fa6213b7266d9315bea9460e7a74e19f06994 Mon Sep 17 00:00:00 2001 From: Eduardo San Martin Morote Date: Sun, 10 Aug 2025 17:20:00 +0200 Subject: [PATCH 08/81] feat: parse custom param --- src/codegen/generateRouteResolver.spec.ts | 8 +- src/core/extendRoutes.spec.ts | 20 +++-- src/core/tree.spec.ts | 101 +++++++++++++++++++++- src/core/treeNodeValue.ts | 27 +++++- 4 files changed, 138 insertions(+), 18 deletions(-) diff --git a/src/codegen/generateRouteResolver.spec.ts b/src/codegen/generateRouteResolver.spec.ts index e4ec21aeb..421003206 100644 --- a/src/codegen/generateRouteResolver.spec.ts +++ b/src/codegen/generateRouteResolver.spec.ts @@ -114,10 +114,10 @@ describe('generateRouteResolver', () => { }) export const resolver = createStaticResolver([ - r_0, /* /a */ - r_2, /* /b/c */ - r_3, /* /b/c/d */ - r_5, /* /b/e/f */ + r_0, // /a + r_2, // /b/c + r_3, // /b/c/d + r_5, // /b/e/f ]) " `) diff --git a/src/core/extendRoutes.spec.ts b/src/core/extendRoutes.spec.ts index 608bcb8c4..3417efd1f 100644 --- a/src/core/extendRoutes.spec.ts +++ b/src/core/extendRoutes.spec.ts @@ -69,12 +69,13 @@ describe('EditableTreeNode', () => { const child = tree.children.get(':id')! expect(child.fullPath).toBe('/:id') expect(child.path).toBe('/:id') - expect(child.params).toEqual([ + expect(child.params).toMatchObject([ { paramName: 'id', modifier: '', optional: false, repeatable: false, + parser: null, isSplat: false, }, ]) @@ -89,9 +90,10 @@ describe('EditableTreeNode', () => { const child = tree.children.get(':id+')! expect(child.fullPath).toBe('/:id+') expect(child.path).toBe('/:id+') - expect(child.params).toEqual([ + expect(child.params).toMatchObject([ { paramName: 'id', + parser: null, modifier: '+', optional: false, repeatable: true, @@ -109,7 +111,7 @@ describe('EditableTreeNode', () => { const node = tree.children.get(':foo/:bar')! expect(node.fullPath).toBe('/:foo/:bar') expect(node.path).toBe('/:foo/:bar') - expect(node.params).toEqual([ + expect(node.params).toMatchObject([ { paramName: 'foo', modifier: '', @@ -136,7 +138,7 @@ describe('EditableTreeNode', () => { const node = tree.children.get(':foo/:bar+_:o(\\d+)')! expect(node.fullPath).toBe('/:foo/:bar+_:o(\\d+)') expect(node.path).toBe('/:foo/:bar+_:o(\\d+)') - expect(node.params).toEqual([ + expect(node.params).toMatchObject([ { paramName: 'foo', modifier: '', @@ -169,7 +171,7 @@ describe('EditableTreeNode', () => { const node = tree.children.get(':id(\\d+)')! expect(node.fullPath).toBe('/:id(\\d+)') expect(node.path).toBe('/:id(\\d+)') - expect(node.params).toEqual([ + expect(node.params).toMatchObject([ { paramName: 'id', modifier: '', @@ -188,7 +190,7 @@ describe('EditableTreeNode', () => { const node = tree.children.get(':id()')! expect(node.fullPath).toBe('/:id()') expect(node.path).toBe('/:id()') - expect(node.params).toEqual([ + expect(node.params).toMatchObject([ { paramName: 'id', modifier: '', @@ -207,7 +209,7 @@ describe('EditableTreeNode', () => { const node = tree.children.get(':id(\\d+)+')! expect(node.fullPath).toBe('/:id(\\d+)+') expect(node.path).toBe('/:id(\\d+)+') - expect(node.params).toEqual([ + expect(node.params).toMatchObject([ { paramName: 'id', modifier: '+', @@ -226,7 +228,7 @@ describe('EditableTreeNode', () => { const node = tree.children.get(':id()+')! expect(node.fullPath).toBe('/:id()+') expect(node.path).toBe('/:id()+') - expect(node.params).toEqual([ + expect(node.params).toMatchObject([ { paramName: 'id', modifier: '+', @@ -246,7 +248,7 @@ describe('EditableTreeNode', () => { const child = tree.children.get(':path(.*)')! expect(child.fullPath).toBe('/:path(.*)') expect(child.path).toBe('/:path(.*)') - expect(child.params).toEqual([ + expect(child.params).toMatchObject([ { paramName: 'path', modifier: '', diff --git a/src/core/tree.spec.ts b/src/core/tree.spec.ts index f3f696090..97c51e007 100644 --- a/src/core/tree.spec.ts +++ b/src/core/tree.spec.ts @@ -43,6 +43,103 @@ describe('Tree', () => { expect(child.children.size).toBe(0) }) + it('parses a custom param type', () => { + const tree = new PrefixTree(RESOLVED_OPTIONS) + tree.insert('[id=int]', '[id=int].vue') + const child = tree.children.get('[id=int]')! + expect(child).toBeDefined() + expect(child.value).toMatchObject({ + rawSegment: '[id=int]', + params: [ + { + paramName: 'id', + parser: 'int', + }, + ], + fullPath: '/:id', + _type: TreeNodeType.param, + }) + }) + + it('parses a repeatable custom param type', () => { + const tree = new PrefixTree(RESOLVED_OPTIONS) + tree.insert('[id=int]+', '[id=int]+.vue') + const child = tree.children.get('[id=int]+')! + expect(child).toBeDefined() + expect(child.value).toMatchObject({ + rawSegment: '[id=int]+', + params: [ + { + paramName: 'id', + parser: 'int', + repeatable: true, + modifier: '+', + }, + ], + fullPath: '/:id+', + _type: TreeNodeType.param, + }) + }) + + it('parses an optional custom param type', () => { + const tree = new PrefixTree(RESOLVED_OPTIONS) + tree.insert('[[id=int]]', '[[id=int]].vue') + const child = tree.children.get('[[id=int]]')! + expect(child).toBeDefined() + expect(child.value).toMatchObject({ + rawSegment: '[[id=int]]', + params: [ + { + paramName: 'id', + parser: 'int', + optional: true, + modifier: '?', + }, + ], + fullPath: '/:id?', + _type: TreeNodeType.param, + }) + }) + + it('parses a repeatable optional custom param type', () => { + const tree = new PrefixTree(RESOLVED_OPTIONS) + tree.insert('[[id=int]]+', '[[id=int]]+.vue') + const child = tree.children.get('[[id=int]]+')! + expect(child).toBeDefined() + expect(child.value).toMatchObject({ + rawSegment: '[[id=int]]+', + params: [ + { + paramName: 'id', + parser: 'int', + repeatable: true, + optional: true, + modifier: '*', + }, + ], + fullPath: '/:id*', + _type: TreeNodeType.param, + }) + }) + + it('parses a custom param type with sub segments', () => { + const tree = new PrefixTree(RESOLVED_OPTIONS) + tree.insert('a-[id=int]-b', 'file.vue') + const child = tree.children.get('a-[id=int]-b')! + expect(child).toBeDefined() + expect(child.value).toMatchObject({ + rawSegment: 'a-[id=int]-b', + params: [ + { + paramName: 'id', + parser: 'int', + }, + ], + fullPath: '/a-:id-b', + _type: TreeNodeType.param, + }) + }) + it('separate param names from static segments', () => { const tree = new PrefixTree(RESOLVED_OPTIONS) tree.insert('[id]_a', '[id]_a.vue') @@ -452,13 +549,13 @@ describe('Tree', () => { path: '/:a()/new-b', }) expect(node.params).toHaveLength(1) - expect(node.params[0]).toEqual({ + expect(node.params[0]).toMatchObject({ paramName: 'a', isSplat: false, modifier: '', optional: false, repeatable: false, - } satisfies TreeRouteParam) + } satisfies Partial) }) it('removes trailing slash from path but not from name', () => { diff --git a/src/core/treeNodeValue.ts b/src/core/treeNodeValue.ts index 575f63069..e2105e220 100644 --- a/src/core/treeNodeValue.ts +++ b/src/core/treeNodeValue.ts @@ -229,6 +229,7 @@ export interface TreeRouteParam { optional: boolean repeatable: boolean isSplat: boolean + parser: string | null } export class TreeNodeValueParam extends _TreeNodeValueBase { @@ -253,8 +254,6 @@ export class TreeNodeValueParam extends _TreeNodeValueBase { ) ) - console.log(this.subSegments) - return ( 80 - malus + @@ -384,6 +383,7 @@ const enum ParseFileSegmentState { static, paramOptional, // within [[]] or [] param, // within [] + paramParser, // [param=type] modifier, // after the ] } @@ -414,6 +414,7 @@ function parseFileSegment( { dotNesting = true }: ParseSegmentOptions = {} ): [string, TreeRouteParam[], SubSegment[]] { let buffer = '' + let paramParserBuffer = '' let state: ParseFileSegmentState = ParseFileSegmentState.static const params: TreeRouteParam[] = [] let pathSegment = '' @@ -432,6 +433,7 @@ function parseFileSegment( subSegments.push(buffer) } else if (state === ParseFileSegmentState.modifier) { currentTreeRouteParam.paramName = buffer + currentTreeRouteParam.parser = paramParserBuffer || null currentTreeRouteParam.modifier = currentTreeRouteParam.optional ? currentTreeRouteParam.repeatable ? '*' @@ -439,7 +441,11 @@ function parseFileSegment( : currentTreeRouteParam.repeatable ? '+' : '' + + // reset the buffers buffer = '' + paramParserBuffer = '' + pathSegment += `:${currentTreeRouteParam.paramName}${ currentTreeRouteParam.isSplat ? '(.*)' @@ -491,6 +497,9 @@ function parseFileSegment( } else if (c === '.') { currentTreeRouteParam.isSplat = true pos += 2 // skip the other 2 dots + } else if (c === '=') { + state = ParseFileSegmentState.paramParser + paramParserBuffer = '' } else { buffer += c } @@ -504,12 +513,23 @@ function parseFileSegment( consumeBuffer() // start again state = ParseFileSegmentState.static + } else if (state === ParseFileSegmentState.paramParser) { + if (c === ']') { + if (currentTreeRouteParam.optional) { + // skip the next ] + pos++ + } + state = ParseFileSegmentState.modifier + } else { + paramParserBuffer += c + } } } if ( state === ParseFileSegmentState.param || - state === ParseFileSegmentState.paramOptional + state === ParseFileSegmentState.paramOptional || + state === ParseFileSegmentState.paramParser ) { throw new Error(`Invalid segment: "${segment}"`) } @@ -674,6 +694,7 @@ function parseRawPathSegment( function createEmptyRouteParam(): TreeRouteParam { return { paramName: '', + parser: null, modifier: '', optional: false, repeatable: false, From 3cbe471d19cb57b357bc7a3fd4dcf828fe029a06 Mon Sep 17 00:00:00 2001 From: Eduardo San Martin Morote Date: Sun, 10 Aug 2025 17:20:13 +0200 Subject: [PATCH 09/81] chore: custom param in playground --- .../src/pages/users/{[userId].vue => [userId=int].vue} | 0 playground-experimental/typed-router.d.ts | 6 +++--- playground-experimental/vite.config.ts | 4 ---- 3 files changed, 3 insertions(+), 7 deletions(-) rename playground-experimental/src/pages/users/{[userId].vue => [userId=int].vue} (100%) diff --git a/playground-experimental/src/pages/users/[userId].vue b/playground-experimental/src/pages/users/[userId=int].vue similarity index 100% rename from playground-experimental/src/pages/users/[userId].vue rename to playground-experimental/src/pages/users/[userId=int].vue diff --git a/playground-experimental/typed-router.d.ts b/playground-experimental/typed-router.d.ts index 7d3994fa7..09d3ac953 100644 --- a/playground-experimental/typed-router.d.ts +++ b/playground-experimental/typed-router.d.ts @@ -21,7 +21,7 @@ declare module 'vue-router/auto-routes' { '/(home)': RouteRecordInfo<'/(home)', '/', Record, Record>, '/[name]': RouteRecordInfo<'/[name]', '/:name', { name: ParamValue }, { name: ParamValue }>, '/a.[b].c.[d]': RouteRecordInfo<'/a.[b].c.[d]', '/a/:b/c/:d', { b: ParamValue, d: ParamValue }, { b: ParamValue, d: ParamValue }>, - '/users/[userId]': RouteRecordInfo<'/users/[userId]', '/users/:userId', { userId: ParamValue }, { userId: ParamValue }>, + '/users/[userId=int]': RouteRecordInfo<'/users/[userId=int]', '/users/:userId', { userId: ParamValue }, { userId: ParamValue }>, '/users/sub-[first]-[second]': RouteRecordInfo<'/users/sub-[first]-[second]', '/users/sub-:first-:second', { first: ParamValue, second: ParamValue }, { first: ParamValue, second: ParamValue }>, } @@ -48,8 +48,8 @@ declare module 'vue-router/auto-routes' { routes: '/a.[b].c.[d]' views: never } - 'src/pages/users/[userId].vue': { - routes: '/users/[userId]' + 'src/pages/users/[userId=int].vue': { + routes: '/users/[userId=int]' views: never } 'src/pages/users/sub-[first]-[second].vue': { diff --git a/playground-experimental/vite.config.ts b/playground-experimental/vite.config.ts index 3c6cd7af5..ffbb999f9 100644 --- a/playground-experimental/vite.config.ts +++ b/playground-experimental/vite.config.ts @@ -58,10 +58,6 @@ export default defineConfig({ // route.delete() // } - if (route.name === '/a.[b].c.[d]') { - console.log(route.node) - } - if (route.name === '/[name]') { // TODO: implement aliases // route.addAlias('/hello-vite-:name') From 2ab8dad1d14f7bc4109ef6a94ba6a755d9b0bb46 Mon Sep 17 00:00:00 2001 From: Eduardo San Martin Morote Date: Mon, 11 Aug 2025 11:15:21 +0200 Subject: [PATCH 10/81] feat: types + runtime of param parsers on path --- playground-experimental/tsconfig.json | 14 +++-- playground-experimental/typed-router.d.ts | 8 +-- src/codegen/generateParamParsers.ts | 74 +++++++++++++++++++++++ src/codegen/generateRouteMap.ts | 44 +++++++++++--- src/codegen/generateRouteParams.ts | 29 +++++++++ src/codegen/generateRouteResolver.ts | 13 +++- src/core/context.ts | 2 +- 7 files changed, 164 insertions(+), 20 deletions(-) create mode 100644 src/codegen/generateParamParsers.ts diff --git a/playground-experimental/tsconfig.json b/playground-experimental/tsconfig.json index 5fe7d55ab..7106ea827 100644 --- a/playground-experimental/tsconfig.json +++ b/playground-experimental/tsconfig.json @@ -9,13 +9,19 @@ "../src" ], "compilerOptions": { - // "baseUrl": ".", + "baseUrl": ".", "composite": true, "moduleResolution": "Bundler", "paths": { - "@/*": ["./src/*"], - "unplugin-vue-router/runtime": ["../src/runtime.ts"], - "unplugin-vue-router/types": ["../src/types.ts"], + "@/*": [ + "./src/*" + ], + "unplugin-vue-router/runtime": [ + "../src/runtime.ts" + ], + "unplugin-vue-router/types": [ + "../src/types.ts" + ], "unplugin-vue-router/data-loaders": [ "../src/data-loaders/entries/index.ts" ], diff --git a/playground-experimental/typed-router.d.ts b/playground-experimental/typed-router.d.ts index 09d3ac953..521ad4c9d 100644 --- a/playground-experimental/typed-router.d.ts +++ b/playground-experimental/typed-router.d.ts @@ -19,10 +19,10 @@ declare module 'vue-router/auto-routes' { */ export interface RouteNamedMap { '/(home)': RouteRecordInfo<'/(home)', '/', Record, Record>, - '/[name]': RouteRecordInfo<'/[name]', '/:name', { name: ParamValue }, { name: ParamValue }>, - '/a.[b].c.[d]': RouteRecordInfo<'/a.[b].c.[d]', '/a/:b/c/:d', { b: ParamValue, d: ParamValue }, { b: ParamValue, d: ParamValue }>, - '/users/[userId=int]': RouteRecordInfo<'/users/[userId=int]', '/users/:userId', { userId: ParamValue }, { userId: ParamValue }>, - '/users/sub-[first]-[second]': RouteRecordInfo<'/users/sub-[first]-[second]', '/users/sub-:first-:second', { first: ParamValue, second: ParamValue }, { first: ParamValue, second: ParamValue }>, + '/[name]': RouteRecordInfo<'/[name]', '/:name', { name: ParamValue }, { name: ParamValue }>, + '/a.[b].c.[d]': RouteRecordInfo<'/a.[b].c.[d]', '/a/:b/c/:d', { b: ParamValue, d: ParamValue }, { b: ParamValue, d: ParamValue }>, + '/users/[userId=int]': RouteRecordInfo<'/users/[userId=int]', '/users/:userId', { userId: number }, { userId: number }>, + '/users/sub-[first]-[second]': RouteRecordInfo<'/users/sub-[first]-[second]', '/users/sub-:first-:second', { first: ParamValue, second: ParamValue }, { first: ParamValue, second: ParamValue }>, } /** diff --git a/src/codegen/generateParamParsers.ts b/src/codegen/generateParamParsers.ts new file mode 100644 index 000000000..a5d1b0499 --- /dev/null +++ b/src/codegen/generateParamParsers.ts @@ -0,0 +1,74 @@ +import { camelCase } from 'scule' +import { TreeRouteParam } from '../core/treeNodeValue' +import { ImportsMap } from '../core/utils' + +/** + * Represents the type information for a parameter parser. + * It includes the type declaration string and the type name. + */ +export type ParamParserTypeInfo = [typeDeclaration: string, type: string] + +/** + * Generates the import statement for a parameter parser type. + * + * @param paramParserPath - The path to the parameter parser file. + */ +export function generateParamParserTypeImport( + param: TreeRouteParam +): ParamParserTypeInfo | null { + if (!param.parser) { + return null + } + // TODO: actualpath + // const nameWithExtension = basename(param.paramName) + const name = camelCase(param.parser) + + // TODO: treat custom parsers first + + // native parsers + if (name === 'int') { + return [``, 'number'] + } + + return [ + `type Param_${name} ReturnType`, + `Param_${name}`, + ] +} + +export function generateParamsTypeDeclarations( + params: TreeRouteParam[] +): Array { + return params.map((param) => generateParamParserTypeImport(param)) +} + +// TODO: generate the whole list of type declarations + +function generateParamParser( + param: TreeRouteParam, + importsMap: ImportsMap +): string { + // TODO: lookup into src/params based on options + // otherwise try native parsers + if (param.parser === 'int') { + importsMap.add('vue-router/experimental', `PARAM_PARSER_INT`) + return ` ...PARAM_PARSER_INT, ` + } + return '' +} + +export function generateParamOptions( + params: TreeRouteParam[], + importsMap: ImportsMap +) { + const paramOptions = params.map((param) => { + const repeatable = param.repeatable ? `repeat: true, ` : '' + return ` + ${param.paramName}: {${generateParamParser(param, importsMap)}${repeatable}}, +` + }) + + return `{ +${paramOptions.join('\n')} + }` +} diff --git a/src/codegen/generateRouteMap.ts b/src/codegen/generateRouteMap.ts index 0454f9908..360bfb346 100644 --- a/src/codegen/generateRouteMap.ts +++ b/src/codegen/generateRouteMap.ts @@ -1,30 +1,58 @@ import type { TreeNode } from '../core/tree' -import { generateRouteParams } from './generateRouteParams' +import { ResolvedOptions } from '../options' +import { + generateParamsTypeDeclarations, + ParamParserTypeInfo, +} from './generateParamParsers' +import { + EXPERIMENTAL_generateRouteParams, + generateRouteParams, +} from './generateRouteParams' -export function generateRouteNamedMap(node: TreeNode): string { +export function generateRouteNamedMap( + node: TreeNode, + options: ResolvedOptions +): string { if (node.isRoot()) { return `export interface RouteNamedMap { -${node.getChildrenSorted().map(generateRouteNamedMap).join('')}}` +${node + .getChildrenSorted() + .map((n) => generateRouteNamedMap(n, options)) + .join('')}}` } return ( // if the node has a filePath, it's a component, it has a routeName and it should be referenced in the RouteNamedMap // otherwise it should be skipped to avoid navigating to a route that doesn't render anything (node.value.components.size > 0 && node.name - ? ` '${node.name}': ${generateRouteRecordInfo(node)},\n` + ? ` '${node.name}': ${generateRouteRecordInfo(node, options)},\n` : '') + (node.children.size > 0 - ? node.getChildrenSorted().map(generateRouteNamedMap).join('\n') + ? node + .getChildrenSorted() + .map((n) => generateRouteNamedMap(n, options)) + .join('\n') : '') ) } -export function generateRouteRecordInfo(node: TreeNode) { +export function generateRouteRecordInfo( + node: TreeNode, + options: ResolvedOptions +): string { + const params = node.params + let paramParsers: Array = [] + let paramType: string = '' + if (options.experimental.paramMatchers) { + paramParsers = generateParamsTypeDeclarations(params) + console.log(paramParsers) + paramType = EXPERIMENTAL_generateRouteParams(node, paramParsers) + } const typeParams = [ `'${node.name}'`, `'${node.fullPath}'`, - generateRouteParams(node, true), - generateRouteParams(node, false), + paramType || generateRouteParams(node, true), + paramType || generateRouteParams(node, false), ] if (node.children.size > 0) { diff --git a/src/codegen/generateRouteParams.ts b/src/codegen/generateRouteParams.ts index 28e94e64d..b11084816 100644 --- a/src/codegen/generateRouteParams.ts +++ b/src/codegen/generateRouteParams.ts @@ -1,4 +1,5 @@ import { TreeNode } from '../core/tree' +import { ParamParserTypeInfo } from './generateParamParsers' export function generateRouteParams(node: TreeNode, isRaw: boolean): string { // node.params is a getter so we compute it once @@ -21,6 +22,34 @@ export function generateRouteParams(node: TreeNode, isRaw: boolean): string { 'Record' } +export function EXPERIMENTAL_generateRouteParams( + node: TreeNode, + types: Array +) { + // node.params is a getter so we compute it once + const nodeParams = node.params + return nodeParams.length > 0 + ? `{ ${nodeParams + .map((param, i) => { + const type = types[i] + const isRaw = false + return `${param.paramName}${param.optional ? '?' : ''}: ${ + type + ? type[1] || '/* INVALID */ unknown' + : param.modifier === '+' + ? `ParamValueOneOrMore<${isRaw}>` + : param.modifier === '*' + ? `ParamValueZeroOrMore<${isRaw}>` + : param.modifier === '?' + ? `ParamValueZeroOrOne<${isRaw}>` + : `ParamValue<${isRaw}>` + }` + }) + .join(', ')} }` + : // no params allowed + 'Record' +} + // TODO: refactor to ParamValueRaw and ParamValue ? /** diff --git a/src/codegen/generateRouteResolver.ts b/src/codegen/generateRouteResolver.ts index e45694994..99671dfe6 100644 --- a/src/codegen/generateRouteResolver.ts +++ b/src/codegen/generateRouteResolver.ts @@ -2,6 +2,7 @@ import { PrefixTree, type TreeNode } from '../core/tree' import { ImportsMap } from '../core/utils' import { type ResolvedOptions } from '../options' import { ts } from '../utils' +import { generateParamOptions } from './generateParamParsers' import { generatePageImport } from './generateRouteRecords' interface GenerateRouteResolverState { @@ -87,7 +88,7 @@ export function generateRouteRecord({ const recordDeclaration = ` const ${varName} = normalizeRouteRecord({ ${recordName} - ${generateRouteRecordPathMatcher({ node })} + ${generateRouteRecordPathMatcher({ node, importsMap })} ${recordComponents} ${parentVar ? `parent: ${parentVar},` : ''} }) @@ -132,7 +133,13 @@ ${files ${indentStr}},` } -export function generateRouteRecordPathMatcher({ node }: { node: TreeNode }) { +export function generateRouteRecordPathMatcher({ + node, + importsMap, +}: { + node: TreeNode + importsMap: ImportsMap +}) { if (!node.isMatchable()) { return '' // TODO: do we really need isGroup? @@ -141,7 +148,7 @@ export function generateRouteRecordPathMatcher({ node }: { node: TreeNode }) { } else if (node.value.isParam()) { return `path: new MatcherPatternPathCustomParams( ${node.regexp}, - ${JSON.stringify(node.matcherParams)}, + ${generateParamOptions(node.params, importsMap)}, ${JSON.stringify(node.matcherParts)}, ),` } diff --git a/src/core/context.ts b/src/core/context.ts index 555c2fbec..b175e343f 100644 --- a/src/core/context.ts +++ b/src/core/context.ts @@ -261,7 +261,7 @@ if (import.meta.hot) { return _generateDTS({ vueRouterModule: MODULE_VUE_ROUTER_AUTO, routesModule: MODULE_ROUTES_PATH, - routeNamedMap: generateRouteNamedMap(routeTree), + routeNamedMap: generateRouteNamedMap(routeTree, options), routeFileInfoMap: generateRouteFileInfoMap(routeTree, { root, }), From 6c65c9e7e18ed7006ab47f7f54c4291b568b6b96 Mon Sep 17 00:00:00 2001 From: Eduardo San Martin Morote Date: Mon, 11 Aug 2025 11:40:09 +0200 Subject: [PATCH 11/81] refactor: simplify options by placing them in tree --- .../src/pages/users/[userId=int].vue | 11 +++++++++- src/codegen/generateRouteMap.ts | 21 +++++++------------ src/core/context.ts | 2 +- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/playground-experimental/src/pages/users/[userId=int].vue b/playground-experimental/src/pages/users/[userId=int].vue index 29b5f2e77..37940c487 100644 --- a/playground-experimental/src/pages/users/[userId=int].vue +++ b/playground-experimental/src/pages/users/[userId=int].vue @@ -1,4 +1,13 @@ - +