From 7a2fe0756ce75930575b2597ffbabda5aaffeb8e Mon Sep 17 00:00:00 2001 From: VChet <17050347+VChet@users.noreply.github.com> Date: Sat, 11 Oct 2025 22:35:04 +0500 Subject: [PATCH] feat(router): use typed router Co-authored-by: rudnovd --- eslint.config.ts | 3 +- package.json | 1 + pnpm-lock.yaml | 91 ++++++++++++++ src/components/event-card.vue | 2 +- src/components/main-nav.vue | 9 +- .../CalendarView.vue => pages/calendar.vue} | 51 ++++---- .../calendar/month.vue} | 6 +- .../WeekView.vue => pages/calendar/week.vue} | 0 .../YearView.vue => pages/calendar/year.vue} | 0 .../constellations/[month].vue} | 4 +- .../constellations/index.vue} | 4 +- .../HolidayView.vue => pages/holiday.vue} | 4 +- src/pages/index.vue | 3 + .../moon-phase.vue} | 2 + .../onboarding.vue} | 2 + .../SearchView.vue => pages/search.vue} | 2 + .../SettingsView.vue => pages/settings.vue} | 2 + .../summoning-day.vue} | 4 +- src/plugins/router.ts | 109 +---------------- src/types/router.ts | 3 + src/types/typed-router.ts | 111 ++++++++++++++++++ tsconfig.json | 2 +- vite.config.ts | 21 ++++ 23 files changed, 295 insertions(+), 141 deletions(-) rename src/{views/CalendarView.vue => pages/calendar.vue} (62%) rename src/{views/calendar/MonthView.vue => pages/calendar/month.vue} (94%) rename src/{views/calendar/WeekView.vue => pages/calendar/week.vue} (100%) rename src/{views/calendar/YearView.vue => pages/calendar/year.vue} (100%) rename src/{views/ConstellationView.vue => pages/constellations/[month].vue} (95%) rename src/{views/ConstellationsView.vue => pages/constellations/index.vue} (91%) rename src/{views/HolidayView.vue => pages/holiday.vue} (95%) create mode 100644 src/pages/index.vue rename src/{views/MoonPhaseView.vue => pages/moon-phase.vue} (97%) rename src/{views/OnboardingView.vue => pages/onboarding.vue} (95%) rename src/{views/SearchView.vue => pages/search.vue} (96%) rename src/{views/SettingsView.vue => pages/settings.vue} (98%) rename src/{views/SummoningDayView.vue => pages/summoning-day.vue} (95%) create mode 100644 src/types/typed-router.ts diff --git a/eslint.config.ts b/eslint.config.ts index e21758b..6504de5 100644 --- a/eslint.config.ts +++ b/eslint.config.ts @@ -10,7 +10,8 @@ const SORT_IMPORT_CUSTOM_GROUP = { export default antfu({ toml: false, isInEditor: false, - ignores: ["src/scripts/*.js"], + ignores: ["src/scripts/*.js", "**/typed-router.ts"] +}, { rules: { "antfu/consistent-list-newline": "off", "antfu/if-newline": "off", diff --git a/package.json b/package.json index 551472c..f98ed5f 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ "stylelint-order": "^7.0.0", "stylelint-rem-over-px": "^1.0.2", "typescript": "^5.9.3", + "unplugin-vue-router": "^0.15.0", "vue-tsc": "^3.1.0", "workbox-build": "^7.3.0", "workbox-core": "^7.3.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3ec18f6..860918a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -95,6 +95,9 @@ importers: typescript: specifier: ^5.9.3 version: 5.9.3 + unplugin-vue-router: + specifier: ^0.15.0 + version: 0.15.0(@vue/compiler-sfc@3.5.22)(typescript@5.9.3)(vue-router@4.5.1(vue@3.5.22(typescript@5.9.3)))(vue@3.5.22(typescript@5.9.3)) vue-tsc: specifier: ^3.1.0 version: 3.1.0(typescript@5.9.3) @@ -1475,6 +1478,15 @@ packages: '@volar/typescript@2.4.23': resolution: {integrity: sha512-lAB5zJghWxVPqfcStmAP1ZqQacMpe90UrP5RJ3arDyrhy4aCUQqmxPPLB2PWDKugvylmO41ljK7vZ+t6INMTag==} + '@vue-macros/common@3.0.0-beta.16': + resolution: {integrity: sha512-8O2gWxWFiaoNkk7PGi0+p7NPGe/f8xJ3/INUufvje/RZOs7sJvlI1jnR4lydtRFa/mU0ylMXUXXjSK0fHDEYTA==} + engines: {node: '>=20.18.0'} + peerDependencies: + vue: ^2.7.0 || ^3.2.25 + peerDependenciesMeta: + vue: + optional: true + '@vue/compiler-core@3.5.22': resolution: {integrity: sha512-jQ0pFPmZwTEiRNSb+i9Ow/I/cHv2tXYqsnHKKyCQ08irI2kdF5qmYedmF8si8mA7zepUFmJ2hqzS8CQmNOWOkQ==} @@ -1574,6 +1586,14 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} + ast-kit@2.1.2: + resolution: {integrity: sha512-cl76xfBQM6pztbrFWRnxbrDm9EOqDr1BF6+qQnnDZG2Co2LjyUktkN9GTJfBAfdae+DbT2nJf2nCGAdDDN7W2g==} + engines: {node: '>=20.18.0'} + + ast-walker-scope@0.8.2: + resolution: {integrity: sha512-3pYeLyDZ6nJew9QeBhS4Nly02269Dkdk32+zdbbKmL6n4ZuaGorwwA+xx12xgOciA8BF1w9x+dlH7oUkFTW91w==} + engines: {node: '>=20.18.0'} + astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} @@ -2495,6 +2515,10 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + magic-string-ast@1.0.2: + resolution: {integrity: sha512-8ngQgLhcT0t3YBdn9CGkZqCYlvwW9pm7aWJwd7AxseVWf1RU8ZHCQvG1mt3N5vvUme+pXTcHB8G/7fE666U8Vw==} + engines: {node: '>=20.18.0'} + magic-string@0.25.9: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} @@ -3417,10 +3441,23 @@ packages: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} + unplugin-utils@0.2.5: + resolution: {integrity: sha512-gwXJnPRewT4rT7sBi/IvxKTjsms7jX7QIDLOClApuZwR49SXbrB1z2NLUZ+vDHyqCj/n58OzRRqaW+B8OZi8vg==} + engines: {node: '>=18.12.0'} + unplugin-utils@0.3.0: resolution: {integrity: sha512-JLoggz+PvLVMJo+jZt97hdIIIZ2yTzGgft9e9q8iMrC4ewufl62ekeW7mixBghonn2gVb/ICjyvlmOCUBnJLQg==} engines: {node: '>=20.19.0'} + unplugin-vue-router@0.15.0: + resolution: {integrity: sha512-PyGehCjd9Ny9h+Uer4McbBjjib3lHihcyUEILa7pHKl6+rh8N7sFyw4ZkV+N30Oq2zmIUG7iKs3qpL0r+gXAaQ==} + peerDependencies: + '@vue/compiler-sfc': ^3.5.17 + vue-router: ^4.5.1 + peerDependenciesMeta: + vue-router: + optional: true + unplugin@2.3.10: resolution: {integrity: sha512-6NCPkv1ClwH+/BGE9QeoTIl09nuiAt0gS28nn1PvYXsGKRwM2TCbFA2QiilmehPDTXIe684k4rZI1yl3A1PCUw==} engines: {node: '>=18.12.0'} @@ -5199,6 +5236,16 @@ snapshots: path-browserify: 1.0.1 vscode-uri: 3.1.0 + '@vue-macros/common@3.0.0-beta.16(vue@3.5.22(typescript@5.9.3))': + dependencies: + '@vue/compiler-sfc': 3.5.22 + ast-kit: 2.1.2 + local-pkg: 1.1.2 + magic-string-ast: 1.0.2 + unplugin-utils: 0.2.5 + optionalDependencies: + vue: 3.5.22(typescript@5.9.3) + '@vue/compiler-core@3.5.22': dependencies: '@babel/parser': 7.28.4 @@ -5319,6 +5366,16 @@ snapshots: assertion-error@2.0.1: optional: true + ast-kit@2.1.2: + dependencies: + '@babel/parser': 7.28.4 + pathe: 2.0.3 + + ast-walker-scope@0.8.2: + dependencies: + '@babel/parser': 7.28.4 + ast-kit: 2.1.2 + astral-regex@2.0.0: {} async@3.2.6: {} @@ -6248,6 +6305,10 @@ snapshots: dependencies: yallist: 3.1.1 + magic-string-ast@1.0.2: + dependencies: + magic-string: 0.30.19 + magic-string@0.25.9: dependencies: sourcemap-codec: 1.4.8 @@ -7356,11 +7417,41 @@ snapshots: universalify@2.0.1: {} + unplugin-utils@0.2.5: + dependencies: + pathe: 2.0.3 + picomatch: 4.0.3 + unplugin-utils@0.3.0: dependencies: pathe: 2.0.3 picomatch: 4.0.3 + unplugin-vue-router@0.15.0(@vue/compiler-sfc@3.5.22)(typescript@5.9.3)(vue-router@4.5.1(vue@3.5.22(typescript@5.9.3)))(vue@3.5.22(typescript@5.9.3)): + dependencies: + '@vue-macros/common': 3.0.0-beta.16(vue@3.5.22(typescript@5.9.3)) + '@vue/compiler-sfc': 3.5.22 + '@vue/language-core': 3.1.0(typescript@5.9.3) + ast-walker-scope: 0.8.2 + chokidar: 4.0.3 + json5: 2.2.3 + local-pkg: 1.1.2 + magic-string: 0.30.19 + mlly: 1.8.0 + muggle-string: 0.4.1 + pathe: 2.0.3 + picomatch: 4.0.3 + scule: 1.3.0 + tinyglobby: 0.2.15 + unplugin: 2.3.10 + unplugin-utils: 0.2.5 + yaml: 2.8.1 + optionalDependencies: + vue-router: 4.5.1(vue@3.5.22(typescript@5.9.3)) + transitivePeerDependencies: + - typescript + - vue + unplugin@2.3.10: dependencies: '@jridgewell/remapping': 2.3.5 diff --git a/src/components/event-card.vue b/src/components/event-card.vue index 9ded74e..0a43b89 100644 --- a/src/components/event-card.vue +++ b/src/components/event-card.vue @@ -22,7 +22,7 @@ import { Holiday, type SummoningDay } from "@/classes/Event"; const props = defineProps<{ event: Holiday | SummoningDay }>(); -const routeName = props.event instanceof Holiday ? "Holiday" : "SummoningDay"; +const routeName = props.event instanceof Holiday ? "Holiday" : "Summoning Day";