From 1cc15da86f759a2cc749dfdd1df6c6aa38310062 Mon Sep 17 00:00:00 2001 From: xjccc <546534045@qq.com> Date: Wed, 19 Feb 2025 16:42:08 +0800 Subject: [PATCH] refactor: export isInWhitelist computed property in useNuxtLink --- packages/nuxt/src/app/components/nuxt-link.ts | 32 ++++++++++--------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/packages/nuxt/src/app/components/nuxt-link.ts b/packages/nuxt/src/app/components/nuxt-link.ts index f21460dfec..4ae7898985 100644 --- a/packages/nuxt/src/app/components/nuxt-link.ts +++ b/packages/nuxt/src/app/components/nuxt-link.ts @@ -205,6 +205,19 @@ export function defineNuxtLink (options: NuxtLinkOptions) { return resolveTrailingSlashBehavior(joinURL(config.app.baseURL, to.value), router.resolve /* will not be called */) }) + // Check if the URL is in the whitelist + function isUrlInWhitelist (url: string, whitelist: string[] = []): boolean { + if (!whitelist.length) { return false } + try { + const urlObj = new URL(url) + return whitelist.some(domain => urlObj.hostname.endsWith(domain)) + } catch (e) { + console.error(e) + return false + } + } + const isInWhitelist = computed(() => isUrlInWhitelist(href.value, options.whitelist)) + return { to, hasTarget, @@ -212,6 +225,7 @@ export function defineNuxtLink (options: NuxtLinkOptions) { isExternal, // href, + isInWhitelist, isActive: link?.isActive ?? computed(() => to.value === router.currentRoute.value.path), isExactActive: link?.isExactActive ?? computed(() => to.value === router.currentRoute.value.path), route: link?.route ?? computed(() => router.resolve(to.value)), @@ -223,6 +237,7 @@ export function defineNuxtLink (options: NuxtLinkOptions) { hasTarget: ComputedRef isAbsoluteUrl: ComputedRef isExternal: ComputedRef + isInWhitelist: ComputedRef } } @@ -322,7 +337,7 @@ export function defineNuxtLink (options: NuxtLinkOptions) { setup (props, { slots }) { const router = useRouter() - const { to, href, navigate, isExternal, hasTarget, isAbsoluteUrl } = useNuxtLink(props) + const { to, href, navigate, isExternal, hasTarget, isAbsoluteUrl, isInWhitelist } = useNuxtLink(props) // Prefetching const prefetched = ref(false) @@ -425,21 +440,8 @@ export function defineNuxtLink (options: NuxtLinkOptions) { // Resolves `target` value const target = props.target || null + const defaultExternalRel = isInWhitelist.value ? 'noopener' : 'noopener noreferrer' - function isUrlInWhitelist (url: string, whitelist: string[] = []): boolean { - if (!whitelist.length) { return false } - try { - const urlObj = new URL(url) - return whitelist.some(domain => urlObj.hostname.endsWith(domain)) - } catch (e) { - console.error(e) - return false - } - } - let defaultExternalRel = 'noopener noreferrer' - if (isUrlInWhitelist(href.value, options.whitelist)) { - defaultExternalRel = 'noopener' - } // Resolves `rel` checkPropConflicts(props, 'noRel', 'rel') const rel = firstNonUndefined(