Skip to content
This repository was archived by the owner on Feb 24, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
81 commits
Select commit Hold shift + click to select a range
b744abb
feat: add new experimental option
posva Aug 7, 2025
fe9da99
feat: support static paths for resolver
posva Aug 7, 2025
8e0a7a2
refactor: missing import type
posva Aug 7, 2025
f4ad320
chore: remove baseUrl from tsconfig
posva Aug 7, 2025
81e088e
chore: add experimental playground
posva Aug 8, 2025
8a6cbb3
chore: fix name in layout
posva Aug 8, 2025
672b160
feat: sorting of experimental resolver
posva Aug 8, 2025
613fa62
feat: parse custom param
posva Aug 10, 2025
3cbe471
chore: custom param in playground
posva Aug 10, 2025
2ab8dad
feat: types + runtime of param parsers on path
posva Aug 11, 2025
6c65c9e
refactor: simplify options by placing them in tree
posva Aug 11, 2025
914908b
feat: support custom params folder
posva Aug 13, 2025
53209aa
refactor: rename import as
posva Aug 13, 2025
928e6f3
refactor: fixes
posva Aug 15, 2025
3cc9afa
chore: fix package install
posva Aug 15, 2025
0638535
ci: update packages
posva Aug 15, 2025
4adf69a
refactor: place sub segments
posva Aug 15, 2025
8e255e4
fix: handle subsegments
posva Aug 15, 2025
be601e2
chore: up vue router
posva Aug 15, 2025
246106d
fix: non greedy param
posva Aug 15, 2025
b4fe703
fix: proper scoring
posva Aug 15, 2025
3171dfe
feat: remove empty parents from routes
posva Aug 15, 2025
77275d7
chore: rename to test 404 page
posva Aug 15, 2025
5f95cde
chore: add meta to page
posva Aug 15, 2025
2d10fcf
feat: support meta properties
posva Aug 15, 2025
2b2a0fd
style: fix code style
autofix-ci[bot] Aug 15, 2025
43ef24c
Update src/codegen/generateParamParsers.ts
posva Aug 16, 2025
54eb0a9
chore: delete unused file
posva Aug 16, 2025
b07c37a
chore: simplify playground
posva Aug 16, 2025
4e12c2f
chore: todo in editable tree
posva Aug 16, 2025
f97c011
refactor: glob for param parsers
posva Aug 16, 2025
9630947
fix: escape regex in paths
posva Aug 16, 2025
be007b1
chore: import from node:fs
posva Aug 16, 2025
30e8455
chore: unused import'
posva Aug 16, 2025
c50eddd
chore: unused error
posva Aug 16, 2025
24ca324
refactor: simpler merge
posva Aug 16, 2025
3788f5e
fix: types in helper
posva Aug 16, 2025
b7b4ed8
chore: fix __dirname usage
posva Aug 16, 2025
d511a60
chore
posva Aug 16, 2025
c692ef2
chore: color scheme
posva Aug 16, 2025
30ec654
refactor: miss in date param parser
posva Aug 17, 2025
c2c702f
chore: update vue router usage
posva Aug 17, 2025
91e1bcb
feat: handle splats
posva Aug 17, 2025
892932f
chore: playground ts
posva Aug 18, 2025
836b0f0
refactor: no use of fs watcher internal
posva Aug 18, 2025
5a12ed9
refactor: up vue-router
posva Aug 19, 2025
bf0fc9c
chore: rename
posva Aug 20, 2025
408cf87
chore: typo
posva Aug 20, 2025
34cebfa
refactor: improve type for param parsers
posva Aug 20, 2025
04255a5
refactor: rename paramMatchers to paramParsers
posva Aug 20, 2025
97e2163
chore: wrong imports
posva Aug 20, 2025
96f0c8e
chore: rename not found in playground
posva Aug 21, 2025
5a44c0a
chore: inline
posva Aug 21, 2025
a6d23dd
feat: extract param parsers from definePage
posva Aug 21, 2025
2a41d6e
chore: remov efor merge
posva Sep 26, 2025
1fa44b1
feat: handle query types
posva Aug 23, 2025
d01d990
chore: simpler check
posva Aug 23, 2025
c920045
feat: remove 'both' format for query params, default to 'value'
posva Aug 23, 2025
6fdf414
chore: bold
posva Aug 23, 2025
c879999
refactor: rename var
posva Aug 23, 2025
3b76a48
chore: typo
posva Aug 23, 2025
6375f51
chore: update vr syntax
posva Aug 24, 2025
6ff699b
refactor: adapt to new version
posva Aug 25, 2025
1c764aa
test: todo
posva Aug 25, 2025
83133aa
refactor: native parsers
posva Aug 25, 2025
bb72cff
test: tests
posva Aug 26, 2025
5aa298a
fix: setup watchers only when needed
posva Aug 27, 2025
b6dab9a
feat: handle negative default querya params
posva Aug 27, 2025
c03a6e5
fix: pass null to splat params
posva Aug 27, 2025
8d4beef
chore: simplify warn
posva Aug 27, 2025
ba060fa
feat: ensure consistent non trailing slash
posva Aug 29, 2025
1a9cdb2
test: layouts
posva Aug 29, 2025
191b454
test: improve tests for regexp
posva Aug 29, 2025
b54ec25
test: typo
posva Aug 30, 2025
067d3ef
refactor: simplify branch
posva Aug 30, 2025
c195442
chore: up router
posva Sep 18, 2025
f463ebf
feat: allow function in default
posva Sep 18, 2025
060a79a
refactor: remove deprecated method
posva Sep 18, 2025
2bb43d4
chore: up vue-macros
posva Sep 24, 2025
5615002
feat: type custom params
posva Sep 25, 2025
8366aae
chore: up deps
posva Sep 26, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions client.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,16 @@ 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.
*
* @param router - The router instance
* @param hotUpdateCallback - Callback to be called after replacing the routes and before the navigation
*
* @example
*
* ```ts
* import { createRouter, createWebHistory } from 'vue-router'
* import { routes, handleHotUpdate } from 'vue-router/auto-routes'
Expand All @@ -19,7 +22,7 @@ declare module 'vue-router/auto-routes' {
* routes,
* })
* if (import.meta.hot) {
* handleHotUpdate(router)
* handleHotUpdate(router)
* }
* ```
*/
Expand All @@ -31,9 +34,11 @@ declare module 'vue-router/auto-routes' {

declare module 'vue-router' {
import type { RouteNamedMap } from 'vue-router/auto-routes'
import type { ParamParserCustom } from 'vue-router/auto-resolver'

export interface TypesConfig {
RouteNamedMap: RouteNamedMap
ParamParsers: ParamParserCustom
}
}

Expand Down
2 changes: 1 addition & 1 deletion examples/nuxt/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
},
"devDependencies": {
"@pinia/colada-nuxt": "^0.2.1",
"@pinia/nuxt": "^0.11.1",
"@pinia/nuxt": "^0.11.2",
"nuxt": "^3.17.5",
"unplugin-vue-router": "workspace:*"
},
Expand Down
8 changes: 5 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,8 @@
]
},
"dependencies": {
"@vue-macros/common": "3.0.0",
"@babel/generator": "^7.28.3",
"@vue-macros/common": "^3.0.0",
"@vue/language-core": "^3.0.7",
"ast-walker-scope": "^0.8.2",
"chokidar": "^4.0.3",
Expand Down Expand Up @@ -171,7 +172,8 @@
"@posva/prompts": "^2.4.4",
"@shikijs/vitepress-twoslash": "3.13.0",
"@tanstack/vue-query": "^5.89.0",
"@types/node": "^22.18.6",
"@types/babel__generator": "^7.27.0",
"@types/node": "^24.3.0",
"@types/picomatch": "^4.0.2",
"@vitest/coverage-v8": "^3.2.4",
"@vitest/ui": "^3.2.4",
Expand Down Expand Up @@ -203,7 +205,7 @@
"vitepress-plugin-llms": "^1.7.5",
"vitest": "^3.2.4",
"vue": "^3.5.21",
"vue-router": "^4.5.1",
"vue-router": "https://pkg.pr.new/vue-router@4f1a37a",
"vue-router-mock": "^2.0.0",
"vue-tsc": "^3.0.7",
"vuefire": "^3.2.2",
Expand Down
1 change: 1 addition & 0 deletions playground-experimental/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
tsconfig.tsbuildinfo
14 changes: 14 additions & 0 deletions playground-experimental/auto-imports.d.ts
Original file line number Diff line number Diff line change
@@ -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']
}
24 changes: 24 additions & 0 deletions playground-experimental/db.json
Original file line number Diff line number Diff line change
@@ -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
}
]
}
2 changes: 2 additions & 0 deletions playground-experimental/env.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
/// <reference types="vite/client" />
/// <reference types="unplugin-vue-router/client" />
22 changes: 22 additions & 0 deletions playground-experimental/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
</head>
<style>
:root {
color-scheme: light dark;
}
</style>
<body>
<a
href="/__inspect/#/module?id=/__vue-router/auto-routes&index=0"
target="_blank"
style="margin-top: 10px; display: block"
>visit /__inspect/ to inspect the intermediate state</a
>
<div id="app"></div>
<script type="module" src="./src/main.ts"></script>
</body>
</html>
23 changes: 23 additions & 0 deletions playground-experimental/package.json
Original file line number Diff line number Diff line change
@@ -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.1.2"
},
"dependencies": {
"mande": "^2.0.9",
"pinia": "^3.0.3",
"vue": "^3.5.18",
"vue-router": "https://pkg.pr.new/vue-router@4f1a37a"
}
}
72 changes: 72 additions & 0 deletions playground-experimental/src/App.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
<script setup lang="ts">
import { ref } from 'vue'

