csballz/koala-puree

View on GitHub
lib/dust.js

Summary

Maintainability
B
4 hrs
Test Coverage

var codust = require("co-dust");
var debug = require("debug")("koala-puree:middleware:dust");
var moment = require("moment");
var glob = require("glob");
var fs = require("fs");
var BASEOUTPUT = "./.tmp/view";
var mkdirp = require("mkdirp");
var extend = require('extend');
exports = module.exports = function(settings){
    var precompile = settings.precompile;
    if ( void 0 === precompile ) {
        precompile = false;
    }
    return {

        setup: function*(next) {
      // precompile all files to .tmp
            debug("Reaching koala puree dust middleware");
            var app = this._app;
            var dust;
            if ( true === precompile ) {
                dust = new codust({base: require("path").resolve(this._basePath, "./.tmp/view"), precompiled: precompile});
                dust._dust.config.cjs = true;
        // start precompiling
                yield new Promise(function(resolve, reject){
                    mkdirp.sync(BASEOUTPUT);
                    glob("app/view/**/*.dust", function(err, files){
                        if ( err ) {
                            reject(err);
                        }
                        files.map(function(file){
                            return [fs.readFileSync(file).toString(), file.substr("app/view/".length)];
                        }).map(function(data){
                            mkdirp.sync(require("path").join(BASEOUTPUT,require("path").dirname(data[1])));
                            return fs.writeFileSync(require("path").join(BASEOUTPUT, data[1]), dust._dust.compile(data[0], data[1]));
                        });
                        resolve();
                    });
                });
            } else {
                dust = new codust({base: require("path").resolve(this._basePath, "./app/view")});
            }

            this._dust = dust;
            var helpers = require("./dust_helpers.js");

            helpers(dust._dust);
      //modify koa-trie-router to allow namespace stripping
            this._app.use(function*(next){

        //var self = this;
                debug("co-dust middleware");
                var self = this;
                this.render = function*(path, context){
                    context = context || {};
                    if ( this.res.templateContext ) {
                        context = extend(this.res.templateContext, context);
                    }
                    context.loggedIn = self.req.isAuthenticated;
                    context.user = self.req.user;
                    context.today = moment();
                    if ( false === app.puree._config.cacheTemplate ) { delete app.puree._dust._dust.cache[path]; }
                    debug("rendering", path, context);
                    self.body = yield dust.render(path, context);
                };
                debug("did we get to this?");
                yield* next;
            });
            debug("going to next");
            yield* next;
            debug("completing 2nd part");
        }
    };
};