108 lines
3.6 KiB
JavaScript
108 lines
3.6 KiB
JavaScript
'use strict';
|
|
|
|
var fs = require('fs');
|
|
var path = require('path');
|
|
var _require = require('./lib'),
|
|
_prettifyError = _require._prettifyError;
|
|
var compiler = require('./compiler');
|
|
var _require2 = require('./environment'),
|
|
Environment = _require2.Environment;
|
|
var precompileGlobal = require('./precompile-global');
|
|
function match(filename, patterns) {
|
|
if (!Array.isArray(patterns)) {
|
|
return false;
|
|
}
|
|
return patterns.some(function (pattern) {
|
|
return filename.match(pattern);
|
|
});
|
|
}
|
|
function precompileString(str, opts) {
|
|
opts = opts || {};
|
|
opts.isString = true;
|
|
var env = opts.env || new Environment([]);
|
|
var wrapper = opts.wrapper || precompileGlobal;
|
|
if (!opts.name) {
|
|
throw new Error('the "name" option is required when compiling a string');
|
|
}
|
|
return wrapper([_precompile(str, opts.name, env)], opts);
|
|
}
|
|
function precompile(input, opts) {
|
|
// The following options are available:
|
|
//
|
|
// * name: name of the template (auto-generated when compiling a directory)
|
|
// * isString: input is a string, not a file path
|
|
// * asFunction: generate a callable function
|
|
// * force: keep compiling on error
|
|
// * env: the Environment to use (gets extensions and async filters from it)
|
|
// * include: which file/folders to include (folders are auto-included, files are auto-excluded)
|
|
// * exclude: which file/folders to exclude (folders are auto-included, files are auto-excluded)
|
|
// * wrapper: function(templates, opts) {...}
|
|
// Customize the output format to store the compiled template.
|
|
// By default, templates are stored in a global variable used by the runtime.
|
|
// A custom loader will be necessary to load your custom wrapper.
|
|
|
|
opts = opts || {};
|
|
var env = opts.env || new Environment([]);
|
|
var wrapper = opts.wrapper || precompileGlobal;
|
|
if (opts.isString) {
|
|
return precompileString(input, opts);
|
|
}
|
|
var pathStats = fs.existsSync(input) && fs.statSync(input);
|
|
var precompiled = [];
|
|
var templates = [];
|
|
function addTemplates(dir) {
|
|
fs.readdirSync(dir).forEach(function (file) {
|
|
var filepath = path.join(dir, file);
|
|
var subpath = filepath.substr(path.join(input, '/').length);
|
|
var stat = fs.statSync(filepath);
|
|
if (stat && stat.isDirectory()) {
|
|
subpath += '/';
|
|
if (!match(subpath, opts.exclude)) {
|
|
addTemplates(filepath);
|
|
}
|
|
} else if (match(subpath, opts.include)) {
|
|
templates.push(filepath);
|
|
}
|
|
});
|
|
}
|
|
if (pathStats.isFile()) {
|
|
precompiled.push(_precompile(fs.readFileSync(input, 'utf-8'), opts.name || input, env));
|
|
} else if (pathStats.isDirectory()) {
|
|
addTemplates(input);
|
|
for (var i = 0; i < templates.length; i++) {
|
|
var name = templates[i].replace(path.join(input, '/'), '');
|
|
try {
|
|
precompiled.push(_precompile(fs.readFileSync(templates[i], 'utf-8'), name, env));
|
|
} catch (e) {
|
|
if (opts.force) {
|
|
// Don't stop generating the output if we're
|
|
// forcing compilation.
|
|
console.error(e); // eslint-disable-line no-console
|
|
} else {
|
|
throw e;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return wrapper(precompiled, opts);
|
|
}
|
|
function _precompile(str, name, env) {
|
|
env = env || new Environment([]);
|
|
var asyncFilters = env.asyncFilters;
|
|
var extensions = env.extensionsList;
|
|
var template;
|
|
name = name.replace(/\\/g, '/');
|
|
try {
|
|
template = compiler.compile(str, asyncFilters, extensions, name, env.opts);
|
|
} catch (err) {
|
|
throw _prettifyError(name, false, err);
|
|
}
|
|
return {
|
|
name: name,
|
|
template: template
|
|
};
|
|
}
|
|
module.exports = {
|
|
precompile: precompile,
|
|
precompileString: precompileString
|
|
}; |