From e8a5178abb3fc02af4c6540bf9c20eebfd50ae8f Mon Sep 17 00:00:00 2001 From: Tate Thurston Date: Mon, 27 May 2024 11:48:20 -0700 Subject: [PATCH] Add trailingSlash option to route fix #168 --- packages/nextjs-routes/src/index.test.ts | 27 ++++++++++++++++++++++++ packages/nextjs-routes/src/index.ts | 15 +++++++++++-- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/packages/nextjs-routes/src/index.test.ts b/packages/nextjs-routes/src/index.test.ts index 7589de8..72adefb 100644 --- a/packages/nextjs-routes/src/index.test.ts +++ b/packages/nextjs-routes/src/index.test.ts @@ -62,4 +62,31 @@ describe(route, () => { }), ).toEqual("/foos/foo?bar=bar&baz=1&baz=2&baz=3#foo"); }); + + describe("options", () => { + describe("trailingSlash", () => { + it("when true", () => { + expect( + route({ pathname: "/settings/about" }, { trailingSlash: true }), + ).toEqual("/settings/about/"); + expect( + route( + { pathname: "/foos/[foo]", query: { foo: "bar" } }, + { trailingSlash: true }, + ), + ).toEqual("/foos/bar/"); + }); + it("when false", () => { + expect( + route({ pathname: "/settings/about" }, { trailingSlash: false }), + ).toEqual("/settings/about"); + expect( + route( + { pathname: "/foos/[foo]", query: { foo: "bar" } }, + { trailingSlash: false }, + ), + ).toEqual("/foos/bar"); + }); + }); + }); }); diff --git a/packages/nextjs-routes/src/index.ts b/packages/nextjs-routes/src/index.ts index 2d7f530..0adb55d 100644 --- a/packages/nextjs-routes/src/index.ts +++ b/packages/nextjs-routes/src/index.ts @@ -16,9 +16,16 @@ interface Dynamic extends Route { query: { [key: string]: string }; } -export function route(r: Route): string { +interface RouteOptions { + trailingSlash?: boolean; +} + +export function route( + r: Route, + options: RouteOptions = { trailingSlash: false }, +): string { const params = new Set(); - const path = + let path = "/" + r.pathname .split("/") @@ -47,6 +54,10 @@ export function route(r: Route): string { .filter(Boolean) .join("/"); + if (options.trailingSlash) { + path += "/"; + } + const search = new URLSearchParams(); for (const key in r.query) { if (!params.has(key)) {