UNPKG

cnpmjs.org

Version:

Private npm registry and web for Enterprise, base on MySQL and Simple Store Service

130 lines (107 loc) 3.08 kB
/**! * cnpmjs.org - servers/web.js * * Copyright(c) cnpmjs.org and other contributors. * MIT Licensed * * Authors: * dead_horse <dead_horse@qq.com> * fengmk2 <fengmk2@gmail.com> (http://fengmk2.github.com) */ "use strict"; /** * Module dependencies. */ var opensearch = require('../middleware/opensearch'); var notFound = require('../middleware/web_not_found'); var staticCache = require('../middleware/static'); var middlewares = require('koa-middlewares'); var markdownMiddleware = require('koa-markdown'); var block = require('../middleware/block'); var logger = require('../common/logger'); var renderMarkdown = require('../common/markdown').render; var auth = require('../middleware/auth'); var routes = require('../routes/web'); var config = require('../config'); var path = require('path'); var http = require('http'); var koa = require('koa'); var fs = require('fs'); var app = koa(); var rootdir = path.dirname(__dirname); app.use(block()); app.use(middlewares.rt({headerName: 'X-ReadTime'})); app.use(middlewares.rewrite('/favicon.ico', '/favicon.png')); app.use(staticCache); if (process.env.NODE_ENV === 'development') { app.use(require('koa-mock')({ datadir: path.join(rootdir, 'test', 'mocks') })); } app.use(opensearch); app.keys = ['todokey', config.sessionSecret]; app.proxy = true; app.use(middlewares.bodyParser()); app.use(auth()); app.use(notFound); if (config.enableCompress) { app.use(middlewares.compress({threshold: 150})); } app.use(middlewares.conditional()); app.use(middlewares.etag()); var viewDir = path.join(rootdir, 'view', 'web'); var docDir = path.join(rootdir, 'docs', 'web'); var layoutFile = path.join(viewDir, '_layout.html'); var footer = config.customFooter || fs.readFileSync(path.join(viewDir, 'footer.html'), 'utf8'); var layout = fs.readFileSync(path.join(viewDir, 'layout.html'), 'utf8') .replace('{{footer}}', footer) .replace('{{logoURL}}', config.logoURL); fs.writeFileSync(layoutFile, layout); // custom web readme home page support var readmeFile = path.join(docDir, '_readme.md'); var readmeContent; if (config.customReadmeFile) { readmeContent = fs.readFileSync(config.customReadmeFile, 'utf8'); } else { readmeContent = fs.readFileSync(path.join(docDir, 'readme.md'), 'utf8'); } fs.writeFileSync(readmeFile, readmeContent); app.use(markdownMiddleware({ baseUrl: '/', root: docDir, layout: layoutFile, titleHolder: '<%= locals.title %>', bodyHolder: '<%- locals.body %>', indexName: '_readme', cache: true, render: renderMarkdown, })); var locals = { config: config }; middlewares.ejs(app, { root: viewDir, viewExt: 'html', layout: '_layout', cache: config.viewCache, debug: config.debug, locals: locals }); /** * Routes */ app.use(middlewares.router(app)); routes(app); /** * Error handler */ app.on('error', function (err, ctx) { err.url = err.url || ctx.request.url; console.log(err.stack); logger.error(err); }); app = http.createServer(app.callback()); if (!module.parent) { app.listen(config.webPort); } module.exports = app;