diff --git a/src/router/Router.ts b/src/router/Router.ts index ec8dab35..14ef9296 100644 --- a/src/router/Router.ts +++ b/src/router/Router.ts @@ -19,7 +19,7 @@ export interface RouterEnv extends Env { export interface Destination { path?: string; - name?: string; + to?: string; params?: RouteParams; } @@ -53,6 +53,9 @@ export class Router { if (partialRoute.component) { QWeb.register("__component__" + partialRoute.name, partialRoute.component); } + if (partialRoute.redirect) { + this.validateDestination(partialRoute.redirect); + } partialRoute.params = partialRoute.path ? findParams(partialRoute.path) : []; this.routes[partialRoute.name] = partialRoute as Route; this.routeIds.push(partialRoute.name); @@ -75,16 +78,20 @@ export class Router { } destToUrl(dest: Destination): string { - if ((!dest.path && !dest.name) || (dest.path && dest.name)) { - throw new Error(`Invalid destination: ${JSON.stringify(dest)}`); - } - return dest.path || this.routeToURL(this.routes[dest.name!].path, dest.params!); + this.validateDestination(dest); + return dest.path || this.routeToURL(this.routes[dest.to!].path, dest.params!); } get currentRouteName(): string | null { return this.currentRoute && this.currentRoute.name; } + private validateDestination(dest: Destination) { + if ((!dest.path && !dest.to) || (dest.path && dest.to)) { + throw new Error(`Invalid destination: ${JSON.stringify(dest)}`); + } + } + private routeToURL(path: string, params: RouteParams): string { const parts = path.split("/"); const l = parts.length; diff --git a/tests/router/directive.test.ts b/tests/router/directive.test.ts index a6be0beb..aa27c316 100644 --- a/tests/router/directive.test.ts +++ b/tests/router/directive.test.ts @@ -43,12 +43,12 @@ describe("router directive t-routecomponent", () => { ]; router = new TestRouter(env, routes, { mode: "history" }); - router.navigate({ name: "about" }); + router.navigate({ to: "about" }); const app = new App(env); await app.mount(fixture); expect(fixture.innerHTML).toBe("
About
"); - router.navigate({ name: "users" }); + router.navigate({ to: "users" }); await nextTick(); expect(fixture.innerHTML).toBe("
Users
"); expect(env.qweb.templates.App.fn.toString()).toMatchSnapshot(); @@ -70,7 +70,7 @@ describe("router directive t-routecomponent", () => { const routes = [{ name: "book", path: "/book/{{title}}", component: Book }]; router = new TestRouter(env, routes, { mode: "history" }); - router.navigate({ name: "book", params: { title: "1984" } }); + router.navigate({ to: "book", params: { title: "1984" } }); const app = new App(env); await app.mount(fixture); expect(fixture.innerHTML).toBe("
Book 1984
"); @@ -97,7 +97,7 @@ describe("router directive t-routecomponent", () => { const routes = [{ name: "book", path: "/book/{{title}}/{{val.number}}", component: Book }]; router = new TestRouter(env, routes, { mode: "history" }); - router.navigate({ name: "book", params: { title: "1984", val: "123" } }); + router.navigate({ to: "book", params: { title: "1984", val: "123" } }); const app = new App(env); await app.mount(fixture); expect(fixture.innerHTML).toBe("
Book 1984|124
"); diff --git a/tests/router/router.test.ts b/tests/router/router.test.ts index c3b473da..8398667c 100644 --- a/tests/router/router.test.ts +++ b/tests/router/router.test.ts @@ -16,6 +16,16 @@ afterEach(() => { router = null; }); +describe("router miscellaneous", () => { + test("validate routes shape", () => { + expect(() => { + router = new TestRouter(env, [ + { name: "someroute", path: "/some/path", redirect: { abc: "hey" } as Destination } + ]); + }).toThrow(`Invalid destination: {"abc":"hey"}`); + }); +}); + describe("routeToURL", () => { const routeToURL = Router.prototype["routeToURL"]; test("simple non parameterized path", () => { @@ -37,11 +47,11 @@ describe("destToURL", () => { }).toThrow('Invalid destination: {"abc":123}'); expect(() => { - router!.destToUrl({ name: "someroute" } as Destination); + router!.destToUrl({ to: "someroute" } as Destination); }).not.toThrow(); expect(() => { - router!.destToUrl({ path: "/someroute", name: "otherroute" } as Destination); + router!.destToUrl({ path: "/someroute", to: "otherroute" } as Destination); }).toThrow(); }); }); @@ -76,10 +86,10 @@ describe("redirect", () => { test("can redirect to other route", () => { router = new TestRouter(env, [ { name: "routea", path: "/some/path" }, - { name: "routeb", path: "/some/other/path", redirect: { name: "routea" } } + { name: "routeb", path: "/some/other/path", redirect: { to: "routea" } } ]); - router.navigate({ name: "routeb" }); + router.navigate({ to: "routeb" }); expect(window.location.pathname).toBe("/some/path"); expect(router.currentRouteName).toBe("routea"); }); @@ -90,7 +100,7 @@ describe("redirect", () => { { name: "routeb", path: "/some/other/path", redirect: { path: "/some/path" } } ]); - router.navigate({ name: "routeb" }); + router.navigate({ to: "routeb" }); expect(window.location.pathname).toBe("/some/path"); expect(router.currentRouteName).toBe("routea"); });