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

Change subject: WIP: New: add routing
......................................................................

WIP: New: add routing

Bug: T173323
Change-Id: Ieb205a96fba498d4e0127e4f894ab7aa3bea06a3
---
M package-lock.json
M package.json
M src/client/index.tsx
M src/client/tsconfig.json
M src/common/components/app/index.test.ts
M src/common/components/app/index.tsx
A src/common/components/pages/about.tsx
A src/common/components/pages/index.tsx
A src/common/components/pages/not-found.tsx
A src/common/routers/api.tsx
A src/common/routers/route.ts
M src/server/index.ts
A src/types/preact.d.ts
13 files changed, 125 insertions(+), 15 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/marvin refs/changes/10/374110/1

diff --git a/package-lock.json b/package-lock.json
index ea4b546..c95a3f8 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -50,6 +50,12 @@
       "integrity": 
"sha512-c3Npme+2JGqxW8+B+aXdN5SPIlCf1C8WxQC6Ea39rO/ASPosnMkWVR16mDJtRE+2dr2xwOQ7DiLxb+wO/TWuPg==",
       "dev": true
     },
+    "@types/page": {
+      "version": "1.5.32",
+      "resolved": "https://registry.npmjs.org/@types/page/-/page-1.5.32.tgz";,
+      "integrity": 
"sha512-mgpXPpersWqorz6456UZVREk3MoiKlq1XJUH/b/1J2mMFafuKCTOUc8j+EoNiETkIjE/Fv7E9loBA4gpEvKH9Q==",
+      "dev": true
+    },
     "@types/serve-static": {
       "version": "1.7.31",
       "resolved": 
"https://registry.npmjs.org/@types/serve-static/-/serve-static-1.7.31.tgz";,
@@ -4108,6 +4114,32 @@
         "registry-url": "3.1.0"
       }
     },
+    "page": {
+      "version": "1.7.1",
+      "resolved": "https://registry.npmjs.org/page/-/page-1.7.1.tgz";,
+      "integrity": "sha1-OIbBR7iVSHeDdZs36AChEhO8OO0=",
+      "dev": true,
+      "requires": {
+        "path-to-regexp": "1.2.1"
+      },
+      "dependencies": {
+        "isarray": {
+          "version": "0.0.1",
+          "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz";,
+          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+          "dev": true
+        },
+        "path-to-regexp": {
+          "version": "1.2.1",
+          "resolved": 
"https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.2.1.tgz";,
+          "integrity": "sha1-szcFwUAjTYc8hyHHuf2LVB7Tr/k=",
+          "dev": true,
+          "requires": {
+            "isarray": "0.0.1"
+          }
+        }
+      }
+    },
     "pako": {
       "version": "0.2.9",
       "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz";,
diff --git a/package.json b/package.json
index 126b865..895300e 100644
--- a/package.json
+++ b/package.json
@@ -17,7 +17,7 @@
     "--- HOOKS ---": "# Triggered scripts.",
     "precommit": "npm test -s",
     "--- INTERNAL ---": "# Private scripts.",
-    "server:watch": "nodemon -i dist -i src/client -e js,json,ts,tsx 
${VERBOSE:--q} -x 'ts-node src/server'",
+    "server:watch": "nodemon -i dist -i src/client -e js,json,ts,tsx 
${VERBOSE:--q} -x 'ts-node -P src/server src/server'",
     "server:build": "tsc -p src/server",
     "client:watch": "webpack-dev-server -w",
     "client:build": "webpack"
@@ -53,6 +53,7 @@
     "@types/express": "^4.0.36",
     "@types/mocha": "^2.2.41",
     "@types/node": "^8.0.20",
+    "@types/page": "^1.5.32",
     "@types/touch": "^3.1.0",
     "assets-webpack-plugin": "^3.5.1",
     "css-loader": "^0.28.5",
@@ -69,6 +70,7 @@
     "mocha": "^3.5.0",
     "nodemon": "^1.11.0",
     "npm-run-all": "^4.0.2",
+    "page": "^1.7.1",
     "prettier": "^1.5.3",
     "sinon": "^3.0.0",
     "style-loader": "^0.18.2",
diff --git a/src/client/index.tsx b/src/client/index.tsx
index 491feac..946899c 100644
--- a/src/client/index.tsx
+++ b/src/client/index.tsx
@@ -1,10 +1,19 @@
 import "./index.css";
-import { h, render } from "preact";
-import App from "../common/components/app";
+import * as page from "page";
+import { api } from "../common/routers/api";
+import { render } from "preact";
 
 const root = document.getElementById("root");
 if (!root) {
   throw new Error('Missing element with "root" ID.');
 }
 
-render(<App />, root, root.lastElementChild || undefined);
+api.forEach(route => {
+  page(route.path, () =>
+    route
+      .response()
+      .then((m: any) =>
+        render(m.default(), root, root.lastElementChild || undefined)
+      )
+  );
+});
diff --git a/src/client/tsconfig.json b/src/client/tsconfig.json
index 2820b53..e18ffe7 100644
--- a/src/client/tsconfig.json
+++ b/src/client/tsconfig.json
@@ -2,6 +2,7 @@
   "extends": "../../tsconfig.json",
   "compilerOptions": {
     "target": "ES5",
-    "module": "ES2015"
+    "module": "esnext",
+    "lib": [ "dom", "es2015" ]
   }
 }
