From 252f4acb2f7b69b8c920aafac362d44027f9ae49 Mon Sep 17 00:00:00 2001 From: meteorlxy Date: Sun, 12 Jun 2022 00:29:36 +0800 Subject: [PATCH] fix(shared): check markdown links correctly --- .../__tests__/utils/isLinkExternal.spec.ts | 24 ++++++++++++++++--- .../shared/src/utils/isLinkExternal.ts | 8 ++++++- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/packages/@vuepress/shared/__tests__/utils/isLinkExternal.spec.ts b/packages/@vuepress/shared/__tests__/utils/isLinkExternal.spec.ts index 289f628830..6f4003e3ff 100644 --- a/packages/@vuepress/shared/__tests__/utils/isLinkExternal.spec.ts +++ b/packages/@vuepress/shared/__tests__/utils/isLinkExternal.spec.ts @@ -33,6 +33,9 @@ const testCases: [ [['/foo/bar/baz.md'], false], [['/foo/bar/baz.md', '/base/'], false], [['/foo/bar/baz.md', '/foo/'], false], + [['/foo/bar/baz.html'], false], + [['/foo/bar/baz.html', '/base/'], true], + [['/foo/bar/baz.html', '/foo/'], false], // relative links [['foobar.com'], false], @@ -43,13 +46,28 @@ const testCases: [ [['foo/bar/baz.md'], false], [['foo/bar/baz.md', '/base/'], false], [['foo/bar/baz.md', '/foo/'], false], + [['foo/bar/baz.html'], false], + [['foo/bar/baz.html', '/base/'], false], + [['foo/bar/baz.html', '/foo/'], false], + [['./foo/bar'], false], + [['./foo/bar', '/base/'], false], + [['./foo/bar', '/foo/'], false], + [['./foo/bar/baz.md'], false], + [['./foo/bar/baz.md', '/base/'], false], + [['./foo/bar/baz.md', '/foo/'], false], + [['./foo/bar/baz.html'], false], + [['./foo/bar/baz.html', '/base/'], false], + [['./foo/bar/baz.html', '/foo/'], false], ] describe('shared > isLinkExternal', () => { describe('should determine external link correctly', () => { - testCases.forEach(([source, expected]) => { - it(`link: ${source[0]}, base: ${source[1] || '/'}`, () => { - expect(isLinkExternal(...source)).toBe(expected) + testCases.forEach(([[link, base = '/'], expected]) => { + it(`link: ${link}, base: ${base}`, () => { + expect(isLinkExternal(link, base)).toBe(expected) + expect(isLinkExternal(`${link}#foobar`, base)).toBe(expected) + expect(isLinkExternal(`${link}?foo=bar`, base)).toBe(expected) + expect(isLinkExternal(`${link}?foo=bar#foobar`, base)).toBe(expected) }) }) }) diff --git a/packages/@vuepress/shared/src/utils/isLinkExternal.ts b/packages/@vuepress/shared/src/utils/isLinkExternal.ts index 22ce41dab7..8997177ee2 100644 --- a/packages/@vuepress/shared/src/utils/isLinkExternal.ts +++ b/packages/@vuepress/shared/src/utils/isLinkExternal.ts @@ -1,6 +1,8 @@ import { isLinkFtp } from './isLinkFtp' import { isLinkHttp } from './isLinkHttp' +const markdownLinkRegexp = /.md((\?|#).*)?$/ + /** * Determine a link is external or not */ @@ -11,7 +13,11 @@ export const isLinkExternal = (link: string, base = '/'): boolean => { } // absolute link that does not start with `base` and does not end with `.md` - if (link.startsWith('/') && !link.startsWith(base) && !link.endsWith('.md')) { + if ( + link.startsWith('/') && + !link.startsWith(base) && + !markdownLinkRegexp.test(link) + ) { return true }