const router = useRouter()

console.log(`We have ${router.getRoutes().length} routes.`)

const targetRoute = ref('')
</script>

<template>
<header>
<div class="wrapper">
<nav>
<ul>
<li>
<RouterLink to="/">Home</RouterLink>
</li>
<li>
<RouterLink to="/users/24" #default="{ href }">{{
href
}}</RouterLink>
</li>
<li>
<RouterLink to="/events/1992-03-24" #default="{ href }">{{
href
}}</RouterLink>
</li>
</ul>
</nav>
</div>

<div>
<p>Currently at "{{ $route.name }}" ({{ $route.fullPath }})</p>
<pre>{{ $route.params }}</pre>
<form @submit.prevent="router.push(targetRoute)">
<label>
Navigate to:
<input type="text" v-model="targetRoute" />
</label>
<button>Go</button>
</form>
</div>
</header>

<hr />

<RouterView />
<hr />
<RouterView name="named" />
</template>

<style scoped>
ul {
padding-left: 0;
}
ul > li {
display: inline-block;
}

ul > li:not(:first-child) {
margin-left: 0.5rem;
}

li > a {
text-decoration: none;
}
.router-link-active {
text-decoration: underline;
font-weight: bold;
}
</style>
29 changes: 29 additions & 0 deletions playground-experimental/src/main.ts
Original file line number Diff line number Diff line change
@@ -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)
})
})
5 changes: 5 additions & 0 deletions playground-experimental/src/page-outside.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<script lang="ts" setup></script>

