mirror of
https://github.com/harttle/liquidjs.git
synced 2026-09-16 04:40:39 -07:00
fix: for throws undefined var with a null value with strictVariables
This commit is contained in:
@@ -2,7 +2,7 @@ import { Drop } from '../drop/drop'
|
|||||||
import { __assign } from 'tslib'
|
import { __assign } from 'tslib'
|
||||||
import { NormalizedFullOptions, defaultOptions, RenderOptions } from '../liquid-options'
|
import { NormalizedFullOptions, defaultOptions, RenderOptions } from '../liquid-options'
|
||||||
import { Scope } from './scope'
|
import { Scope } from './scope'
|
||||||
import { isArray, isNil, isString, isFunction, toLiquid, InternalUndefinedVariableError, toValueSync } from '../util'
|
import { isArray, isNil, isUndefined, isString, isFunction, toLiquid, InternalUndefinedVariableError, toValueSync } from '../util'
|
||||||
|
|
||||||
type PropertyKey = string | number;
|
type PropertyKey = string | number;
|
||||||
|
|
||||||
@@ -80,7 +80,7 @@ export class Context {
|
|||||||
if (isString(paths)) paths = paths.split('.')
|
if (isString(paths)) paths = paths.split('.')
|
||||||
for (let i = 0; i < paths.length; i++) {
|
for (let i = 0; i < paths.length; i++) {
|
||||||
scope = yield readProperty(scope as object, paths[i], this.ownPropertyOnly)
|
scope = yield readProperty(scope as object, paths[i], this.ownPropertyOnly)
|
||||||
if (isNil(scope) && this.strictVariables) {
|
if (this.strictVariables && isUndefined(scope)) {
|
||||||
throw new InternalUndefinedVariableError((paths as string[]).slice(0, i + 1).join!('.'))
|
throw new InternalUndefinedVariableError((paths as string[]).slice(0, i + 1).join!('.'))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -63,6 +63,10 @@ export function isNil (value: any): boolean {
|
|||||||
return value == null
|
return value == null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function isUndefined (value: any): boolean {
|
||||||
|
return value === undefined
|
||||||
|
}
|
||||||
|
|
||||||
export function isArray (value: any): value is any[] {
|
export function isArray (value: any): value is any[] {
|
||||||
// be compatible with IE 8
|
// be compatible with IE 8
|
||||||
return toString.call(value) === '[object Array]'
|
return toString.call(value) === '[object Array]'
|
||||||
|
|||||||
@@ -59,6 +59,12 @@ describe('tags/for', function () {
|
|||||||
const html = await liquid.parseAndRender(src, scope)
|
const html = await liquid.parseAndRender(src, scope)
|
||||||
return expect(html).toBe('str-"string"-string')
|
return expect(html).toBe('str-"string"-string')
|
||||||
})
|
})
|
||||||
|
it('should not report undefined variable on null value', async function () {
|
||||||
|
const engine = new Liquid({ strictVariables: true })
|
||||||
|
const src = '{% assign hello = "hello,world" | split: "," | concat: null %}{% for i in hello %}{{ i }},{% endfor %}'
|
||||||
|
const html = await engine.parseAndRender(src, scope)
|
||||||
|
return expect(html).toBe('hello,world,,')
|
||||||
|
})
|
||||||
describe('illegal', function () {
|
describe('illegal', function () {
|
||||||
it('should reject when for not closed', function () {
|
it('should reject when for not closed', function () {
|
||||||
const src = '{%for c in alpha%}{{c}}'
|
const src = '{%for c in alpha%}{{c}}'
|
||||||
|
|||||||
Reference in New Issue
Block a user