2021-04-29 12:03:54 +02:00

73 lines
1.7 KiB
JavaScript

'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.
if (_.isFunction(options.templatesDirectory)) {
options.templatesDirectory = options.templatesDirectory(options);
}
const absTemplatePath = path.resolve(options.templatesDirectory, options.templatePath);
fs.readFile(absTemplatePath, 'utf8', (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, {
interpolate: /<%=([\s\S]+?)%>/g,
});
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,
}),
cb
);
});
};