diff --git a/__tests__/unit/client/theme-default/support/utils.test.ts b/__tests__/unit/client/theme-default/support/utils.test.ts
index 880d4232..aefc9b8e 100644
--- a/__tests__/unit/client/theme-default/support/utils.test.ts
+++ b/__tests__/unit/client/theme-default/support/utils.test.ts
@@ -1,4 +1,7 @@
-import { ensureStartingSlash } from 'client/theme-default/support/utils'
+import {
+ ensureStartingSlash,
+ isLinkExternal
+} from 'client/theme-default/support/utils'
describe('client/theme-default/utils', () => {
describe('ensureStartingSlash', () => {
@@ -9,4 +12,22 @@ describe('client/theme-default/utils', () => {
expect(ensureStartingSlash('/path/nested')).toBe('/path/nested')
})
})
+
+ describe('isLinkExternal', () => {
+ test('it detects external links by default', () => {
+ expect(isLinkExternal('https://vite.dev')).toBe(true)
+ expect(isLinkExternal('/guide/')).toBe(false)
+ })
+
+ test('it treats _blank targets as external by default', () => {
+ expect(isLinkExternal('/guide/', '_blank')).toBe(true)
+ })
+
+ test('it allows callers to override external detection', () => {
+ expect(isLinkExternal('https://cn.vite.dev', undefined, false)).toBe(
+ false
+ )
+ expect(isLinkExternal('/guide/', undefined, true)).toBe(true)
+ })
+ })
})
diff --git a/src/client/theme-default/components/VPLink.vue b/src/client/theme-default/components/VPLink.vue
index f57e3328..f087a88c 100644
--- a/src/client/theme-default/components/VPLink.vue
+++ b/src/client/theme-default/components/VPLink.vue
@@ -1,21 +1,19 @@
diff --git a/src/client/theme-default/components/VPNavBarTranslations.vue b/src/client/theme-default/components/VPNavBarTranslations.vue
index e6850d4c..fe3bfe96 100644
--- a/src/client/theme-default/components/VPNavBarTranslations.vue
+++ b/src/client/theme-default/components/VPNavBarTranslations.vue
@@ -21,6 +21,7 @@ const { localeLinks, currentLang } = useLangs({ correspondingLink: true })
{{ locale.text }}
diff --git a/src/client/theme-default/support/utils.ts b/src/client/theme-default/support/utils.ts
index d615e703..e7d713a9 100644
--- a/src/client/theme-default/support/utils.ts
+++ b/src/client/theme-default/support/utils.ts
@@ -20,6 +20,18 @@ export function ensureStartingSlash(path: string): string {
return path.startsWith('/') ? path : `/${path}`
}
+export function isLinkExternal(
+ href?: string,
+ target?: string,
+ external?: boolean
+): boolean {
+ if (external !== undefined) {
+ return external
+ }
+
+ return (!!href && isExternal(href)) || target === '_blank'
+}
+
export function normalizeLink(url: string): string {
const { pathname, search, hash, protocol } = new URL(url, 'http://a.com')