diff --git a/src/common/components/app/index.test.ts 
b/src/common/components/app/index.test.ts
index 08f68dc..df76ba2 100644
--- a/src/common/components/app/index.test.ts
+++ b/src/common/components/app/index.test.ts
@@ -5,6 +5,6 @@
 describe("app()", () => {
   it("salutes you", () => {
     const html = render(app());
-    assert.ok(html.indexOf("Hello world") !== -1, "App HTML contains a hello");
+    assert.ok(html.indexOf("About") !== -1, "App HTML contains an about");
   });
 });
diff --git a/src/common/components/app/index.tsx 
b/src/common/components/app/index.tsx
index 968f576..b3f1573 100644
--- a/src/common/components/app/index.tsx
+++ b/src/common/components/app/index.tsx
@@ -1,7 +1,19 @@
 import "./index.css";
 import { FunctionalComponent, h } from "preact";
 
-const app: FunctionalComponent<any> = (_props: any): JSX.Element =>
-  <div class="App">Hello world</div>;
+const app: FunctionalComponent<any> = ({ children } = {}) =>
+  <div class="App">
+    <ul>
+      <li>
+        <a href={"/about"}>About</a>
+      </li>
+      <li>
+        <a href={"/404"}>404</a>
+      </li>
+    </ul>
+    <div>
+      {children}
+    </div>
+  </div>;
 
 export default app;
diff --git a/src/common/components/pages/about.tsx 
b/src/common/components/pages/about.tsx
new file mode 100644
index 0000000..33c163d
--- /dev/null
+++ b/src/common/components/pages/about.tsx
@@ -0,0 +1,7 @@
+import App from "../app";
+import { h } from "preact";
+
+export default (): JSX.Element =>
+  <App>
+    <p>About Marvin</p>
+  </App>;
diff --git a/src/common/components/pages/index.tsx 
b/src/common/components/pages/index.tsx
new file mode 100644
index 0000000..06a5c50
--- /dev/null
+++ b/src/common/components/pages/index.tsx
@@ -0,0 +1,7 @@
+import App from "../app";
+import { h } from "preact";
+
+export default (): JSX.Element =>
+  <App>
+    <p>Hello world!</p>
+  </App>;
diff --git a/src/common/components/pages/not-found.tsx 
b/src/common/components/pages/not-found.tsx
new file mode 100644
index 0000000..4088313
--- /dev/null
+++ b/src/common/components/pages/not-found.tsx
@@ -0,0 +1,7 @@
+import App from "../app";
+import { h } from "preact";
+
+export default (): JSX.Element =>
+  <App>
+    <p>Not found</p>
+  </App>;
diff --git a/src/common/routers/api.tsx b/src/common/routers/api.tsx
new file mode 100644
index 0000000..e8bfe9e
--- /dev/null
+++ b/src/common/routers/api.tsx
@@ -0,0 +1,21 @@
+import { Route } from "./route";
+
+const index: Route = {
+  path: "/",
+  response: () => import("../components/pages/index"),
+  status: 200
+};
+
+const about: Route = {
+  path: "/about",
+  response: () => import("../components/pages/about"),
+  status: 200
+};
+
+const notFound: Route = {
+  path: "*",
+  response: () => import("../components/pages/not-found"),
+  status: 404
+};
+
+export const api = [index, about, notFound];
diff --git a/src/common/routers/route.ts b/src/common/routers/route.ts
new file mode 100644
index 0000000..d386ed5
--- /dev/null
+++ b/src/common/routers/route.ts
@@ -0,0 +1,5 @@
+export interface Route {
+  path: string,
+  response: () => Promise<any>,
+  status: number
+}
diff --git a/src/server/index.ts b/src/server/index.ts
index bd9d8b1..770e79b 100644
--- a/src/server/index.ts
+++ b/src/server/index.ts
@@ -2,7 +2,7 @@
 import "ignore-styles";
 
 import * as express from "express";
-import app from "../common/components/app";
+import { api } from "../common/routers/api";
 import page from "./templates/page";
 import { render } from "preact-render-to-string";
 
@@ -19,12 +19,18 @@
 
 server.use(express.static("dist/public"));
 
-server.get("/", (_req, res) => {
-  res.status(200).send(page({ title: "", body: render(app()), assets }));
-});
-
-server.get("*", (_req, res) => {
-  res.status(404).send("Not found");
+api.forEach(route => {
+  server.get(route.path, (_request, response) => {
+    route.response().then((m: any) => {
+      response.status(route.status).send(
+        page({
+          title: "",
+          body: render(m.default()),
+          assets
+        })
+      );
+    });
+  });
 });
 
 server.listen(PORT, () => {
diff --git a/src/types/preact.d.ts b/src/types/preact.d.ts
new file mode 100644
index 0000000..5a5a94e
--- /dev/null
+++ b/src/types/preact.d.ts
@@ -0,0 +1 @@
+export declare type Children = JSX.Element | JSX.Element[] | string;

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ieb205a96fba498d4e0127e4f894ab7aa3bea06a3
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