From 88959c59fe2e0c6d6ba3db7eafd9627b4ec188f2 Mon Sep 17 00:00:00 2001 From: Katalina T Date: Wed, 5 Jun 2019 10:13:57 -0500 Subject: [PATCH] [ui-server]: working test of UI server --- packages/roleypoly-ui-server/.gitignore | 1 + packages/roleypoly-ui-server/README.md | 3 ++ packages/roleypoly-ui-server/package.json | 12 ++++- packages/roleypoly-ui-server/src/index.ts | 62 +++++++++++++++++++++++ packages/roleypoly-ui/.lintstagedrc.yml | 3 ++ packages/roleypoly-ui/mappings.js | 21 ++++++++ 6 files changed, 100 insertions(+), 2 deletions(-) create mode 100644 packages/roleypoly-ui-server/.gitignore create mode 100644 packages/roleypoly-ui-server/README.md create mode 100644 packages/roleypoly-ui-server/src/index.ts create mode 100644 packages/roleypoly-ui/mappings.js diff --git a/packages/roleypoly-ui-server/.gitignore b/packages/roleypoly-ui-server/.gitignore new file mode 100644 index 0000000..7951405 --- /dev/null +++ b/packages/roleypoly-ui-server/.gitignore @@ -0,0 +1 @@ +lib \ No newline at end of file diff --git a/packages/roleypoly-ui-server/README.md b/packages/roleypoly-ui-server/README.md new file mode 100644 index 0000000..40fcc72 --- /dev/null +++ b/packages/roleypoly-ui-server/README.md @@ -0,0 +1,3 @@ +# roleypoly ui server + +This is a simple server built around the UI itself. It actually has no idea what routes go to where, those are all defined by @roleypoly/ui/mappings.js and next.js itself. \ No newline at end of file diff --git a/packages/roleypoly-ui-server/package.json b/packages/roleypoly-ui-server/package.json index 449e052..fbe7c1b 100644 --- a/packages/roleypoly-ui-server/package.json +++ b/packages/roleypoly-ui-server/package.json @@ -5,9 +5,17 @@ "scripts": { "build": "tsc", "precommit": "lint-staged", - "dev": "yarn build --watch" + "dev": "yarn build --watch", + "start": "node lib/index.js" + }, + "dependencies": { + "koa": "^2.7.0", + "koa-better-router": "^2.1.1", + "kompression": "richard-riverford/kompression#0d4480c", + "@roleypoly/ui": "2.0.0", + "chalk": "^2.4.2", + "dotenv": "^8.0.0" }, - "dependencies": {}, "devDependencies": { "lint-staged": "^8.1.7", "tslint": "^5.17.0", diff --git a/packages/roleypoly-ui-server/src/index.ts b/packages/roleypoly-ui-server/src/index.ts new file mode 100644 index 0000000..e95840f --- /dev/null +++ b/packages/roleypoly-ui-server/src/index.ts @@ -0,0 +1,62 @@ +import 'dotenv/config' +import Koa, { Context } from 'koa' +import mappings from '@roleypoly/ui/mappings' +import connector from '@roleypoly/ui/connector' +import betterRouter from 'koa-better-router' +import compress from 'kompression' + +type HTTPHandler = (path: string, handler: (ctx: Context, next: () => void) => any) => void +export type Router = { + get: HTTPHandler, + post: HTTPHandler, + patch: HTTPHandler, + delete: HTTPHandler, + put: HTTPHandler, + middleware: () => any +} + +const app = new Koa() + +async function start () { + const router: Router = betterRouter().loadMethods() + + app.use(compress()) + + const next = connector({ dev: process.env.NODE_ENV === 'development' }) + await next.prepare() + const nextHandler = next.getRequestHandler() + + // UI dynamic mappings + for (let mapping in mappings) { + const { path, noAutoFix, custom } = mappings[mapping] as { path: string, noAutoFix?: boolean, custom?: (router: Router) => void } + + // render the path if mapping is GET-ted + router.get(mapping, (ctx: Context) => { + ctx.status = 200 + return next.render(ctx.req, ctx.res, path, { ...ctx.query, ...ctx.params }) + }) + + // redirect the inverse path if there isn't a parameter + if (!noAutoFix) { + router.get(path, (ctx: Context) => ctx.redirect(mapping)) + } + + // all else, if custom exists, we call it. + // this solves edge cases per route. + if (custom !== undefined) { + custom(router) + } + } + + // handle all else + router.get('*', async (ctx: Context) => { + await nextHandler(ctx.req, ctx.res) + ctx.respond = false + }) + + app.listen(process.env.UI_PORT || '6768') +} + +start().catch((e: Error) => { + console.error('app failed to start', e) +}) diff --git a/packages/roleypoly-ui/.lintstagedrc.yml b/packages/roleypoly-ui/.lintstagedrc.yml index 9c1b0ca..8bd9e8a 100644 --- a/packages/roleypoly-ui/.lintstagedrc.yml +++ b/packages/roleypoly-ui/.lintstagedrc.yml @@ -1,4 +1,7 @@ linters: + ./**/*.{js,jsx}: + - standard --fix + - git add ./**/*.{ts,tsx}: - tslint --fix - stylelint --fix diff --git a/packages/roleypoly-ui/mappings.js b/packages/roleypoly-ui/mappings.js new file mode 100644 index 0000000..50d8364 --- /dev/null +++ b/packages/roleypoly-ui/mappings.js @@ -0,0 +1,21 @@ +module.exports = { + '/s/add': { + path: '/_internal/_server_add', + custom (router) { + router.get('/s/', ctx => ctx.redirect('/s/add')) + } + }, + '/s/:id': { + path: '/_internal/_server', + noAutoFix: true, + custom (router) { + router.get('/_internal/_server', ctx => { + if (ctx.query.id) { + return ctx.redirect(`/s/${ctx.query.id}`) + } + + return ctx.redirect('/s/add') + }) + } + } +}