diff --git a/lib/mach/render_extension.js b/lib/mach/render_extension.js new file mode 100644 index 0000000..188e2c1 --- /dev/null +++ b/lib/mach/render_extension.js @@ -0,0 +1,49 @@ +(function() { + "use strict"; + + var _ = require("lodash"); + var Promise = require("bluebird"); + + module.exports = extension; + + function extension(mach) { + Object.defineProperty(mach.Connection.prototype, "render", { + configurable: true, + enumerable: false, + writable: true, + value: render + }); + } + + function render(status, view, locals) { + /*jshint validthis:true */ + var data = locals; + var renderer; + + if (_.isNumber(status)) { + this.status = status; + } else { + data = view; + view = status; + } + + if (!_.isObject(this._controller) || !_.isObject(this._controller._view_manager)) { + return Promise.reject("Cannot render templates without a controller!"); + } + + renderer = this._controller._view_manager.rendererForSignature(view); + + if (!_.isFunction(renderer)) { + return Promise.reject("Template not found "+view); + } + + // TODO: pull content-type from file extension + this.response.contentType = "text/html"; + data = _.extend({ conn: this }, data); + + return renderer(data).bind(this).then(function(content) { + return this.html(content); + }); + } + +}()); diff --git a/test/mach/render_extension_test.js b/test/mach/render_extension_test.js new file mode 100644 index 0000000..1442ace --- /dev/null +++ b/test/mach/render_extension_test.js @@ -0,0 +1,22 @@ +(function() { + "use strict"; + + var assert = require("assert"); + var _ = require("lodash"); + + var renderExtension = require("../../lib/mach/render_extension"); + var mach = require("mach"); + + describe("mach", function() { + describe("renderExtension", function() { + before(function() { + mach.extend(renderExtension); + }); + + it("adds a 'render' function to mach.Connection.prototype", function() { + assert(_.isFunction(mach.Connection.prototype.render)); + }); + }); + }); + +}());