Niedzielski has uploaded a new change for review. ( 
https://gerrit.wikimedia.org/r/378197 )

Change subject: Update: allow URL to be derived from Route
......................................................................

Update: allow URL to be derived from Route

Bug: T173323
Change-Id: I7aa87b563a8348f8d0009cbfe08b0eb5b2f99c0b
---
M src/common/components/app/app.tsx
M src/common/routers/api.ts
M src/common/routers/route.ts
M src/common/routers/router.ts
4 files changed, 57 insertions(+), 38 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/marvin refs/changes/97/378197/1

diff --git a/src/common/components/app/app.tsx 
b/src/common/components/app/app.tsx
index 250e0d0..df006bd 100644
--- a/src/common/components/app/app.tsx
+++ b/src/common/components/app/app.tsx
@@ -1,5 +1,6 @@
 import "./app.css";
 import { ComponentProps, h } from "preact";
+import { about, index, wiki } from "../../../common/routers/api";
 import Link from "../link";
 
 export default function App({ children }: ComponentProps<any>): JSX.Element {
@@ -7,16 +8,16 @@
     <div class="App">
       <ul>
         <li>
-          <Link href="/">Home</Link>
+          <Link href={index.url()}>Home</Link>
         </li>
         <li>
-          <Link href="/about">About</Link>
+          <Link href={about.url()}>About</Link>
         </li>
         <li>
-          <Link href="/wiki/Banana">Banana</Link>
+          <Link href={wiki.url({ title: "Banana" })}>Banana</Link>
         </li>
         <li>
-          <Link href="/wiki/Cucumber">Cucumber</Link>
+          <Link href={wiki.url({ title: "Cucumber" })}>Cucumber</Link>
         </li>
         <li>
           <Link href="/404">404</Link>
diff --git a/src/common/routers/api.ts b/src/common/routers/api.ts
index 39c9acc..c4855b2 100644
--- a/src/common/routers/api.ts
+++ b/src/common/routers/api.ts
@@ -1,38 +1,34 @@
-import { Route } from "./route";
+import { AnyRoute, Route, newRoute } from "./route";
 import { Props as WikiProps } from "../pages/wiki";
 
-export const index: Route<void, void> = {
+export const index: Route = newRoute({
   path: "/",
   endpoint: () =>
     import(/* webpackChunkName: "pages/index" */ "../pages/index"),
-  chunkName: "pages/index",
-  status: 200
-};
+  chunkName: "pages/index"
+});
 
-export const about: Route<void, void> = {
+export const about: Route = newRoute({
   path: "/about",
   endpoint: () =>
     import(/* webpackChunkName: "pages/about" */ "../pages/about"),
-  chunkName: "pages/about",
-  status: 200
-};
+  chunkName: "pages/about"
+});
 
-export const wiki: Route<WikiProps, void> = {
+export const wiki: Route<WikiProps, void, { title: string }> = newRoute({
   path: "/wiki/:title",
   endpoint: () => import(/* webpackChunkName: "pages/wiki" */ "../pages/wiki"),
-  chunkName: "pages/wiki",
-  status: 200
-};
+  chunkName: "pages/wiki"
+});
 
-export const styleGuide: Route<void, void> = {
+export const styleGuide: Route = newRoute({
   path: "/dev/style-guide",
   endpoint: () =>
     import(/* webpackChunkName: "pages/style-guide" */ "../pages/style-guide"),
-  chunkName: "pages/style-guide",
-  status: 200
-};
+  chunkName: "pages/style-guide"
+});
 
-export const notFound: Route<void, void> = {
+export const notFound: Route = newRoute({
   // `(.*)` is the new `*`. See
   // https://github.com/pillarjs/path-to-regexp/issues/37.
   path: "(.*)",
@@ -40,12 +36,6 @@
     import(/* webpackChunkName: "pages/not-found" */ "../pages/not-found"),
   chunkName: "pages/not-found",
   status: 404
-};
+});
 
-export const routes: Route<any, any>[] = [
-  index,
-  about,
-  wiki,
-  styleGuide,
-  notFound
-];
+export const routes: AnyRoute[] = [index, about, wiki, styleGuide, notFound];
diff --git a/src/common/routers/route.ts b/src/common/routers/route.ts
index fd49c66..af75f4b 100644
--- a/src/common/routers/route.ts
+++ b/src/common/routers/route.ts
@@ -1,10 +1,11 @@
+import * as pathToRegExp from "path-to-regexp";
 import { AnyComponent } from "preact";
 
 export interface RouteParameters {
   [name: string]: string;
 }
 
-export interface Endpoint<Props, State> {
+export interface Endpoint<Props = void, State = void> {
   /** A Preact view component. */
   Component: AnyComponent<Props, State>;
 
@@ -15,9 +16,32 @@
   initialProps?: (parameters: RouteParameters) => Promise<Props>;
 }
 
-export interface Route<Props, State> {
+export interface RouteConfiguration<Props = void, State = void> {
   path: string;
   endpoint: () => Promise<Endpoint<Props, State>>;
   chunkName: string;
-  status: number;
+  status?: number;
 }
+
+export interface Route<Props = void, State = void, Parameters = void>
+  extends RouteConfiguration<Props, State> {
+  status: number;
+
+  /** Generates a URL from parameters. */
+  url: (properties?: Parameters) => string;
+}
+
+export type AnyRoute = Route<any, any, any>;
+
+export const newRoute = <Props, State, Parameters>({
+  path,
+  endpoint,
+  chunkName,
+  status = 200
+}: RouteConfiguration<Props, State>): Route<Props, State, Parameters> => ({
+  path,
+  endpoint,
+  chunkName,
+  status,
+  url: pathToRegExp.compile(path)
+});
diff --git a/src/common/routers/router.ts b/src/common/routers/router.ts
index 2f7c852..695329d 100644
--- a/src/common/routers/router.ts
+++ b/src/common/routers/router.ts
@@ -1,5 +1,9 @@
 import * as pathToRegExp from "path-to-regexp";
-import { Endpoint, Route, RouteParameters } from "../../common/routers/route";
+import {
+  AnyRoute,
+  Endpoint,
+  RouteParameters
+} from "../../common/routers/route";
 import { AnyComponent } from "preact";
 
 export interface RouteResponse<Props, State> {
@@ -18,13 +22,13 @@
   route(url: string): Promise<RouteResponse<any, any>>;
 }
 
-interface ParsedRoute extends Route<any, any> {
+interface ParsedRoute extends AnyRoute {
   parameterNames: pathToRegExp.Key[];
   regularExpression: RegExp;
 }
 
-const parseRoutes = (routes: Route<any, any>[]) =>
-  routes.map((route: Route<any, any>): ParsedRoute => {
+const parseRoutes = (routes: AnyRoute[]) =>
+  routes.map((route: AnyRoute): ParsedRoute => {
     const parameterNames: pathToRegExp.Key[] = [];
     return {
       ...route,
@@ -79,7 +83,7 @@
     }))
   );
 
-export const newRouter = (routes: Route<any, any>[]): Router => {
+export const newRouter = (routes: AnyRoute[]): Router => {
   const parsedRoutes: ParsedRoute[] = parseRoutes(routes);
 
   return {

-- 
To view, visit https://gerrit.wikimedia.org/r/378197
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I7aa87b563a8348f8d0009cbfe08b0eb5b2f99c0b
Gerrit-PatchSet: 1
Gerrit-Project: marvin
Gerrit-Branch: master
Gerrit-Owner: Niedzielski <sniedziel...@wikimedia.org>
Gerrit-Reviewer: Sniedzielski <sniedziel...@wikimedia.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to