From 010c8bf9e9ee805f4f1432cdbecd39cb04088421 Mon Sep 17 00:00:00 2001 From: "Mr.Hope" Date: Wed, 20 Mar 2024 10:13:20 +0800 Subject: [PATCH] fix(client): fix RouteLink path resolve (#1512) Co-authored-by: Xinyu Liu --- e2e/docs/components/route-link.md | 15 ++++++++++++ e2e/tests/components/route-link.cy.ts | 21 +++++++++++++++++ packages/client/src/components/RouteLink.ts | 8 ++++++- .../shared/tests/normalizeRoutePath.spec.ts | 23 +++++++++++++++++++ 4 files changed, 66 insertions(+), 1 deletion(-) diff --git a/e2e/docs/components/route-link.md b/e2e/docs/components/route-link.md index 8083152ee4..f271438c6e 100644 --- a/e2e/docs/components/route-link.md +++ b/e2e/docs/components/route-link.md @@ -47,3 +47,18 @@ - text - texttext + +### Hash and query + +- text +- text +- text +- text +- text +- text +- text +- text +- text +- text +- text +- text diff --git a/e2e/tests/components/route-link.cy.ts b/e2e/tests/components/route-link.cy.ts index 86b937536d..f11b7df99a 100644 --- a/e2e/tests/components/route-link.cy.ts +++ b/e2e/tests/components/route-link.cy.ts @@ -84,4 +84,25 @@ it('RouteLink', () => { }) }) }) + + const HASH_AND_QUERY_RESULTS = [ + `${E2E_BASE}#hash`, + `${E2E_BASE}?query`, + `${E2E_BASE}?query#hash`, + `${E2E_BASE}?query=1#hash`, + `${E2E_BASE}?query=1&query=2#hash`, + `${E2E_BASE}#hash?query=1&query=2`, + `#hash`, + `?query`, + `?query#hash`, + `?query=1#hash`, + `?query=1&query=2#hash`, + `#hash?query=1&query=2`, + ] + + cy.get(`.e2e-theme-content #hash-and-query + ul > li`).each((el, index) => { + cy.wrap(el).within(() => { + cy.get('a').should('have.attr', 'href', HASH_AND_QUERY_RESULTS[index]) + }) + }) }) diff --git a/packages/client/src/components/RouteLink.ts b/packages/client/src/components/RouteLink.ts index d0a9ae2f4e..a246bba061 100644 --- a/packages/client/src/components/RouteLink.ts +++ b/packages/client/src/components/RouteLink.ts @@ -64,7 +64,13 @@ export const RouteLink: FunctionalComponent< { slots }, ) => { const router = useRouter() - const path = withBase(resolveRoutePath(to)) + const resolvedPath = resolveRoutePath(to) + + const path = + // only anchor or query + resolvedPath.startsWith('#') || resolvedPath.startsWith('?') + ? resolvedPath + : withBase(resolvedPath) return h( 'a', diff --git a/packages/shared/tests/normalizeRoutePath.spec.ts b/packages/shared/tests/normalizeRoutePath.spec.ts index facc9e0e5f..e19287705d 100644 --- a/packages/shared/tests/normalizeRoutePath.spec.ts +++ b/packages/shared/tests/normalizeRoutePath.spec.ts @@ -42,6 +42,29 @@ const testCases = [ ['foo/bar.md', 'foo/bar.html'], ['foo/bar.html', 'foo/bar.html'], + // hash and query + ['/foo#bar', '/foo.html#bar'], + ['/foo.md#bar', '/foo.html#bar'], + ['/foo.html#bar', '/foo.html#bar'], + ['/foo?bar=baz', '/foo.html?bar=baz'], + ['/foo.md?bar=baz', '/foo.html?bar=baz'], + ['/foo.html?bar=baz', '/foo.html?bar=baz'], + ['/foo?bar=baz#qux', '/foo.html?bar=baz#qux'], + ['/foo.md?bar=baz#qux', '/foo.html?bar=baz#qux'], + ['/foo.html?bar=baz#qux', '/foo.html?bar=baz#qux'], + ['foo#bar', 'foo.html#bar'], + ['foo.md#bar', 'foo.html#bar'], + ['foo.html#bar', 'foo.html#bar'], + ['foo?bar=baz', 'foo.html?bar=baz'], + ['foo.md?bar=baz', 'foo.html?bar=baz'], + ['foo.html?bar=baz', 'foo.html?bar=baz'], + ['foo?bar=baz#qux', 'foo.html?bar=baz#qux'], + ['foo.md?bar=baz#qux', 'foo.html?bar=baz#qux'], + ['foo.html?bar=baz#qux', 'foo.html?bar=baz#qux'], + ['#bar', '#bar'], + ['?bar=baz', '?bar=baz'], + ['?bar=baz#qux', '?bar=baz#qux'], + // unexpected corner cases ['.md', '.html'], ['foo/.md', 'foo/.html'],