diff options
author | kpdecker <kpdecker@gmail.com> | 2014-11-08 17:03:14 -0600 |
---|---|---|
committer | kpdecker <kpdecker@gmail.com> | 2014-11-08 17:50:01 -0600 |
commit | 0dbeeb450336522816335ecd188951f6079ff0d3 (patch) | |
tree | 24b358bc732950474fdcc18ce99082d71ff87525 /lib/precompiler.js | |
parent | 3ee0682247a1be883810d7251a75a95a5aa7e943 (diff) | |
download | handlebars.js-0dbeeb450336522816335ecd188951f6079ff0d3.zip handlebars.js-0dbeeb450336522816335ecd188951f6079ff0d3.tar.gz handlebars.js-0dbeeb450336522816335ecd188951f6079ff0d3.tar.bz2 |
Add source map output support to the CLI
Diffstat (limited to 'lib/precompiler.js')
-rw-r--r-- | lib/precompiler.js | 77 |
1 files changed, 57 insertions, 20 deletions
diff --git a/lib/precompiler.js b/lib/precompiler.js index 6764022..165c008 100644 --- a/lib/precompiler.js +++ b/lib/precompiler.js @@ -2,6 +2,9 @@ var fs = require('fs'), Handlebars = require('./index'), basename = require('path').basename, + SourceMap = require('source-map'), + SourceMapConsumer = SourceMap.SourceMapConsumer, + SourceNode = SourceMap.SourceNode, uglify = require('uglify-js'); module.exports.cli = function(opts) { @@ -45,20 +48,23 @@ module.exports.cli = function(opts) { var extension = opts.extension.replace(/[\\^$*+?.():=!|{}\-\[\]]/g, function(arg) { return '\\' + arg; }); extension = new RegExp('\\.' + extension + '$'); - var output = []; + var output = new SourceNode(); if (!opts.simple) { if (opts.amd) { - output.push('define([\'' + opts.handlebarPath + 'handlebars.runtime\'], function(Handlebars) {\n Handlebars = Handlebars["default"];'); + output.add('define([\'' + opts.handlebarPath + 'handlebars.runtime\'], function(Handlebars) {\n Handlebars = Handlebars["default"];'); } else if (opts.commonjs) { - output.push('var Handlebars = require("' + opts.commonjs + '");'); + output.add('var Handlebars = require("' + opts.commonjs + '");'); } else { - output.push('(function() {\n'); + output.add('(function() {\n'); } - output.push(' var template = Handlebars.template, templates = '); - output.push(opts.namespace); - output.push(' = '); - output.push(opts.namespace); - output.push(' || {};\n'); + output.add(' var template = Handlebars.template, templates = '); + if (opts.namespace) { + output.add(opts.namespace); + output.add(' = '); + output.add(opts.namespace); + output.add(' || '); + } + output.add('{};\n'); } function processTemplate(template, root) { var path = template, @@ -83,6 +89,9 @@ module.exports.cli = function(opts) { knownHelpersOnly: opts.o }; + if (opts.map) { + options.srcName = path; + } if (opts.data) { options.data = true; } @@ -95,18 +104,26 @@ module.exports.cli = function(opts) { } template = template.replace(extension, ''); + var precompiled = Handlebars.precompile(data, options); + + // If we are generating a source map, we have to reconstruct the SourceNode object + if (opts.map) { + var consumer = new SourceMapConsumer(precompiled.map); + precompiled = SourceNode.fromStringWithSourceMap(precompiled.code, consumer); + } + if (opts.simple) { - output.push(Handlebars.precompile(data, options) + '\n'); + output.add([precompiled, '\n']); } else if (opts.partial) { if(opts.amd && (opts.templates.length == 1 && !fs.statSync(opts.templates[0]).isDirectory())) { - output.push('return '); + output.add('return '); } - output.push('Handlebars.partials[\'' + template + '\'] = template(' + Handlebars.precompile(data, options) + ');\n'); + output.add(['Handlebars.partials[\'', template, '\'] = template(', precompiled, ');\n']); } else { if(opts.amd && (opts.templates.length == 1 && !fs.statSync(opts.templates[0]).isDirectory())) { - output.push('return '); + output.add('return '); } - output.push('templates[\'' + template + '\'] = template(' + Handlebars.precompile(data, options) + ');\n'); + output.add(['templates[\'', template, '\'] = template(', precompiled, ');\n']); } } } @@ -120,21 +137,41 @@ module.exports.cli = function(opts) { if (opts.amd) { if(opts.templates.length > 1 || (opts.templates.length == 1 && fs.statSync(opts.templates[0]).isDirectory())) { if(opts.partial){ - output.push('return Handlebars.partials;\n'); + output.add('return Handlebars.partials;\n'); } else { - output.push('return templates;\n'); + output.add('return templates;\n'); } } - output.push('});'); + output.add('});'); } else if (!opts.commonjs) { - output.push('})();'); + output.add('})();'); } } - output = output.join(''); + + + if (opts.map) { + output.add('\n//# sourceMappingURL=' + opts.map + '\n'); + } + + output = output.toStringWithSourceMap(); + output.map = output.map + ''; if (opts.min) { - output = uglify.minify(output, {fromString: true}).code; + output = uglify.minify(output.code, { + fromString: true, + + outSourceMap: opts.map, + inSourceMap: JSON.parse(output.map) + }); + if (opts.map) { + output.code += '\n//# sourceMappingURL=' + opts.map + '\n'; + } + } + + if (opts.map) { + fs.writeFileSync(opts.map, output.map, 'utf8'); } + output = output.code; if (opts.output) { fs.writeFileSync(opts.output, output, 'utf8'); |