var specificity = require('route-order')(); var slash = require('express-slash'); function OKServer(options) { if (!(this instanceof OKServer)) return new OKServer(options); options = options || {}; if (!options.express) throw new Error('No Express provided to OKServer'); if (!options.app) throw new Error('No Express app provided to OKServer') if (!options.views) throw new Error('No views provided to OKServer'); var views = options.views; var express = options.express; var app = this._app = options.app; var router = express.Router({ strict: app.get('strict routing') }); Object.keys(views) // Sort such that more general routes are matched last .sort(specificity) // Add the views .forEach(function(route) { var view = views[route]; var mount = view.mount; if (!mount) throw Error('View doesn\'t specify a mount point'); var handler = view.middleware(); if (!handler) throw new Error('View doesn\'t provide middleware'); router[mount](route, handler); }); app.use(router); app.use(slash()); /** * Create a handler which redirect all requests to * the same route with a trailing slash appended */ function redirect(routeNoSlash) { return function(req, res) { res.redirect(301, routeNoSlash + '/'); } } } OKServer.prototype.listen = function listen(port) { this._app.listen(port || 1337); return this; }; module.exports = OKServer;