From ea65066e8511d8320ad8de37b32ea9a8028fa9d5 Mon Sep 17 00:00:00 2001
From: Eduardo San Martin Morote <posva13@gmail.com>
Date: Thu, 25 Jun 2020 13:47:47 +0200
Subject: [PATCH] fix(query): do not normalize query with custom stringifyQuery

Fix #328
---
 src/router.ts | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/src/router.ts b/src/router.ts
index f9a4217d5..0820e6ea3 100644
--- a/src/router.ts
+++ b/src/router.ts
@@ -37,6 +37,7 @@ import {
   normalizeQuery,
   parseQuery as originalParseQuery,
   stringifyQuery as originalStringifyQuery,
+  LocationQuery,
 } from './query'
 import {
   shallowRef,
@@ -340,7 +341,15 @@ export function createRouter(options: RouterOptions): Router {
         // keep the hash encoded so fullPath is effectively path + encodedQuery +
         // hash
         hash,
-        query: normalizeQuery(rawLocation.query),
+        query:
+          // if the user is using a custom query lib like qs, we might have
+          // nested objects, so we keep the query as is, meaning it can contain
+          // numbers at `$route.query`, but at the point, the user will have to
+          // use their own type anyway.
+          // https://github.com/vuejs/vue-router-next/issues/328#issuecomment-649481567
+          stringifyQuery === originalStringifyQuery
+            ? normalizeQuery(rawLocation.query)
+            : (rawLocation.query as LocationQuery),
       },
       matchedRoute,
       {
@@ -396,7 +405,7 @@ export function createRouter(options: RouterOptions): Router {
             2
           )}\n when navigating to "${
             targetLocation.fullPath
-          }". A redirect must contain a name or path.`
+          }". A redirect must contain a name or path. This will break in production.`
         )
         return Promise.reject(new Error('Invalid redirect'))
       }