Merge branch 'master' into grunt-build

Conflicts:
	package.json
This commit is contained in:
kpdecker
2013-08-24 23:09:04 -05:00
8 changed files with 232 additions and 147 deletions
+20 -27
View File
@@ -12,25 +12,7 @@ var print = require("sys").print;
BenchWarmer.prototype = {
winners: function(benches) {
var result = Benchmark.filter(benches, function(bench) { return bench.cycles; });
if (result.length > 1) {
result.sort(function(a, b) { return b.compare(a); });
first = result[0];
last = result[result.length - 1];
var winners = [];
Benchmark.each(result, function(bench) {
if (bench.compare(first) === 0) {
winners.push(bench);
}
});
return winners;
} else {
return result;
}
return Benchmark.filter(benches, 'fastest');
},
suite: function(suite, fn) {
this.suiteName = suite;
@@ -50,9 +32,7 @@ BenchWarmer.prototype = {
var first = this.first, suiteName = this.suiteName, self = this;
this.first = false;
var bench = new Benchmark(function() {
fn();
}, {
var bench = new Benchmark(fn, {
name: this.suiteName + ": " + name,
onComplete: function() {
if(first) { self.startLine(suiteName); }
@@ -79,7 +59,7 @@ BenchWarmer.prototype = {
var horSize = 0;
this.startLine("ops/msec");
horSize = horSize + "ops/msec ".length;
horSize = horSize + this.benchSize;
for(i=0, l=names.length; i<l; i++) {
print(names[i] + new Array(this.benchSize - names[i].length + 1).join(" "));
horSize = horSize + this.benchSize;
@@ -93,13 +73,22 @@ BenchWarmer.prototype = {
Benchmark.invoke(this.benchmarks, {
name: "run",
onComplete: function() {
self.startLine('');
var errors = false, prop, bench;
for(prop in self.errors) { if(self.errors.hasOwnProperty(prop)) { errors = true; break; } }
for(prop in self.errors) {
if (self.errors.hasOwnProperty(prop)
&& self.errors[prop].error.message !== 'EWOT') {
errors = true;
break;
}
}
if(errors) {
print("\n\nErrors:\n");
for(prop in self.errors) {
if(self.errors.hasOwnProperty(prop)) {
if (self.errors.hasOwnProperty(prop)
&& self.errors[prop].error.message !== 'EWOT') {
bench = self.errors[prop];
print("\n" + bench.name + ":\n");
print(bench.error.message);
@@ -124,7 +113,7 @@ BenchWarmer.prototype = {
print(winners.join(", "));
print("\n");
var padding = this.nameSize - name.length + 1;
var padding = Math.max(this.benchSize - name.length + 1, 0);
name = name + new Array(padding).join(" ");
print(name);
},
@@ -137,7 +126,11 @@ BenchWarmer.prototype = {
out = Math.round(count / 1000) + " ±" + Math.round(moe / 1000) + " (" + bench.cycles + ")";
} else {
out = "E";
if (bench.error.message === 'EWOT') {
out = 'NA';
} else {
out = 'E';
}
}
var padding = this.benchSize - out.length + 1;
+31 -19
View File
@@ -4,7 +4,7 @@ Handlebars = require("../lib/handlebars");
var dust, Mustache, eco;
try {
dust = require("dust");
dust = require("dustjs-linkedin");
} catch (err) { /* NOP */ }
try {
@@ -15,7 +15,7 @@ try {
var ecoExports = require("eco");
eco = function(str) {
return ecoExports(str);
}
};
} catch (err) { /* NOP */ }
var benchDetails = {
@@ -100,31 +100,36 @@ var benchDetails = {
};
handlebarsTemplates = {};
ecoTemplates = {};
var handlebarsTemplates = {},
ecoTemplates = {};
var warmer = new BenchWarmer();
var makeSuite = function(name) {
function makeSuite(name) {
warmer.suite(name, function(bench) {
var templateName = name;
var details = benchDetails[templateName];
var mustachePartials = details.partials && details.partials.mustache;
var mustacheSource = details.mustache;
var context = details.context;
var options = {helpers: details.helpers};
var error = function() { throw new Error("EWOT"); };
if (dust) {
bench("dust", function() {
dust.render(templateName, context, function(err, out) { });
});
}
bench("handlebars", function() {
handlebarsTemplates[templateName](context);
handlebarsTemplates[templateName](context, options);
});
if (dust) {
if (details.dust) {
bench("dust", function() {
dust.render(templateName, context, function(err, out) { });
});
} else {
bench('dust', error);
}
}
if (eco) {
if(ecoTemplates[templateName]) {
bench("eco", function() {
@@ -135,21 +140,28 @@ var makeSuite = function(name) {
}
}
if (Mustache && mustacheSource) {
bench("mustache", function() {
Mustache.to_html(mustacheSource, context, mustachePartials);
});
} else {
bench("mustache", error);
if (Mustache) {
if (mustacheSource) {
bench("mustache", function() {
Mustache.to_html(mustacheSource, context, mustachePartials);
});
} else {
bench("mustache", error);
}
}
});
}
for(var name in benchDetails) {
if(benchDetails.hasOwnProperty(name)) {
if (dust) {
if (!benchDetails[name].handlebars) {
continue;
}
if (dust && benchDetails[name].dust) {
dust.loadSource(dust.compile(benchDetails[name].dust, name));
}
handlebarsTemplates[name] = Handlebars.compile(benchDetails[name].handlebars);
if (eco && benchDetails[name].eco) {
+59 -33
View File
@@ -45,9 +45,24 @@ Handlebars.helpers = {};
Handlebars.partials = {};
var toString = Object.prototype.toString,
functionType = '[object Function]',
objectType = '[object Object]';
// Sourced from lodash
// https://github.com/bestiejs/lodash/blob/master/LICENSE.txt
function isFunction(value) {
return typeof value === 'function';
}
// fallback for older versions of Chrome and Safari
if (isFunction(/x/)) {
isFunction = function(value) {
return typeof value === 'function' && toString.call(value) === '[object Function]';
};
}
function isArray(value) {
return (value && typeof value === 'object') ? toString.call(value) === '[object Array]' : false;
};
Handlebars.registerHelper = function(name, fn, inverse) {
if (toString.call(name) === objectType) {
if (inverse || fn) { throw new Handlebars.Exception('Arg not supported with multiple helpers'); }
@@ -77,15 +92,13 @@ Handlebars.registerHelper('helperMissing', function(arg) {
Handlebars.registerHelper('blockHelperMissing', function(context, options) {
var inverse = options.inverse || function() {}, fn = options.fn;
var type = toString.call(context);
if(type === functionType) { context = context.call(this); }
if (isFunction(context)) { context = context.call(this); }
if(context === true) {
return fn(this);
} else if(context === false || context == null) {
return inverse(this);
} else if(type === "[object Array]") {
} else if (isArray(context)) {
if(context.length > 0) {
return Handlebars.helpers.each(context, options);
} else {
@@ -96,8 +109,6 @@ Handlebars.registerHelper('blockHelperMissing', function(context, options) {
}
});
Handlebars.K = function() {};
Handlebars.createFrame = function(object) {
var obj = {};
Handlebars.Utils.extend(obj, object);
@@ -126,15 +137,14 @@ Handlebars.registerHelper('each', function(context, options) {
var fn = options.fn, inverse = options.inverse;
var i = 0, ret = "", data;
var type = toString.call(context);
if(type === functionType) { context = context.call(this); }
if (isFunction(context)) { context = context.call(this); }
if (options.data) {
data = Handlebars.createFrame(options.data);
}
if(context && typeof context === 'object') {
if(context instanceof Array){
if (isArray(context)) {
for(var j = context.length; i<j; i++) {
if (data) { data.index = i; }
ret = ret + fn(context[i], { data: data });
@@ -158,8 +168,7 @@ Handlebars.registerHelper('each', function(context, options) {
});
Handlebars.registerHelper('if', function(conditional, options) {
var type = toString.call(conditional);
if(type === functionType) { conditional = conditional.call(this); }
if (isFunction(conditional)) { conditional = conditional.call(this); }
if(Handlebars.Utils.isEmpty(conditional)) {
return options.inverse(this);
@@ -173,8 +182,7 @@ Handlebars.registerHelper('unless', function(conditional, options) {
});
Handlebars.registerHelper('with', function(context, options) {
var type = toString.call(context);
if(type === functionType) { context = context.call(this); }
if (isFunction(context)) { context = context.call(this); }
if (!Handlebars.Utils.isEmpty(context)) return options.fn(context);
});
@@ -848,7 +856,7 @@ Handlebars.Utils = {
// don't escape SafeStrings, since they're already safe
if (string instanceof Handlebars.SafeString) {
return string.toString();
} else if (string == null || string === false) {
} else if (!string && string !== 0) {
return "";
}
@@ -864,7 +872,7 @@ Handlebars.Utils = {
isEmpty: function(value) {
if (!value && value !== 0) {
return true;
} else if(toString.call(value) === "[object Array]" && value.length === 0) {
} else if (isArray(value) && value.length === 0) {
return true;
} else {
return false;
@@ -2171,6 +2179,24 @@ JavaScriptCompiler.isValidJavaScriptVariableName = function(name) {
;
// lib/handlebars/runtime.js
function checkRevision(compilerInfo) {
var compilerRevision = compilerInfo && compilerInfo[0] || 1,
currentRevision = Handlebars.COMPILER_REVISION;
if (compilerRevision !== currentRevision) {
if (compilerRevision < currentRevision) {
var runtimeVersions = Handlebars.REVISION_CHANGES[currentRevision],
compilerVersions = Handlebars.REVISION_CHANGES[compilerRevision];
throw "Template was precompiled with an older version of Handlebars than the current runtime. "+
"Please update your precompiler to a newer version ("+runtimeVersions+") or downgrade your runtime to an older version ("+compilerVersions+").";
} else {
// Use the embedded version info since the runtime doesn't know about this revision yet
throw "Template was precompiled with a newer version of Handlebars than the current runtime. "+
"Please update your runtime to a newer version ("+compilerInfo[1]+").";
}
}
}
Handlebars.VM = {
template: function(templateSpec) {
// Just add water
@@ -2190,7 +2216,7 @@ Handlebars.VM = {
merge: function(param, common) {
var ret = param || common;
if (param && common) {
if (param && common && (param !== common)) {
ret = {};
Handlebars.Utils.extend(ret, common);
Handlebars.Utils.extend(ret, param);
@@ -2204,23 +2230,23 @@ Handlebars.VM = {
return function(context, options) {
options = options || {};
var result = templateSpec.call(container, Handlebars, context, options.helpers, options.partials, options.data);
var namespace = options.partial ? options : Handlebars,
helpers,
partials;
var compilerInfo = container.compilerInfo || [],
compilerRevision = compilerInfo[0] || 1,
currentRevision = Handlebars.COMPILER_REVISION;
if (!options.partial) {
helpers = options.helpers;
partials = options.partials;
}
var result = templateSpec.call(
container,
namespace, context,
helpers,
partials,
options.data);
if (compilerRevision !== currentRevision) {
if (compilerRevision < currentRevision) {
var runtimeVersions = Handlebars.REVISION_CHANGES[currentRevision],
compilerVersions = Handlebars.REVISION_CHANGES[compilerRevision];
throw "Template was precompiled with an older version of Handlebars than the current runtime. "+
"Please update your precompiler to a newer version ("+runtimeVersions+") or downgrade your runtime to an older version ("+compilerVersions+").";
} else {
// Use the embedded version info since the runtime doesn't know about this revision yet
throw "Template was precompiled with a newer version of Handlebars than the current runtime. "+
"Please update your runtime to a newer version ("+compilerInfo[1]+").";
}
if (!options.partial) {
checkRevision(container.compilerInfo);
}
return result;
@@ -2251,7 +2277,7 @@ Handlebars.VM = {
},
noop: function() { return ""; },
invokePartial: function(partial, name, context, helpers, partials, data) {
var options = { helpers: helpers, partials: partials, data: data };
var options = { partial: true, helpers: helpers, partials: partials, data: data };
if(partial === undefined) {
throw new Handlebars.Exception("The partial " + name + " could not be found");
+59 -33
View File
@@ -45,9 +45,24 @@ Handlebars.helpers = {};
Handlebars.partials = {};
var toString = Object.prototype.toString,
functionType = '[object Function]',
objectType = '[object Object]';
// Sourced from lodash
// https://github.com/bestiejs/lodash/blob/master/LICENSE.txt
function isFunction(value) {
return typeof value === 'function';
}
// fallback for older versions of Chrome and Safari
if (isFunction(/x/)) {
isFunction = function(value) {
return typeof value === 'function' && toString.call(value) === '[object Function]';
};
}
function isArray(value) {
return (value && typeof value === 'object') ? toString.call(value) === '[object Array]' : false;
};
Handlebars.registerHelper = function(name, fn, inverse) {
if (toString.call(name) === objectType) {
if (inverse || fn) { throw new Handlebars.Exception('Arg not supported with multiple helpers'); }
@@ -77,15 +92,13 @@ Handlebars.registerHelper('helperMissing', function(arg) {
Handlebars.registerHelper('blockHelperMissing', function(context, options) {
var inverse = options.inverse || function() {}, fn = options.fn;
var type = toString.call(context);
if(type === functionType) { context = context.call(this); }
if (isFunction(context)) { context = context.call(this); }
if(context === true) {
return fn(this);
} else if(context === false || context == null) {
return inverse(this);
} else if(type === "[object Array]") {
} else if (isArray(context)) {
if(context.length > 0) {
return Handlebars.helpers.each(context, options);
} else {
@@ -96,8 +109,6 @@ Handlebars.registerHelper('blockHelperMissing', function(context, options) {
}
});
Handlebars.K = function() {};
Handlebars.createFrame = function(object) {
var obj = {};
Handlebars.Utils.extend(obj, object);
@@ -126,15 +137,14 @@ Handlebars.registerHelper('each', function(context, options) {
var fn = options.fn, inverse = options.inverse;
var i = 0, ret = "", data;
var type = toString.call(context);
if(type === functionType) { context = context.call(this); }
if (isFunction(context)) { context = context.call(this); }
if (options.data) {
data = Handlebars.createFrame(options.data);
}
if(context && typeof context === 'object') {
if(context instanceof Array){
if (isArray(context)) {
for(var j = context.length; i<j; i++) {
if (data) { data.index = i; }
ret = ret + fn(context[i], { data: data });
@@ -158,8 +168,7 @@ Handlebars.registerHelper('each', function(context, options) {
});
Handlebars.registerHelper('if', function(conditional, options) {
var type = toString.call(conditional);
if(type === functionType) { conditional = conditional.call(this); }
if (isFunction(conditional)) { conditional = conditional.call(this); }
if(Handlebars.Utils.isEmpty(conditional)) {
return options.inverse(this);
@@ -173,8 +182,7 @@ Handlebars.registerHelper('unless', function(conditional, options) {
});
Handlebars.registerHelper('with', function(context, options) {
var type = toString.call(context);
if(type === functionType) { context = context.call(this); }
if (isFunction(context)) { context = context.call(this); }
if (!Handlebars.Utils.isEmpty(context)) return options.fn(context);
});
@@ -237,7 +245,7 @@ Handlebars.Utils = {
// don't escape SafeStrings, since they're already safe
if (string instanceof Handlebars.SafeString) {
return string.toString();
} else if (string == null || string === false) {
} else if (!string && string !== 0) {
return "";
}
@@ -253,7 +261,7 @@ Handlebars.Utils = {
isEmpty: function(value) {
if (!value && value !== 0) {
return true;
} else if(toString.call(value) === "[object Array]" && value.length === 0) {
} else if (isArray(value) && value.length === 0) {
return true;
} else {
return false;
@@ -263,6 +271,24 @@ Handlebars.Utils = {
;
// lib/handlebars/runtime.js
function checkRevision(compilerInfo) {
var compilerRevision = compilerInfo && compilerInfo[0] || 1,
currentRevision = Handlebars.COMPILER_REVISION;
if (compilerRevision !== currentRevision) {
if (compilerRevision < currentRevision) {
var runtimeVersions = Handlebars.REVISION_CHANGES[currentRevision],
compilerVersions = Handlebars.REVISION_CHANGES[compilerRevision];
throw "Template was precompiled with an older version of Handlebars than the current runtime. "+
"Please update your precompiler to a newer version ("+runtimeVersions+") or downgrade your runtime to an older version ("+compilerVersions+").";
} else {
// Use the embedded version info since the runtime doesn't know about this revision yet
throw "Template was precompiled with a newer version of Handlebars than the current runtime. "+
"Please update your runtime to a newer version ("+compilerInfo[1]+").";
}
}
}
Handlebars.VM = {
template: function(templateSpec) {
// Just add water
@@ -282,7 +308,7 @@ Handlebars.VM = {
merge: function(param, common) {
var ret = param || common;
if (param && common) {
if (param && common && (param !== common)) {
ret = {};
Handlebars.Utils.extend(ret, common);
Handlebars.Utils.extend(ret, param);
@@ -296,23 +322,23 @@ Handlebars.VM = {
return function(context, options) {
options = options || {};
var result = templateSpec.call(container, Handlebars, context, options.helpers, options.partials, options.data);
var namespace = options.partial ? options : Handlebars,
helpers,
partials;
var compilerInfo = container.compilerInfo || [],
compilerRevision = compilerInfo[0] || 1,
currentRevision = Handlebars.COMPILER_REVISION;
if (!options.partial) {
helpers = options.helpers;
partials = options.partials;
}
var result = templateSpec.call(
container,
namespace, context,
helpers,
partials,
options.data);
if (compilerRevision !== currentRevision) {
if (compilerRevision < currentRevision) {
var runtimeVersions = Handlebars.REVISION_CHANGES[currentRevision],
compilerVersions = Handlebars.REVISION_CHANGES[compilerRevision];
throw "Template was precompiled with an older version of Handlebars than the current runtime. "+
"Please update your precompiler to a newer version ("+runtimeVersions+") or downgrade your runtime to an older version ("+compilerVersions+").";
} else {
// Use the embedded version info since the runtime doesn't know about this revision yet
throw "Template was precompiled with a newer version of Handlebars than the current runtime. "+
"Please update your runtime to a newer version ("+compilerInfo[1]+").";
}
if (!options.partial) {
checkRevision(container.compilerInfo);
}
return result;
@@ -343,7 +369,7 @@ Handlebars.VM = {
},
noop: function() { return ""; },
invokePartial: function(partial, name, context, helpers, partials, data) {
var options = { helpers: helpers, partials: partials, data: data };
var options = { partial: true, helpers: helpers, partials: partials, data: data };
if(partial === undefined) {
throw new Handlebars.Exception("The partial " + name + " could not be found");
+22 -14
View File
@@ -20,9 +20,24 @@ Handlebars.helpers = {};
Handlebars.partials = {};
var toString = Object.prototype.toString,
functionType = '[object Function]',
objectType = '[object Object]';
// Sourced from lodash
// https://github.com/bestiejs/lodash/blob/master/LICENSE.txt
function isFunction(value) {
return typeof value === 'function';
}
// fallback for older versions of Chrome and Safari
if (isFunction(/x/)) {
isFunction = function(value) {
return typeof value === 'function' && toString.call(value) === '[object Function]';
};
}
function isArray(value) {
return (value && typeof value === 'object') ? toString.call(value) === '[object Array]' : false;
};
Handlebars.registerHelper = function(name, fn, inverse) {
if (toString.call(name) === objectType) {
if (inverse || fn) { throw new Handlebars.Exception('Arg not supported with multiple helpers'); }
@@ -52,15 +67,13 @@ Handlebars.registerHelper('helperMissing', function(arg) {
Handlebars.registerHelper('blockHelperMissing', function(context, options) {
var inverse = options.inverse || function() {}, fn = options.fn;
var type = toString.call(context);
if(type === functionType) { context = context.call(this); }
if (isFunction(context)) { context = context.call(this); }
if(context === true) {
return fn(this);
} else if(context === false || context == null) {
return inverse(this);
} else if(type === "[object Array]") {
} else if (isArray(context)) {
if(context.length > 0) {
return Handlebars.helpers.each(context, options);
} else {
@@ -71,8 +84,6 @@ Handlebars.registerHelper('blockHelperMissing', function(context, options) {
}
});
Handlebars.K = function() {};
Handlebars.createFrame = function(object) {
var obj = {};
Handlebars.Utils.extend(obj, object);
@@ -101,15 +112,14 @@ Handlebars.registerHelper('each', function(context, options) {
var fn = options.fn, inverse = options.inverse;
var i = 0, ret = "", data;
var type = toString.call(context);
if(type === functionType) { context = context.call(this); }
if (isFunction(context)) { context = context.call(this); }
if (options.data) {
data = Handlebars.createFrame(options.data);
}
if(context && typeof context === 'object') {
if(context instanceof Array){
if (isArray(context)) {
for(var j = context.length; i<j; i++) {
if (data) { data.index = i; }
ret = ret + fn(context[i], { data: data });
@@ -133,8 +143,7 @@ Handlebars.registerHelper('each', function(context, options) {
});
Handlebars.registerHelper('if', function(conditional, options) {
var type = toString.call(conditional);
if(type === functionType) { conditional = conditional.call(this); }
if (isFunction(conditional)) { conditional = conditional.call(this); }
if(Handlebars.Utils.isEmpty(conditional)) {
return options.inverse(this);
@@ -148,8 +157,7 @@ Handlebars.registerHelper('unless', function(conditional, options) {
});
Handlebars.registerHelper('with', function(context, options) {
var type = toString.call(context);
if(type === functionType) { context = context.call(this); }
if (isFunction(context)) { context = context.call(this); }
if (!Handlebars.Utils.isEmpty(context)) return options.fn(context);
});
+35 -17
View File
@@ -2,6 +2,24 @@ exports.attach = function(Handlebars) {
// BEGIN(BROWSER)
function checkRevision(compilerInfo) {
var compilerRevision = compilerInfo && compilerInfo[0] || 1,
currentRevision = Handlebars.COMPILER_REVISION;
if (compilerRevision !== currentRevision) {
if (compilerRevision < currentRevision) {
var runtimeVersions = Handlebars.REVISION_CHANGES[currentRevision],
compilerVersions = Handlebars.REVISION_CHANGES[compilerRevision];
throw "Template was precompiled with an older version of Handlebars than the current runtime. "+
"Please update your precompiler to a newer version ("+runtimeVersions+") or downgrade your runtime to an older version ("+compilerVersions+").";
} else {
// Use the embedded version info since the runtime doesn't know about this revision yet
throw "Template was precompiled with a newer version of Handlebars than the current runtime. "+
"Please update your runtime to a newer version ("+compilerInfo[1]+").";
}
}
}
Handlebars.VM = {
template: function(templateSpec) {
// Just add water
@@ -21,7 +39,7 @@ Handlebars.VM = {
merge: function(param, common) {
var ret = param || common;
if (param && common) {
if (param && common && (param !== common)) {
ret = {};
Handlebars.Utils.extend(ret, common);
Handlebars.Utils.extend(ret, param);
@@ -35,23 +53,23 @@ Handlebars.VM = {
return function(context, options) {
options = options || {};
var result = templateSpec.call(container, Handlebars, context, options.helpers, options.partials, options.data);
var namespace = options.partial ? options : Handlebars,
helpers,
partials;
var compilerInfo = container.compilerInfo || [],
compilerRevision = compilerInfo[0] || 1,
currentRevision = Handlebars.COMPILER_REVISION;
if (!options.partial) {
helpers = options.helpers;
partials = options.partials;
}
var result = templateSpec.call(
container,
namespace, context,
helpers,
partials,
options.data);
if (compilerRevision !== currentRevision) {
if (compilerRevision < currentRevision) {
var runtimeVersions = Handlebars.REVISION_CHANGES[currentRevision],
compilerVersions = Handlebars.REVISION_CHANGES[compilerRevision];
throw "Template was precompiled with an older version of Handlebars than the current runtime. "+
"Please update your precompiler to a newer version ("+runtimeVersions+") or downgrade your runtime to an older version ("+compilerVersions+").";
} else {
// Use the embedded version info since the runtime doesn't know about this revision yet
throw "Template was precompiled with a newer version of Handlebars than the current runtime. "+
"Please update your runtime to a newer version ("+compilerInfo[1]+").";
}
if (!options.partial) {
checkRevision(container.compilerInfo);
}
return result;
@@ -82,7 +100,7 @@ Handlebars.VM = {
},
noop: function() { return ""; },
invokePartial: function(partial, name, context, helpers, partials, data) {
var options = { helpers: helpers, partials: partials, data: data };
var options = { partial: true, helpers: helpers, partials: partials, data: data };
if(partial === undefined) {
throw new Handlebars.Exception("The partial " + name + " could not be found");
+4 -3
View File
@@ -1,6 +1,7 @@
exports.attach = function(Handlebars) {
var toString = Object.prototype.toString;
var toString = Object.prototype.toString,
isArray = Array.isArray;
// BEGIN(BROWSER)
@@ -55,7 +56,7 @@ Handlebars.Utils = {
// don't escape SafeStrings, since they're already safe
if (string instanceof Handlebars.SafeString) {
return string.toString();
} else if (string == null || string === false) {
} else if (!string && string !== 0) {
return "";
}
@@ -71,7 +72,7 @@ Handlebars.Utils = {
isEmpty: function(value) {
if (!value && value !== 0) {
return true;
} else if(toString.call(value) === "[object Array]" && value.length === 0) {
} else if (isArray(value) && value.length === 0) {
return true;
} else {
return false;
+2 -1
View File
@@ -23,7 +23,8 @@
"devDependencies": {
"async": "~0.2.9",
"benchmark": "~1.0",
"dust": "~0.3",
"dustjs-linkedin": "~2.0.2",
"eco": "~1.1.0-rc-3",
"grunt": "~0.4.1",
"grunt-contrib-concat": "~0.3.0",
"grunt-contrib-jshint": "~0.6.3",