Skip to content

Commit

Permalink
fix(theme-default): fix PageNav relative url
Browse files Browse the repository at this point in the history
  • Loading branch information
Mister-Hope committed Apr 1, 2024
1 parent 238fd6f commit 966525e
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 9 deletions.
28 changes: 19 additions & 9 deletions themes/theme-default/src/client/components/PageNav.vue
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
<script setup lang="ts">
import AutoLink from '@theme/AutoLink.vue'
import { resolveRoute } from '@vuepress/helper/client'
import { useEventListener } from '@vueuse/core'
import { computed } from 'vue'
import type { Router } from 'vuepress/client'
import { usePageFrontmatter, useRoute, useRouter } from 'vuepress/client'
import { usePageFrontmatter, useRoute } from 'vuepress/client'
import { isPlainObject, isString } from 'vuepress/shared'
import type {
DefaultThemeNormalPageFrontmatter,
Expand All @@ -15,25 +15,36 @@ import {
useSidebarItems,
useThemeLocaleData,
} from '../composables/index.js'
import { getNavLink } from '../utils/index.js'
/**
* Resolve `prev` or `next` config from frontmatter
*/
const resolveFromFrontmatterConfig = (
router: Router,
conf: unknown,
current: string,
): null | false | NavLink => {
if (conf === false) {
return null
}
if (isString(conf)) {
return getNavLink(router, conf)
const { notFound, meta, path } = resolveRoute<{
title?: string
}>(conf, current)
return notFound
? { text: path, link: path }
: {
text: meta.title || path,
link: path,
}
}
if (isPlainObject<NavLink>(conf)) {
return conf
return {
...conf,
link: resolveRoute(conf.link, current).path,
}
}
return false
Expand Down Expand Up @@ -76,13 +87,12 @@ const frontmatter = usePageFrontmatter<DefaultThemeNormalPageFrontmatter>()
const sidebarItems = useSidebarItems()
const themeLocale = useThemeLocaleData()
const route = useRoute()
const router = useRouter()
const navigate = useNavigate()
const prevNavLink = computed(() => {
const prevConfig = resolveFromFrontmatterConfig(
router,
frontmatter.value.prev,
route.path,
)
if (prevConfig !== false) {
return prevConfig
Expand All @@ -93,8 +103,8 @@ const prevNavLink = computed(() => {
const nextNavLink = computed(() => {
const nextConfig = resolveFromFrontmatterConfig(
router,
frontmatter.value.next,
route.path,
)
if (nextConfig !== false) {
return nextConfig
Expand Down
1 change: 1 addition & 0 deletions tools/helper/src/client/utils/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
export * from './data.js'
export * from './hasGlobalComponent.js'
export * from './resolveRoute.js'
export * from './wait.js'
26 changes: 26 additions & 0 deletions tools/helper/src/client/utils/resolveRoute.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { resolveRoute as _resolveRoute } from 'vuepress/client'
import type { Route, RouteMeta } from 'vuepress/client'
import { isLinkAbsolute } from '../../shared'

const FAKE_HOST = 'http://.'

// FIXME: ResolvedRoute is currently not exported
interface ResolvedRoute<T extends RouteMeta = RouteMeta> extends Route<T> {
path: string
notFound: boolean
}

export const resolveRoute = <T extends RouteMeta>(
path: string,
current?: string,
): ResolvedRoute<T> => {
if (isLinkAbsolute(path) || typeof current !== 'string')
return _resolveRoute<T>(path)

// Inner relative path
const loc = current.slice(0, current.lastIndexOf('/'))

return _resolveRoute<T>(
new URL(`${loc}/${encodeURI(path)}`, FAKE_HOST).pathname,
)
}

0 comments on commit 966525e

Please sign in to comment.