UNPKG

@themost/web

Version:

MOST Web Framework 2.0 - Web Server Module

109 lines (100 loc) 3.65 kB
/** * @license * MOST Web Framework 2.0 Codename Blueshift * Copyright (c) 2017, THEMOST LP All rights reserved * * Use of this source code is governed by an BSD-3-Clause license that can be * found in the LICENSE file at https://themost.io/license */ var LangUtils = require('@themost/common/utils').LangUtils; var HttpViewEngine = require('../types').HttpViewEngine; var _ = require('lodash'); var fs = require('fs'); var DirectiveEngine = require('./../handlers/directive').DirectiveEngine; var PostExecuteResultArgs = require('./../handlers/directive').PostExecuteResultArgs; var HttpViewContext = require('./../mvc').HttpViewContext; var HttpViewResult = require('./../mvc').HttpViewResult; var HttpNotFoundError = require('@themost/common/errors').HttpNotFoundError; /** * @class * @constructor * @param {HttpContext=} context * @augments {HttpViewEngine} */ function NgEngine(context) { NgEngine.super_.bind(this)(context); } LangUtils.inherits(NgEngine, HttpViewEngine); /** * * @param {string} filename * @param {*=} data * @param {Function} callback */ NgEngine.prototype.render = function(filename, data, callback) { var self = this; var template = (self.context.request && self.context.request.route && self.context.request.route.template) || (self.context.request && self.context.request.routeData && self.context.request.routeData.template); var controller = self.context.request && self.context.request.route && self.context.request.route.controller; function renderFile(file, view, data, done) { fs.readFile(file,'utf-8', function(err, str) { try { if (err) { if (err.code === 'ENOENT') { //throw not found exception return done(new HttpNotFoundError('View cannot be found.')); } return done(err); } var viewContext = new HttpViewContext(self.getContext()); viewContext.body = str; viewContext.data = data; viewContext.templatePath = view; var directiveHandler = new DirectiveEngine(); var args = _.assign(new PostExecuteResultArgs(), { "context": self.getContext(), "target":viewContext }); directiveHandler.postExecuteResult(args, function(err) { if (err) { return done(err); } return done(null, viewContext.body); }); } catch (err) { return done(err); } }); } if (typeof template === 'string' && typeof controller === 'string') { return HttpViewResult.resolveViewPath(self.context, controller, template, { extension: "ng" }, function(err, layout) { if (layout) { return renderFile(layout, filename, data, callback); } else { return renderFile(filename, null, data, callback); } }); } return renderFile(filename, null, data, callback); }; /** * @param {HttpContext=} context * @returns {NgEngine} */ NgEngine.createInstance = function(context) { return new NgEngine(context); }; if (typeof exports !== 'undefined') { module.exports.NgEngine = NgEngine; /** * @param {HttpContext=} context * @returns {NgEngine} */ module.exports.createInstance = function(context) { return NgEngine.createInstance(context); }; }