64 lines
1.5 KiB
JavaScript
Raw Normal View History

2016-03-18 11:12:50 +01:00
'use strict';
/**
* Module dependencies
*/
// Node.js core.
const path = require('path');
// Public node modules.
const _ = require('lodash');
const fs = require('fs-extra');
const reportback = require('reportback')();
// Local dependencies.
const fileHelper = require('../file');
/**
* Read a dynamic template, compile it using scope.
* Then use `file` helper to write it to its destination.
*/
module.exports = function (options, cb) {
cb = reportback.extend(cb, {
noTemplate: 'error',
alreadyExists: 'error'
});
// Compute the canonical path to a template
// given its relative path from its source generator's
// `templates` directory.
const absTemplatePath = path.resolve(options.templatesDirectory, options.templatePath);
fs.readFile(absTemplatePath, 'utf8', function (err, contents) {
if (err) {
err = err instanceof Error ? err : new Error(err);
err.message = 'Template error: ' + err.message;
err.path = absTemplatePath;
if (err.code === 'ENOENT') {
return cb.noTemplate(err);
} else {
return cb(err);
}
}
try {
const compiled = _.template(contents);
contents = compiled(options);
// With Lodash templates, HTML entities are escaped by default.
// Default assumption is we don't want that, so we'll reverse it.
if (!options.escapeHTMLEntities) {
contents = _.unescape(contents);
}
} catch (e) {
return cb(e);
}
return fileHelper(_.merge(options, {
contents: contents
}), cb);
});
};