19bdace85a
Extracts the parser to `@handlebars/parser`, where it can be shared between different implementations. This means that e.g. Glimmer/Ember will be able to iterate on new features without forcing Handlebars to adopt them immediately, and vice versa. All implementors will be able to absorb changes as it makes sense for them.
34 lines
1.2 KiB
JavaScript
34 lines
1.2 KiB
JavaScript
import { Exception } from '@handlebars/parser';
|
|
import { isEmpty, isFunction } from '../utils';
|
|
|
|
export default function(instance) {
|
|
instance.registerHelper('if', function(conditional, options) {
|
|
if (arguments.length != 2) {
|
|
throw new Exception('#if requires exactly one argument');
|
|
}
|
|
if (isFunction(conditional)) {
|
|
conditional = conditional.call(this);
|
|
}
|
|
|
|
// Default behavior is to render the positive path if the value is truthy and not empty.
|
|
// The `includeZero` option may be set to treat the condtional as purely not empty based on the
|
|
// behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative.
|
|
if ((!options.hash.includeZero && !conditional) || isEmpty(conditional)) {
|
|
return options.inverse(this);
|
|
} else {
|
|
return options.fn(this);
|
|
}
|
|
});
|
|
|
|
instance.registerHelper('unless', function(conditional, options) {
|
|
if (arguments.length != 2) {
|
|
throw new Exception('#unless requires exactly one argument');
|
|
}
|
|
return instance.helpers['if'].call(this, conditional, {
|
|
fn: options.inverse,
|
|
inverse: options.fn,
|
|
hash: options.hash
|
|
});
|
|
});
|
|
}
|