--- /dev/null
+<script setup lang="ts">
+import { useRoute } from 'vue-router'
+
+const route = useRoute()
+</script>
+
+<template>
+ <div>
+ <h1>Events</h1>
+
+ <ul>
+ <li>
+ <router-link to="/events" v-slot="{ href }">{{ href }}</router-link>
+ </li>
+ <li>
+ <router-link to="/events/2025" v-slot="{ href }">{{
+ href
+ }}</router-link>
+ </li>
+ <li>
+ <router-link to="/events/2025-03-24" v-slot="{ href }">{{
+ href
+ }}</router-link>
+ </li>
+ <li>
+ <router-link
+ :to="{
+ name: 'events-date-nested',
+ // @ts-expect-error: it works
+ params: { when: new Date(), ...route.params },
+ }"
+ v-slot="{ href }"
+ >{{ href }}</router-link
+ >
+ </li>
+ </ul>
+
+ <RouterView />
+ </div>
+</template>
normalizeRouteRecord,
PARAM_PARSER_INT,
MatcherPatternQueryParam,
+ MatchMiss,
} from 'vue-router/experimental'
import type {
EXPERIMENTAL_RouteRecordNormalized_Matchable,
build: params => ({ page: String(params.page) }),
}
+const PARAM_PARSER_DATE = {
+ get(value: string): Date {
+ const asDate = new Date(value)
+ if (Number.isNaN(asDate.getTime())) {
+ throw new MatchMiss(`Invalid date param: "${value}"`)
+ }
+
+ return asDate
+ },
+ set(value: Date): string {
+ return (
+ value
+ .toISOString()
+ // allows keeping simple dates like 2023-10-01 without time
+ .replace('T00:00:00.000Z', '')
+ )
+ },
+}
+
const QUERY_PATTERN_MATCHER: MatcherPatternQuery<{ q?: string }> = {
match: query => {
return {
),
})
+const r_events = normalizeRouteRecord({
+ components: { default: () => import('../pages/events.vue') },
+})
+
+const r_events_list = normalizeRouteRecord({
+ name: 'events',
+ path: new MatcherPatternPathStatic('/events'),
+ components: { default: () => import('../pages/events/(event-list).vue') },
+ parent: r_events,
+})
+
+const r_events_date = normalizeRouteRecord({
+ name: 'events-date',
+ components: { default: () => import('../pages/events/[when=date].vue') },
+ path: new MatcherPatternPathDynamic(
+ /^\/events\/([^/]+?)$/i,
+ {
+ when: [PARAM_PARSER_DATE],
+ },
+ ['events', 1]
+ ),
+ parent: r_events,
+})
+
+const r_events_nested = normalizeRouteRecord({
+ name: 'events-date-nested',
+ components: {
+ default: () => import('../pages/events/[when=date]/nested.vue'),
+ },
+ path: new MatcherPatternPathDynamic(
+ /^\/events\/([^/]+?)\/nested$/i,
+ {
+ when: [PARAM_PARSER_DATE],
+ },
+ ['events', 1, 'nested']
+ ),
+ parent: r_events_date,
+})
+
export const router = experimental_createRouter({
history: createWebHistory(),
resolver: createFixedResolver<EXPERIMENTAL_RouteRecordNormalized_Matchable>([
r_home,
r_about,
+
+ r_events_list,
+ r_events_date,
+ r_events_nested,
+
r_nested,
r_nested_a,
+
r_profiles_list,
r_profiles_detail,
]),