diff --git a/src/template/filter/filter.ts b/src/template/filter/filter.ts index fd4de521b..81c39f796 100644 --- a/src/template/filter/filter.ts +++ b/src/template/filter/filter.ts @@ -20,6 +20,6 @@ export class Filter { if (isKeyValuePair(arg)) argv.push([arg[0], yield evalToken(arg[1], context)]) else argv.push(yield evalToken(arg, context)) } - return this.impl.apply({ context }, [value, ...argv]) + return yield this.impl.apply({ context }, [value, ...argv]) } } diff --git a/test/e2e/parse-and-render.ts b/test/e2e/parse-and-render.ts index a5da170da..6a0ba9114 100644 --- a/test/e2e/parse-and-render.ts +++ b/test/e2e/parse-and-render.ts @@ -45,13 +45,13 @@ describe('.parseAndRender()', function () { const result2 = await engine.render(template, ctx) expect(result2).to.equal('1,2') }) - it('should render filters', async function () { + it('should support the "join" filter', async function () { var ctx = { names: ['alice', 'bob'] } var template = engine.parse('
{{names | join: ","}}
') const html = await engine.render(template, ctx) return expect(html).to.equal('alice,bob
') }) - it('should render accessive filters', async function () { + it('should support the "first" filter', async function () { var src = '{% assign my_array = "apples, oranges, peaches, plums" | split: ", " %}' + '{{ my_array | first }}' const html = await engine.parseAndRender(src) diff --git a/test/integration/liquid/register-filters.ts b/test/integration/liquid/register-filters.ts index 6b665603e..5d442df6c 100644 --- a/test/integration/liquid/register-filters.ts +++ b/test/integration/liquid/register-filters.ts @@ -4,21 +4,33 @@ import { Liquid } from '../../../src/liquid' describe('liquid#registerFilter()', function () { const liquid = new Liquid() - describe('object arguments', function () { + describe('key-value arguments', function () { liquid.registerFilter('obj_test', function (...args) { return JSON.stringify(args) }) - it('should support object', async () => { + it('should support key-value arguments', async () => { const src = `{{ "a" | obj_test: k1: "v1", k2: foo }}` const dst = '["a",["k1","v1"],["k2","bar"]]' const html = await liquid.parseAndRender(src, { foo: 'bar' }) return expect(html).to.equal(dst) }) - it('should support mixed object', async () => { + it('should support mixed arguments', async () => { const src = `{{ "a" | obj_test: "something", k1: "v1", k2: foo }}` const dst = '["a","something",["k1","v1"],["k2","bar"]]' const html = await liquid.parseAndRender(src, { foo: 'bar' }) return expect(html).to.equal(dst) }) }) + + describe('async filters', () => { + liquid.registerFilter('get_user_data', function (userId) { + return Promise.resolve({ userId, userName: userId.toUpperCase() }) + }) + it('should support async filter', async () => { + const src = `{{ userId | get_user_data | json }}` + const dst = '{"userId":"alice","userName":"ALICE"}' + const html = await liquid.parseAndRender(src, { userId: 'alice' }) + return expect(html).to.equal(dst) + }) + }) })