<template>
<h1>Page outside of <code>pages</code></h1>
</template>
7 changes: 7 additions & 0 deletions playground-experimental/src/pages/(home).vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<script lang="ts" setup></script>

<template>
<h1>Home</h1>

<p>This is the homepage.</p>
</template>
71 changes: 71 additions & 0 deletions playground-experimental/src/pages/[...path].vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
<script setup lang="ts">
import doc from '../main.ts?raw'

const route = useRoute()
const router = useRouter()
route.params.path

console.log('typeof', typeof route.params.active)
console.log('value', route.params.active)
console.log('typeof', typeof route.params.other)
console.log('value', route.params.other)

definePage({
meta: {
title: 'Not Found',
description: 'This page does not exist.',
docLength: doc.length,
number: 27,
},
name: 'not-found',
params: {
query: {
page: {
parser: 'int',
default: 1,
format: 'value',
},
other: {
parser: 'bool',
default: false,
},
active: {
parser: 'bool',
default: true,
},

multi: {
format: 'array',
},

req: {
parser: 'int',
default: -1,
},

when: {
parser: 'date',
default: () => new Date(),
},
},
},
})
</script>

<template>
<main>
<h1>Not Found</h1>

<pre>{{ $route.params }}</pre>
<pre>{{ $route.query }}</pre>
<pre>{{ $route.meta }}</pre>
</main>
</template>

<route lang="json">
{
"meta": {
"from block": true
}
}
</route>
5 changes: 5 additions & 0 deletions playground-experimental/src/pages/a.[b].c.[d].vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<script lang="ts" setup></script>

<template>
<h1>{{ String($route.name) }} - {{ $route.path }}</h1>
</template>
5 changes: 5 additions & 0 deletions playground-experimental/src/pages/b.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<script lang="ts" setup></script>

<template>
<h1>Page B</h1>
</template>
7 changes: 7 additions & 0 deletions playground-experimental/src/pages/blog/[[slugOptional]]+.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<script lang="ts" setup></script>

<template>
<h1>Blog</h1>

<pre>{{ $route.params }}</pre>
</template>
7 changes: 7 additions & 0 deletions playground-experimental/src/pages/blog/[slug]+.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<script lang="ts" setup></script>

<template>
<h1>Blog</h1>

<pre>{{ $route.params }}</pre>
</template>
Loading
Loading