From cc6e255b9c579ad975fbc9bd309e7b2f1f80bf82 Mon Sep 17 00:00:00 2001 From: Eduardo San Martin Morote Date: Mon, 28 Nov 2022 09:18:57 +0100 Subject: [PATCH] fix(location): correctly parse url ending with . Fix #1620 --- packages/router/__tests__/location.spec.ts | 12 ++++++++++++ packages/router/src/location.ts | 7 +++++++ 2 files changed, 19 insertions(+) diff --git a/packages/router/__tests__/location.spec.ts b/packages/router/__tests__/location.spec.ts index b848ebbb..076faa1b 100644 --- a/packages/router/__tests__/location.spec.ts +++ b/packages/router/__tests__/location.spec.ts @@ -353,6 +353,18 @@ describe('resolveRelativePath', () => { expect(resolveRelativePath('/add', '/users/posva')).toBe('/add') }) + it('works without anything after the .', () => { + expect(resolveRelativePath('./', '/users/posva')).toBe('/users/') + expect(resolveRelativePath('.', '/users/posva')).toBe('/users/') + }) + + it('works without anything after the ..', () => { + expect(resolveRelativePath('../', '/users/posva/new')).toBe('/users/') + expect(resolveRelativePath('../../', '/users/posva/a/b')).toBe('/users/') + expect(resolveRelativePath('..', '/users/posva/new')).toBe('/users/') + expect(resolveRelativePath('../..', '/users/posva/a/b')).toBe('/users/') + }) + it('resolves empty path', () => { expect(resolveRelativePath('', '/users/posva')).toBe('/users/posva') expect(resolveRelativePath('', '/users')).toBe('/users') diff --git a/packages/router/src/location.ts b/packages/router/src/location.ts index 24fa764a..0f981b47 100644 --- a/packages/router/src/location.ts +++ b/packages/router/src/location.ts @@ -212,6 +212,13 @@ export function resolveRelativePath(to: string, from: string): string { const fromSegments = from.split('/') const toSegments = to.split('/') + const lastToSegment = toSegments[toSegments.length - 1] + + // make . and ./ the same (../ === .., ../../ === ../..) + // this is the same behavior as new URL() + if (lastToSegment === '..' || lastToSegment === '.') { + toSegments.push('') + } let position = fromSegments.length - 1 let toPosition: number -- 2.47.2