mirror of
https://github.com/strapi/strapi.git
synced 2025-07-18 14:32:56 +00:00
73 lines
1.7 KiB
JavaScript
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
|
|
);
|
|
});
|
|
};
|