From: Eduardo San Martin Morote Date: Wed, 24 Jun 2020 10:02:14 +0000 (+0200) Subject: fix(query): isSameRouteLocation compares queries by string X-Git-Tag: v4.0.0-alpha.14~10 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6e1f0eacf60c7e3d465dd0af68f79dc649269b17;p=thirdparty%2Fvuejs%2Frouter.git fix(query): isSameRouteLocation compares queries by string Fix #328 --- diff --git a/__tests__/location.spec.ts b/__tests__/location.spec.ts index 9be6c3a6..5399d549 100644 --- a/__tests__/location.spec.ts +++ b/__tests__/location.spec.ts @@ -5,7 +5,9 @@ import { stringifyURL as originalStringifyURL, stripBase, isSameRouteLocationParams, + isSameRouteLocation, } from '../src/location' +import { RouteLocationNormalizedLoaded } from 'src' describe('parseURL', () => { let parseURL = originalParseURL.bind(null, parseQuery) @@ -273,3 +275,26 @@ describe('isSameRouteLocationParams', () => { expect(isSameRouteLocationParams({ a: ['3'] }, { a: '2' })).toBe(false) }) }) + +describe('isSameRouteLocation', () => { + it('compares queries as strings', () => { + const location: RouteLocationNormalizedLoaded = { + path: '/', + params: {}, + name: 'home', + matched: [{} as any], + fullPath: '/', + hash: '', + meta: {}, + query: {}, + redirectedFrom: undefined, + } + expect( + isSameRouteLocation( + () => 'fake query', + { ...location, query: { a: 'a' } }, + { ...location, query: { b: 'b' } } + ) + ).toBe(true) + }) +}) diff --git a/src/location.ts b/src/location.ts index 2bccbd51..3d7155b4 100644 --- a/src/location.ts +++ b/src/location.ts @@ -1,4 +1,4 @@ -import { LocationQuery, LocationQueryRaw, LocationQueryValue } from './query' +import { LocationQuery, LocationQueryRaw } from './query' import { RouteLocation, RouteLocationNormalized, @@ -127,6 +127,7 @@ export function stripBase(pathname: string, base: string): string { * @param b second {@link RouteLocation} */ export function isSameRouteLocation( + stringifyQuery: (query: LocationQueryRaw) => string, a: RouteLocation, b: RouteLocation ): boolean { @@ -138,7 +139,7 @@ export function isSameRouteLocation( aLastIndex === bLastIndex && isSameRouteRecord(a.matched[aLastIndex], b.matched[bLastIndex]) && isSameRouteLocationParams(a.params, b.params) && - isSameRouteLocationParams(a.query, b.query) && + stringifyQuery(a.query) === stringifyQuery(b.query) && a.hash === b.hash ) } @@ -157,17 +158,9 @@ export function isSameRouteRecord(a: RouteRecord, b: RouteRecord): boolean { return (a.aliasOf || a) === (b.aliasOf || b) } -export function isSameRouteLocationParams( - a: RouteLocationNormalized['query'], - b: RouteLocationNormalized['query'] -): boolean export function isSameRouteLocationParams( a: RouteLocationNormalized['params'], b: RouteLocationNormalized['params'] -): boolean -export function isSameRouteLocationParams( - a: RouteLocationNormalized['query' | 'params'], - b: RouteLocationNormalized['query' | 'params'] ): boolean { if (Object.keys(a).length !== Object.keys(b).length) return false @@ -178,25 +171,9 @@ export function isSameRouteLocationParams( return true } -function isSameRouteLocationParamsValue( - a: LocationQueryValue | LocationQueryValue[], - b: LocationQueryValue | LocationQueryValue[] -): boolean function isSameRouteLocationParamsValue( a: RouteParamValue | RouteParamValue[], b: RouteParamValue | RouteParamValue[] -): boolean -function isSameRouteLocationParamsValue( - a: - | LocationQueryValue - | LocationQueryValue[] - | RouteParamValue - | RouteParamValue[], - b: - | LocationQueryValue - | LocationQueryValue[] - | RouteParamValue - | RouteParamValue[] ): boolean { return Array.isArray(a) ? isEquivalentArray(a, b) diff --git a/src/router.ts b/src/router.ts index 392872ea..f9a4217d 100644 --- a/src/router.ts +++ b/src/router.ts @@ -427,7 +427,7 @@ export function createRouter(options: RouterOptions): Router { toLocation.redirectedFrom = redirectedFrom let failure: NavigationFailure | void | undefined - if (!force && isSameRouteLocation(from, targetLocation)) { + if (!force && isSameRouteLocation(stringifyQuery, from, targetLocation)) { failure = createRouterError( ErrorTypes.NAVIGATION_DUPLICATED, { to: toLocation, from }