prototypes/server/extend/template-manager/viewer.js

const _faceboxTemplate = require('./facebox-templates.js');

/**
 * @typedef {object} TemplateManagerRenderOptions
 */

/**
 * @class
 * @name TemplateManagerViewer
 * @param {object} options 
 * @param {FSLibrary} options._fs
 */
function TemplateManagerViewer(options) {

	/**
	 * @memberof TemplateManagerViewer#
	 * @name _facebox
	 * @type {FaceboxTemplate}
	 */;
	this._facebox = new _faceboxTemplate({
		_fs: options._fs
	});

	/**
	 * @memberof TemplateManagerViewer#
	 * @name _debug
	 * @type {boolean}
	 */
	let _debug = false;
	Object.defineProperty(
		this,
		'_debug',
		{
			get: () => _debug,
			set: (v) => {
				_debug = !!v;
				//@ts-ignore
				this._facebox._debug = _debug;
			}
		}
	);
	
	/**
	 * @memberof TemplateManagerViewer#
	 * @name _env
	 * @type {Object<string,any>}
	 */;
	let _env = {};
	Object.defineProperty(
		this,
		'_env',
		{
			get: () => _env,
			set: (data) => {
				Object.assign(_env, data);
				//@ts-ignore
				this._facebox._env = _env;
			}
		}
	);

	/**
	 * @memberof TemplateManagerViewer#
	 * @method renderCode
	 * @param {string} code 
	 * @param {Object<string, any>} vars 
	 * @param {string} virtualFilePath 
	 * @param {function} callback 
	 */
	this.renderCode	= function (code, vars, virtualFilePath, callback) {
		return this._facebox.renderCode(code, vars, callback, virtualFilePath);
	}.bind(this);

	return this;
};

/**
 * @memberof TemplateManagerViewer#
 * @method render
 * @param {SGAppsServerResponse} response 
 * @param {TemplateManagerTemplate} view
 * @param {Object<string,any>} vars
 * @this TemplateManagerViewer
 */
TemplateManagerViewer.prototype.render	= function( response, view, vars ) {
	var getStackTrace = function() {
		var obj = {};
		Error.captureStackTrace(obj, getStackTrace);
		return obj.stack;
	};
	var err;
	if( view.path.match(/\.(tpl|fbx-tpl)$/) ) {
		if (view.code) {
			this._facebox.renderCode(
				view.code,
				vars,
				function( err, html ) {
					if (err) {
						if(Array.isArray(err)) {
							err.forEach(function(v) {
								throw v;
							});
						} else {
							throw err;
						}
					}
					response.send(html);
				},
				view.path
			);
		} else {
			try {
				this._facebox.renderFile( view.path, vars, function( err, html ) {
					if (err) {
						if(Array.isArray(err)) {
							err.forEach(function(v) {
								throw v;
							});
						} else {
							throw err;
						}
					}
					response.send(html);
				});
			} catch (err) {
				response.sendError(err);
			}
		}
	} else {
		response.pipeFile(
			view.path,
			function (err) {
				if (!response._flags.finished) {
					if (err) {
						response.sendError(err);
					} else {
						response.send('');
					}
				}
			}
		);
	}
};

module.exports	= TemplateManagerViewer;