diff --git a/src/render/boolean.spec.ts b/src/render/boolean.spec.ts index 8dde9b18d6..066e318a50 100644 --- a/src/render/boolean.spec.ts +++ b/src/render/boolean.spec.ts @@ -1,5 +1,6 @@ import { isTruthy, isFalsy } from './boolean' import { Context } from '../context' +import { Drop } from '..' describe('boolean Shopify', function () { describe('.isTruthy()', function () { @@ -8,7 +9,13 @@ describe('boolean Shopify', function () { jsTruthy: false } } as unknown as Context - // + + class BooleanDrop extends Drop { + public valueOf () { + return false + } + } + // Spec: https://shopify.github.io/liquid/basics/truthy-and-falsy/ it('true is truthy', function () { expect(isTruthy(true, ctx)).toBeTruthy() @@ -40,6 +47,9 @@ describe('boolean Shopify', function () { it('[] is truthy', function () { expect(isTruthy([], ctx)).toBeTruthy() }) + it('drop valueOf determines truthy', function () { + expect(isTruthy(new BooleanDrop(), ctx)).toBeFalsy() + }) }) }) diff --git a/src/render/boolean.ts b/src/render/boolean.ts index d91c8f7f18..1ad08c2e1e 100644 --- a/src/render/boolean.ts +++ b/src/render/boolean.ts @@ -1,10 +1,13 @@ import { Context } from '../context/context' +import { toValue } from '../util' export function isTruthy (val: any, ctx: Context): boolean { return !isFalsy(val, ctx) } export function isFalsy (val: any, ctx: Context): boolean { + val = toValue(val) + if (ctx.opts.jsTruthy) { return !val } else { diff --git a/test/integration/tags/if.spec.ts b/test/integration/tags/if.spec.ts index 2086b0360f..5dd25850c7 100644 --- a/test/integration/tags/if.spec.ts +++ b/test/integration/tags/if.spec.ts @@ -1,4 +1,4 @@ -import { Liquid } from '../../../src/liquid' +import { Liquid, Drop } from '../../../src' describe('tags/if', function () { const liquid = new Liquid() @@ -9,6 +9,12 @@ describe('tags/if', function () { emptyArray: [] } + class BooleanDrop extends Drop { + public valueOf () { + return false + } + } + it('should throw if not closed', function () { const src = '{% if false%}yes' return expect(liquid.parseAndRender(src, scope)) @@ -143,6 +149,12 @@ describe('tags/if', function () { const html = await liquid.parseAndRender(src, scope) return expect(html).toBe('success') }) + it('should support drop as condition variable', async () => { + const src = `{% if drop %}yes{% else %}no{% endif %}` + const scope = { drop: new BooleanDrop() } + const html = await liquid.parseAndRender(src, scope) + return expect(html).toBe('no') + }) it('should not render anything after an else branch even when first else branch is empty', () => { const engine = new Liquid() const result = engine.parseAndRenderSync('{% if false %}don\'t show' +