UNPKG

ts-site-starter

Version:

![npm](https://img.shields.io/npm/v/ts-site-starter.svg) ![license](https://img.shields.io/npm/l/ts-site-starter.svg) ![github-issues](https://img.shields.io/github/issues/wspecs/ts-site-starter.svg)

77 lines (64 loc) 2.23 kB
import {Router, NextFunction} from 'express'; import {AppRequest, AppResponse} from './types'; import {Response} from 'express'; import * as Cookies from 'cookies'; const PAGE_NOT_FOUND = 'Oops, the page you\'re looking for is missing.'; const SERVER_ERROR = 'Something went wrong!'; export class BasicRoutes { basePath = ''; templatePath = ''; errorMessage: string; router: Router; constructor(basePath: string = '', errorMessage404=PAGE_NOT_FOUND, serverErrorMessage=SERVER_ERROR) { this.basePath = basePath; this.errorMessage = errorMessage404; this.router = Router(); this.router.use((req: any, res: any, next: NextFunction) => { this.initializeRouter(req, res, serverErrorMessage); next(); }); } private initializeRouter(req: AppRequest, res: AppResponse, serverErrorMessage: string) { if (this.basePath) { req.basePath = '/' + this.basePath; this.templatePath = this.basePath + '/'; } else { req.basePath = this.basePath; } req.cookies = new Cookies(req as any, res as any); req.errorFunction = this.showError; req.serverErrorMessage = serverErrorMessage; } private error(req: AppRequest, res: AppResponse) { return this.showError(res, 404); } showError(res: AppResponse, code=404, message=this.errorMessage) { const page = {error: {code, message}}; res.status(code) res.serve(this.templatePath + 'error', page); } getCookie(req: AppRequest, name: string) { req.cookies.get(name); } setCookie(req: AppRequest, name: string, value: string|number|boolean, options={}) { req.cookies.set(name, value, { httpOnly: true, path: '/' + this.basePath, ...options, }); } renderLayout(page: string, renderFn: any) { return this.renderPage(this.templatePath + 'layout', page, renderFn); } redirect(res: AppResponse, url: string) { res.redirect('/' + this.templatePath + url); } renderPage(path: string, page: string, renderFn: any) { return renderFn(path, page); } getRoutes() { this.router.get('*', this.error.bind(this)); return this.router; } }