From 0ad9b0d7fd6dbd74a78d7102ee78c2b3349b1843 Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Fri, 8 Dec 2023 05:12:10 +0100 Subject: [PATCH] Do not include default query params in href --- src/createLocation.ts | 54 +++++++++++++++++++++++++-------------- test/createRouter.test.ts | 34 +++++++++++++++++++++++- 2 files changed, 68 insertions(+), 20 deletions(-) diff --git a/src/createLocation.ts b/src/createLocation.ts index e038a65c..105c6b1d 100644 --- a/src/createLocation.ts +++ b/src/createLocation.ts @@ -48,29 +48,45 @@ export function createLocation({ const urlEncode = paramDef["~internal"].valueSerializer.urlEncode ?? urlEncodeDefault; - let value: string | null; - - if (paramDef["~internal"].array) { - if (!Array.isArray(paramValue)) { - if (__DEV__) { - throw TypeRouteError.Expected_type_does_not_match_actual_type.create({ - context: "routes[routeName](...)", - actualType: typeOf(paramValue), - expectedType: "array", - value: paramValue, - valueName: paramName, - }); + const getValue = (paramValue: unknown) => { + + let value: string | null; + + if (paramDef["~internal"].array) { + if (!Array.isArray(paramValue)) { + if (__DEV__) { + throw TypeRouteError.Expected_type_does_not_match_actual_type.create({ + context: "routes[routeName](...)", + actualType: typeOf(paramValue), + expectedType: "array", + value: paramValue, + valueName: paramName, + }); + } } - } - value = - (paramValue as unknown[]).length === 0 - ? null - : (paramValue as unknown[]) + value = + (paramValue as unknown[]).length === 0 + ? null + : (paramValue as unknown[]) .map((part) => stringify(paramDef, part, urlEncode)) .join(arraySeparator); - } else { - value = stringify(paramDef, paramValue, urlEncode); + } else { + value = stringify(paramDef, paramValue, urlEncode); + } + + return value; + + }; + + const value = getValue(paramValue); + + if ( + paramDef["~internal"].kind === "query" && + paramDef["~internal"].default !== undefined && + getValue(paramDef["~internal"].default) === value + ) { + continue; } params[paramDef["~internal"].kind][paramName] = { diff --git a/test/createRouter.test.ts b/test/createRouter.test.ts index bb075178..e166902d 100644 --- a/test/createRouter.test.ts +++ b/test/createRouter.test.ts @@ -528,7 +528,7 @@ describe("createRouter", () => { expect(route.href).toBe("/foo"); routes.bar({ page: 1 }).push(); - expect(route.href).toBe("/bar?page=1"); + expect(route.href).toBe("/bar"); session.replace("/bar?page=2"); expect(route.href).toBe("/bar?page=2"); session.back(); @@ -537,6 +537,38 @@ describe("createRouter", () => { expect(route.href).toBe("/bar?page=2"); }); + + it("should not include default query params in href", () => { + const { routes, session } = createRouter( + { + session: { + type: "memory", + initialEntries: ["/foo"], + }, + }, + { + foo: defineRoute("/foo"), + bar: defineRoute( + { page: param.query.optional.number.default(1) }, + () => "/bar" + ), + } + ); + + let route = session.getInitialRoute(); + + session.listen((nextRoute) => (route = nextRoute)); + + expect(route.href).toBe("/foo"); + + routes.bar({ page: 1 }).push(); + expect(route.href).toBe("/bar"); + + routes.bar({ page: 2 }).push(); + expect(route.href).toBe("/bar?page=2"); + + }); + it("should handle redirect for initial route", () => { const { session } = createRouter( {