react / wstein / node_modules / jest-cli / node_modules / istanbul / node_modules / handlebars / lib / precompiler.js
80684 views1var fs = require('fs'),2Handlebars = require('./index'),3basename = require('path').basename,4SourceMap = require('source-map'),5SourceMapConsumer = SourceMap.SourceMapConsumer,6SourceNode = SourceMap.SourceNode,7uglify = require('uglify-js');89module.exports.cli = function(opts) {10if (opts.version) {11console.log(Handlebars.VERSION);12return;13}1415if (!opts.templates.length) {16throw new Handlebars.Exception('Must define at least one template or directory.');17}1819opts.templates.forEach(function(template) {20try {21fs.statSync(template);22} catch (err) {23throw new Handlebars.Exception('Unable to open template file "' + template + '"');24}25});2627if (opts.simple && opts.min) {28throw new Handlebars.Exception('Unable to minimize simple output');29}30if (opts.simple && (opts.templates.length !== 1 || fs.statSync(opts.templates[0]).isDirectory())) {31throw new Handlebars.Exception('Unable to output multiple templates in simple mode');32}3334// Convert the known list into a hash35var known = {};36if (opts.known && !Array.isArray(opts.known)) {37opts.known = [opts.known];38}39if (opts.known) {40for (var i = 0, len = opts.known.length; i < len; i++) {41known[opts.known[i]] = true;42}43}4445// Build file extension pattern46var extension = opts.extension.replace(/[\\^$*+?.():=!|{}\-\[\]]/g, function(arg) { return '\\' + arg; });47extension = new RegExp('\\.' + extension + '$');4849var output = new SourceNode();50if (!opts.simple) {51if (opts.amd) {52output.add('define([\'' + opts.handlebarPath + 'handlebars.runtime\'], function(Handlebars) {\n Handlebars = Handlebars["default"];');53} else if (opts.commonjs) {54output.add('var Handlebars = require("' + opts.commonjs + '");');55} else {56output.add('(function() {\n');57}58output.add(' var template = Handlebars.template, templates = ');59if (opts.namespace) {60output.add(opts.namespace);61output.add(' = ');62output.add(opts.namespace);63output.add(' || ');64}65output.add('{};\n');66}67function processTemplate(template, root) {68var path = template,69stat = fs.statSync(path);70if (stat.isDirectory()) {71fs.readdirSync(template).map(function(file) {72var path = template + '/' + file;7374if (extension.test(path) || fs.statSync(path).isDirectory()) {75processTemplate(path, root || template);76}77});78} else {79var data = fs.readFileSync(path, 'utf8');8081if (opts.bom && data.indexOf('\uFEFF') === 0) {82data = data.substring(1);83}8485var options = {86knownHelpers: known,87knownHelpersOnly: opts.o88};8990if (opts.map) {91options.srcName = path;92}93if (opts.data) {94options.data = true;95}9697// Clean the template name98if (!root) {99template = basename(template);100} else if (template.indexOf(root) === 0) {101template = template.substring(root.length+1);102}103template = template.replace(extension, '');104105var precompiled = Handlebars.precompile(data, options);106107// If we are generating a source map, we have to reconstruct the SourceNode object108if (opts.map) {109var consumer = new SourceMapConsumer(precompiled.map);110precompiled = SourceNode.fromStringWithSourceMap(precompiled.code, consumer);111}112113if (opts.simple) {114output.add([precompiled, '\n']);115} else if (opts.partial) {116if(opts.amd && (opts.templates.length == 1 && !fs.statSync(opts.templates[0]).isDirectory())) {117output.add('return ');118}119output.add(['Handlebars.partials[\'', template, '\'] = template(', precompiled, ');\n']);120} else {121if(opts.amd && (opts.templates.length == 1 && !fs.statSync(opts.templates[0]).isDirectory())) {122output.add('return ');123}124output.add(['templates[\'', template, '\'] = template(', precompiled, ');\n']);125}126}127}128129opts.templates.forEach(function(template) {130processTemplate(template, opts.root);131});132133// Output the content134if (!opts.simple) {135if (opts.amd) {136if(opts.templates.length > 1 || (opts.templates.length == 1 && fs.statSync(opts.templates[0]).isDirectory())) {137if(opts.partial){138output.add('return Handlebars.partials;\n');139} else {140output.add('return templates;\n');141}142}143output.add('});');144} else if (!opts.commonjs) {145output.add('})();');146}147}148149150if (opts.map) {151output.add('\n//# sourceMappingURL=' + opts.map + '\n');152}153154output = output.toStringWithSourceMap();155output.map = output.map + '';156157if (opts.min) {158output = uglify.minify(output.code, {159fromString: true,160161outSourceMap: opts.map,162inSourceMap: JSON.parse(output.map)163});164if (opts.map) {165output.code += '\n//# sourceMappingURL=' + opts.map + '\n';166}167}168169if (opts.map) {170fs.writeFileSync(opts.map, output.map, 'utf8');171}172output = output.code;173174if (opts.output) {175fs.writeFileSync(opts.output, output, 'utf8');176} else {177console.log(output);178}179};180181182