diff --git a/src/filters/array.ts b/src/filters/array.ts index 36b50eced..cf967f284 100644 --- a/src/filters/array.ts +++ b/src/filters/array.ts @@ -140,7 +140,9 @@ export function * where_exp (this: FilterImpl, arr: T[], itemN const array = toArray(arr) this.context.memoryLimit.use(array.length) for (const item of array) { - const value = yield keyTemplate.value(this.context.spawn({ [itemName]: item })) + this.context.push({ [itemName]: item }) + const value = yield keyTemplate.value(this.context) + this.context.pop() if (value) filtered.push(item) } return filtered @@ -165,7 +167,9 @@ export function * group_by_exp (this: FilterImpl, arr: T[], it arr = toEnumerable(arr) this.context.memoryLimit.use(arr.length) for (const item of arr) { - const key = yield keyTemplate.value(this.context.spawn({ [itemName]: item })) + this.context.push({ [itemName]: item }) + const key = yield keyTemplate.value(this.context) + this.context.pop() if (!map.has(key)) map.set(key, []) map.get(key).push(item) } @@ -185,7 +189,9 @@ export function * find_exp (this: FilterImpl, arr: T[], itemNa const predicate = new Value(stringify(exp), this.liquid) const array = toArray(arr) for (const item of array) { - const value = yield predicate.value(this.context.spawn({ [itemName]: item })) + this.context.push({ [itemName]: item }) + const value = yield predicate.value(this.context) + this.context.pop() if (value) return item } } diff --git a/test/integration/filters/array.spec.ts b/test/integration/filters/array.spec.ts index ede56efe1..5c7768053 100644 --- a/test/integration/filters/array.spec.ts +++ b/test/integration/filters/array.spec.ts @@ -522,6 +522,20 @@ describe('filters/array', function () { - Garlic press `) }) + it('should be aware context', function () { + const tpl = `{% assign kitchen_products = products | where_exp: "item", "item.type == target" %} + Kitchen products: + {% for product in kitchen_products -%} + - {{ product.title }} + {% endfor %}` + const scope = { products, target: 'kitchen' } + const html = ` + Kitchen products: + - Spatula + - Garlic press + ` + return test(tpl, scope, html) + }) }) describe('group_by', function () { const members = [