react / wstein / node_modules / jest-cli / node_modules / istanbul / node_modules / handlebars / dist / cjs / precompiler.js
80698 views"use strict";12var fs = require('fs'),3Handlebars = require('./index'),4basename = require('path').basename,5SourceMap = require('source-map'),6SourceMapConsumer = SourceMap.SourceMapConsumer,7SourceNode = SourceMap.SourceNode,8uglify = require('uglify-js');910module.exports.cli = function(opts) {11if (opts.version) {12console.log(Handlebars.VERSION);13return;14}1516if (!opts.templates.length) {17throw new Handlebars.Exception('Must define at least one template or directory.');18}1920opts.templates.forEach(function(template) {21try {22fs.statSync(template);23} catch (err) {24throw new Handlebars.Exception('Unable to open template file "' + template + '"');25}26});2728if (opts.simple && opts.min) {29throw new Handlebars.Exception('Unable to minimize simple output');30}31if (opts.simple && (opts.templates.length !== 1 || fs.statSync(opts.templates[0]).isDirectory())) {32throw new Handlebars.Exception('Unable to output multiple templates in simple mode');33}3435// Convert the known list into a hash36var known = {};37if (opts.known && !Array.isArray(opts.known)) {38opts.known = [opts.known];39}40if (opts.known) {41for (var i = 0, len = opts.known.length; i < len; i++) {42known[opts.known[i]] = true;43}44}4546// Build file extension pattern47var extension = opts.extension.replace(/[\\^$*+?.():=!|{}\-\[\]]/g, function(arg) { return '\\' + arg; });48extension = new RegExp('\\.' + extension + '$');4950var output = new SourceNode();51if (!opts.simple) {52if (opts.amd) {53output.add('define([\'' + opts.handlebarPath + 'handlebars.runtime\'], function(Handlebars) {\n Handlebars = Handlebars["default"];');54} else if (opts.commonjs) {55output.add('var Handlebars = require("' + opts.commonjs + '");');56} else {57output.add('(function() {\n');58}59output.add(' var template = Handlebars.template, templates = ');60if (opts.namespace) {61output.add(opts.namespace);62output.add(' = ');63output.add(opts.namespace);64output.add(' || ');65}66output.add('{};\n');67}68function processTemplate(template, root) {69var path = template,70stat = fs.statSync(path);71if (stat.isDirectory()) {72fs.readdirSync(template).map(function(file) {73var path = template + '/' + file;7475if (extension.test(path) || fs.statSync(path).isDirectory()) {76processTemplate(path, root || template);77}78});79} else {80var data = fs.readFileSync(path, 'utf8');8182if (opts.bom && data.indexOf('\uFEFF') === 0) {83data = data.substring(1);84}8586var options = {87knownHelpers: known,88knownHelpersOnly: opts.o89};9091if (opts.map) {92options.srcName = path;93}94if (opts.data) {95options.data = true;96}9798// Clean the template name99if (!root) {100template = basename(template);101} else if (template.indexOf(root) === 0) {102template = template.substring(root.length+1);103}104template = template.replace(extension, '');105106var precompiled = Handlebars.precompile(data, options);107108// If we are generating a source map, we have to reconstruct the SourceNode object109if (opts.map) {110var consumer = new SourceMapConsumer(precompiled.map);111precompiled = SourceNode.fromStringWithSourceMap(precompiled.code, consumer);112}113114if (opts.simple) {115output.add([precompiled, '\n']);116} else if (opts.partial) {117if(opts.amd && (opts.templates.length == 1 && !fs.statSync(opts.templates[0]).isDirectory())) {118output.add('return ');119}120output.add(['Handlebars.partials[\'', template, '\'] = template(', precompiled, ');\n']);121} else {122if(opts.amd && (opts.templates.length == 1 && !fs.statSync(opts.templates[0]).isDirectory())) {123output.add('return ');124}125output.add(['templates[\'', template, '\'] = template(', precompiled, ');\n']);126}127}128}129130opts.templates.forEach(function(template) {131processTemplate(template, opts.root);132});133134// Output the content135if (!opts.simple) {136if (opts.amd) {137if(opts.templates.length > 1 || (opts.templates.length == 1 && fs.statSync(opts.templates[0]).isDirectory())) {138if(opts.partial){139output.add('return Handlebars.partials;\n');140} else {141output.add('return templates;\n');142}143}144output.add('});');145} else if (!opts.commonjs) {146output.add('})();');147}148}149150151if (opts.map) {152output.add('\n//# sourceMappingURL=' + opts.map + '\n');153}154155output = output.toStringWithSourceMap();156output.map = output.map + '';157158if (opts.min) {159output = uglify.minify(output.code, {160fromString: true,161162outSourceMap: opts.map,163inSourceMap: JSON.parse(output.map)164});165if (opts.map) {166output.code += '\n//# sourceMappingURL=' + opts.map + '\n';167}168}169170if (opts.map) {171fs.writeFileSync(opts.map, output.map, 'utf8');172}173output = output.code;174175if (opts.output) {176fs.writeFileSync(opts.output, output, 'utf8');177} else {178console.log(output);179}180};181182