summaryrefslogtreecommitdiffstats
path: root/lib/precompiler.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/precompiler.js')
-rw-r--r--lib/precompiler.js76
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;
+}