diff --git a/src/router/Router.ts b/src/router/Router.ts index 2b555dad..43fef785 100644 --- a/src/router/Router.ts +++ b/src/router/Router.ts @@ -101,6 +101,10 @@ export class Router { if (result.type === "match") { this.currentRoute = result.route; this.currentParams = result.params; + const currentPath = this.routeToPath(result.route, result.params); + if (currentPath !== this.currentPath()) { + this.setUrlFromPath(currentPath); + } } } @@ -110,8 +114,7 @@ export class Router { const result = await this.matchAndApplyRules(path); if (result.type === "match") { const finalPath = this.routeToPath(result.route, result.params); - const url = location.origin + finalPath; - history.pushState({}, path, url); + this.setUrlFromPath(finalPath); this.currentRoute = result.route; this.currentParams = result.params; } else if (result.type === "nomatch") { @@ -136,6 +139,11 @@ export class Router { // Private helpers //-------------------------------------------------------------------------- + private setUrlFromPath(path: string) { + const url = location.origin + path; + window.history.pushState({}, path, url); + } + private validateDestination(dest: Destination) { if ((!dest.path && !dest.to) || (dest.path && dest.to)) { throw new Error(`Invalid destination: ${JSON.stringify(dest)}`); diff --git a/tests/router/router.test.ts b/tests/router/router.test.ts index e1dfe3a7..86a7f4b1 100644 --- a/tests/router/router.test.ts +++ b/tests/router/router.test.ts @@ -161,4 +161,18 @@ describe("beforeRouteEnter", () => { expect(window.location.pathname).toBe("/some/pathc"); expect(router.currentRouteName).toBe("routec"); }); + + test("navigation is initially redirected if guard decides so", async () => { + expect(window.location.pathname).toBe("/"); + const guard = jest.fn(() => {return {to: "otherroute"}}); + router = new TestRouter(env, [ + { name: "landing", path: "/", beforeRouteEnter: guard}, + { name: "otherroute", path: "/some/other/route"} + ]); + + expect(window.location.pathname).toBe("/"); + + await router.start(); + expect(window.location.pathname).toBe("/some/other/route"); + }); });