UNPKG

@axway/api-builder-runtime

Version:

API Builder Runtime

116 lines (105 loc) 3.1 kB
/** * @class HandlebarsRendererEngine * Renderer engine for Handlebar templates. * @extends APIBuilderRendererEngine * @pseudo */ /** * @property skipread * @hide */ var handlebars = require('handlebars'), fs = require('fs'), util = require('./util'), watchers = []; const os = require('os'); const platform = os.platform(); exports.extension = 'hbs'; function render(app, filename, opts) { filename = util.resolveLayoutFilename(app, filename); var tpl = handlebars.compile(fs.readFileSync(filename).toString(), { noEscape: true }); return tpl(opts).toString(); } exports.createRenderer = function (content, filename, app) { var tpl = handlebars.compile(content, { noEscape: true }); return function (filePath, opts, callback) { util.render(app, tpl(opts || {}).toString(), opts, exports.extension, render, callback); }; }; /** * @property {Object} Handlebars * handlebars module instance to access its APIs. */ exports.Handlebars = handlebars; /** * @method registerHelper * Registers a handlebar helper function. * @param {String} name Field name. * @param {Function} callback Helper function. */ exports.registerHelper = handlebars.registerHelper.bind(handlebars); /** * @method registerPartial * Registers a partial template. * @param {String} name Name of the partial template. * @param {String} template Template string. */ exports.registerPartial = handlebars.registerPartial.bind(handlebars); function isProduction() { return process.env.NODE_ENV === 'production' || (process.env.serverId && process.env.appid); } /** * Loops through a directory and sets up all of the * associated files as Handlebar Partials. * * @param {String} dir Path of the directory to use as partials directory * @param {Boolean} watch Set to `true` to monitor and update file changes. */ exports.registerPartials = function (dir, watch) { var fs = require('fs'), path = require('path'), ext = '.' + exports.extension; fs.readdirSync(dir) .filter(function (fn) { return path.extname(fn) === ext; }) .forEach(function (fn) { var f = path.join(dir, fn), stat = fs.statSync(f); if (stat.isDirectory()) { exports.registerPartials(f); } else { var fileName = path.basename(f).replace(ext, ''); handlebars.registerPartial(fileName, fs.readFileSync(f, 'utf8')); } }); if (watch === undefined && !isProduction() || watch) { // recursive only works on windows and macos const recursive = platform === 'win32' || platform === 'darwin'; var watcher = fs.watch( dir, { persistent: true, recursive }, function (event, filename) { // according to the docs, filename isn't always provided if (filename) { var name = path.basename(filename).replace(ext, ''); filename = path.join(dir, filename); if (fs.existsSync(filename)) { handlebars.registerPartial(name, fs.readFileSync(filename, 'utf8')); } } } ); watchers.push(watcher); } }; exports.cleanupWatchers = function () { for (var i = 0; i < watchers.length; i++) { watchers[i].close(); } watchers = []; };