diff options
Diffstat (limited to 'lib/precompiler.js')
-rw-r--r-- | lib/precompiler.js | 76 |
1 files changed, 72 insertions, 4 deletions
diff --git a/lib/precompiler.js b/lib/precompiler.js index 12a5a1f..9f23ef6 100644 --- a/lib/precompiler.js +++ b/lib/precompiler.js @@ -7,12 +7,64 @@ import {SourceMapConsumer, SourceNode} from 'source-map'; import uglify from 'uglify-js'; module.exports.loadTemplates = function(opts, callback) { + loadStrings(opts, function(err, strings) { + if (err) { + callback(err); + } else { + loadFiles(opts, function(err, files) { + if (err) { + callback(err); + } else { + opts.templates = strings.concat(files); + callback(undefined, opts); + } + }); + } + }); +}; + +function loadStrings(opts, callback) { + let strings = arrayCast(opts.string), + names = arrayCast(opts.name); + + if (names.length !== strings.length + && strings.length > 1) { + return callback(new Handlebars.Exception('Number of names did not match the number of string inputs')); + } + + Async.map(strings, function(string, callback) { + if (string !== '-') { + callback(undefined, string); + } else { + // Load from stdin + let buffer = ''; + process.stdin.setEncoding('utf8'); + + process.stdin.on('data', function(chunk) { + buffer += chunk; + }); + process.stdin.on('end', function() { + callback(undefined, buffer); + }); + } + }, + function(err, strings) { + strings = strings.map((string, index) => ({ + name: names[index], + path: names[index], + source: string + })); + callback(err, strings); + }); +} + +function loadFiles(opts, callback) { // Build file extension pattern let extension = (opts.extension || 'handlebars').replace(/[\\^$*+?.():=!|{}\-\[\]]/g, function(arg) { return '\\' + arg; }); extension = new RegExp('\\.' + extension + '$'); let ret = [], - queue = opts.files.map((template) => ({template, root: opts.root})); + queue = (opts.files || []).map((template) => ({template, root: opts.root})); Async.whilst(() => queue.length, function(callback) { let {template: path, root} = queue.shift(); @@ -74,9 +126,7 @@ module.exports.loadTemplates = function(opts, callback) { if (err) { callback(err); } else { - opts.templates = ret; - - callback(undefined, opts); + callback(undefined, ret); } }); } @@ -100,6 +150,12 @@ module.exports.cli = function(opts) { throw new Handlebars.Exception('Unable to output multiple templates in simple mode'); } + // Force simple mode if we have only one template and it's unnamed. + if (!opts.amd && !opts.commonjs && opts.templates.length === 1 + && !opts.templates[0].name) { + opts.simple = true; + } + // Convert the known list into a hash let known = {}; if (opts.known && !Array.isArray(opts.known)) { @@ -156,6 +212,10 @@ module.exports.cli = function(opts) { if (opts.simple) { output.add([precompiled, '\n']); } else { + if (!template.name) { + throw new Handlebars.Exception('Name missing for template'); + } + if (opts.amd && !multiple) { output.add('return '); } @@ -206,3 +266,11 @@ module.exports.cli = function(opts) { console.log(output); } }; + +function arrayCast(value) { + value = value != null ? value : []; + if (!Array.isArray(value)) { + value = [value]; + } + return value; +} |