UNPKG

opinion

Version:

this is my opinion on koa and stuff

77 lines (66 loc) 2.38 kB
"use strict"; var debug = require('debug')('Render'); var _ = require('lodash-contrib'); var path = require('path'); var thunkify = require('thunkify'); var consolidate = require('consolidate'); consolidate.html = require('fs').readFile; var extname = path.extname; var join = path.join; var resolve = path.resolve; var env = process.env.NODE_ENV || 'development'; var engines = _.mapValues(consolidate, function (engine) { if (Object.getPrototypeOf(engine).name === 'GeneratorFunctionPrototype') return engine; return thunkify(engine); }); /** * Add a render() method to koa that allows * you to render almost any templating engine. * * Example: * * app.use(views('./example', { * html: 'underscore' * })); * * // in your route handler * this.body = yield this.render('index'); * * @param {String} defaultPath * @param {String} defaultExt (optional) * @param {Object} opts (optional) * @return {Function} middleware * @api public */ module.exports = function (defaultPath, defaultExt, opts) { defaultPath = defaultPath || 'views'; opts = opts || {}; if (typeof defaultExt === 'object') opts = defaultExt; else opts.ext = defaultExt || 'html'; opts.encoding = opts.encoding || 'utf-8'; opts.settings = opts.settings || {}; opts.settings.views = opts.settings.views || resolve(defaultPath); opts.map = opts.map || {}; // `consolidate` wants to know if it should cache compiled templates opts.cache = ('cache' in opts) ? opts.cache : ('development' != env); debug('default params dir="%s" opts=%j', defaultPath, opts); return function* (viewName, locals) { // merge global, context, and direct locals. locals = _.assign({}, locals, this.locals); var args = _.assign({locals: locals}, opts); // default extname var ext = extname(viewName).substr(1); if (!ext) { viewName += '.' + opts.ext; ext = opts.ext; } // map engine var engineName = opts.map[ext] || ext; var engine = engines[engineName]; // resolve var viewPath = join(defaultPath, viewName); debug('rendering `%s` with engine `%s` - locals: %j', viewPath, engineName, args); this.body = yield engine(viewPath, args); debug('rendered `%s` with engine `%s`', viewPath, engineName); }; };