feat(router): mount pages-v2 at /v2/* with v2- name prefix

Adds a second routesFolder (src/pages-v2 -> /v2/) and extends
getRouteName so v2 routes get a v2- NAME prefix, preventing collisions
with same-named v1 pages. getPascalCaseRouteName already folds the v2/
URL segment into the base name, so the leading v2- is stripped before
v2RouteName re-adds the canonical prefix (avoids v2-v2-dashboard).
Includes the regenerated typed-router.d.ts and a boot-proof
pages-v2/dashboard.vue placeholder.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-16 09:30:33 +02:00
parent be245080e1
commit 714abd7178
3 changed files with 43 additions and 1 deletions

View File

@@ -14,6 +14,7 @@ import MetaLayouts from 'vite-plugin-vue-meta-layouts'
import vuetify from 'vite-plugin-vuetify'
import tailwindcss from '@tailwindcss/vite'
import svgLoader from 'vite-svg-loader'
import { v2RouteName } from './src/plugins/1.router/v2RouteName'
// https://vitejs.dev/config/
export default defineConfig({
@@ -21,11 +22,42 @@ export default defineConfig({
// Docs: https://github.com/posva/unplugin-vue-router
// This plugin should be placed before vue plugin
VueRouter({
// Parallel /v2/* tree (RFC-WS-GUI-REDESIGN AD-G1). The second
// routesFolder prefixes every v2 URL with /v2/; v2RouteName then
// prefixes the route NAME with `v2-` so file-name twins across
// pages/ and pages-v2/ cannot collide. Reverted at final cutover.
routesFolder: [
{ src: 'src/pages' },
{ src: 'src/pages-v2', path: 'v2/' },
],
getRouteName: routeNode => {
// Convert pascal case to kebab case
return getPascalCaseRouteName(routeNode)
const raw = getPascalCaseRouteName(routeNode)
.replace(/([a-z\d])([A-Z])/g, '$1-$2')
.toLowerCase()
// Defensive path read: unplugin-vue-router 0.8.8 TreeNode exposes
// `.fullPath`; fall back to `.value.path` then '' so a future
// plugin bump can't silently drop the v2- prefix. Step 5 below
// empirically verifies the emitted name.
const nodePath
= (routeNode.fullPath
?? routeNode.value?.path
?? '') as string
// getPascalCaseRouteName includes the 'v2' segment from the URL
// path prefix set by routesFolder (e.g. 'v2/dashboard' → 'v2-dashboard').
// Strip that prefix before v2RouteName re-adds the canonical `v2-`
// so we get 'v2-dashboard' not 'v2-v2-dashboard'.
const isV2
= nodePath === '/v2'
|| nodePath === 'v2'
|| nodePath.startsWith('/v2/')
|| nodePath.startsWith('v2/')
const base = isV2 && raw.startsWith('v2-') ? raw.slice(3) : raw
return v2RouteName(base, nodePath)
},
}),
vue(),