73 lines
1.7 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.
*/
2021-04-29 11:11:46 +02:00
module.exports = function(options, cb) {
2016-03-18 11:12:50 +01:00
cb = reportback.extend(cb, {
noTemplate: 'error',
2021-04-29 11:11:46 +02:00
alreadyExists: 'error',
2016-03-18 11:12:50 +01:00
});
// 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);
}
2016-03-18 11:12:50 +01:00
const absTemplatePath = path.resolve(options.templatesDirectory, options.templatePath);
fs.readFile(absTemplatePath, 'utf8', (err, contents) => {
2016-03-18 11:12:50 +01:00
if (err) {
err = err instanceof Error ? err : new Error(err);
2018-05-04 17:36:50 +02:00
err.message = `Template error: ${err.message}`;
2016-03-18 11:12:50 +01:00
err.path = absTemplatePath;
if (err.code === 'ENOENT') {
return cb.noTemplate(err);
} else {
return cb(err);
}
}
try {
2018-07-05 11:28:55 +02:00
const compiled = _.template(contents, {
2021-04-29 11:11:46 +02:00
interpolate: /<%=([\s\S]+?)%>/g,
2018-07-05 11:28:55 +02:00
});
2016-03-18 11:12:50 +01:00
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);
}
2021-04-29 11:11:46 +02:00
return fileHelper(
_.merge(options, {
contents,
}),
cb
);
2016-03-18 11:12:50 +01:00
});
};