Skip to content

Commit

Permalink
fix: for throws undefined var with a null value with strictVariables
Browse files Browse the repository at this point in the history
  • Loading branch information
ebobby authored and harttle committed Aug 19, 2023
1 parent 803a090 commit dc6a301
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 2 deletions.
4 changes: 2 additions & 2 deletions src/context/context.ts
Expand Up @@ -2,7 +2,7 @@ import { Drop } from '../drop/drop'
import { __assign } from 'tslib'
import { NormalizedFullOptions, defaultOptions, RenderOptions } from '../liquid-options'
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;

Expand Down Expand Up @@ -80,7 +80,7 @@ export class Context {
if (isString(paths)) paths = paths.split('.')
for (let i = 0; i < paths.length; i++) {
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!('.'))
}
}
Expand Down
4 changes: 4 additions & 0 deletions src/util/underscore.ts
Expand Up @@ -63,6 +63,10 @@ export function isNil (value: any): boolean {
return value == null
}

export function isUndefined (value: any): boolean {
return value === undefined
}

export function isArray (value: any): value is any[] {
// be compatible with IE 8
return toString.call(value) === '[object Array]'
Expand Down
6 changes: 6 additions & 0 deletions test/integration/tags/for.spec.ts
Expand Up @@ -59,6 +59,12 @@ describe('tags/for', function () {
const html = await liquid.parseAndRender(src, scope)
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 () {
it('should reject when for not closed', function () {
const src = '{%for c in alpha%}{{c}}'
Expand Down

0 comments on commit dc6a301

Please sign in to comment.