From 05223c4378f9474f4e658af36cb8272e161d681f Mon Sep 17 00:00:00 2001 From: Jun Yang Date: Thu, 21 Mar 2024 23:56:10 +0800 Subject: [PATCH] fix: contains regression (#677) * fix: `contains` regression on string-like objects, #675 * chore: fix build docs on macos --- bin/build-changelog.sh | 15 +++------------ src/render/operator.ts | 4 ++-- test/e2e/issues.spec.ts | 14 ++++++++++++++ 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/bin/build-changelog.sh b/bin/build-changelog.sh index 32e8dddeff..b0777c25da 100755 --- a/bin/build-changelog.sh +++ b/bin/build-changelog.sh @@ -1,17 +1,8 @@ #!/usr/bin/env bash -# Run `sed` in a way that's compatible with both macOS (BSD) and Linux (GNU) -sedi() { - if [[ "$OSTYPE" == "darwin"* ]]; then - sed -i '' "$@" - else - sed -i "$@" - fi -} - cd docs cp ../CHANGELOG.md source/tutorials/changelog.md -sedi \ +sed -i \ -e 's/{%/{% raw %}{%{% endraw %}/g' \ -e 's/{{/{% raw %}{{{% endraw %}/g' \ -e '1 s/"/\"/g' \ @@ -20,7 +11,7 @@ sedi \ source/tutorials/changelog.md cp source/tutorials/changelog.md source/zh-cn/tutorials/changelog.md -sedi -e '1i\ +sed -i -e '1i\ ---\ntitle: Changelog\nauto: true\n---\n' source/tutorials/changelog.md -sedi -e '1i\ +sed -i -e '1i\ ---\ntitle: 更新日志\nauto: true\n---\n' source/zh-cn/tutorials/changelog.md diff --git a/src/render/operator.ts b/src/render/operator.ts index 77ea07c108..d711a0d5d8 100644 --- a/src/render/operator.ts +++ b/src/render/operator.ts @@ -2,7 +2,7 @@ import { isComparable } from '../drop/comparable' import { Context } from '../context' import { toValue } from '../util' import { isFalsy, isTruthy } from '../render/boolean' -import { isArray, isString } from '../util/underscore' +import { isArray, isFunction } from '../util/underscore' export type UnaryOperatorHandler = (operand: any, ctx: Context) => boolean; export type BinaryOperatorHandler = (lhs: any, rhs: any, ctx: Context) => boolean; @@ -35,7 +35,7 @@ export const defaultOperators: Operators = { 'contains': (l: any, r: any) => { l = toValue(l) if (isArray(l)) return l.some((i) => equal(i, r)) - if (isString(l)) return l.indexOf(toValue(r)) > -1 + if (isFunction(l?.indexOf)) return l.indexOf(toValue(r)) > -1 return false }, 'not': (v: any, ctx: Context) => isFalsy(toValue(v), ctx), diff --git a/test/e2e/issues.spec.ts b/test/e2e/issues.spec.ts index a73257c999..60437823bf 100644 --- a/test/e2e/issues.spec.ts +++ b/test/e2e/issues.spec.ts @@ -485,4 +485,18 @@ describe('Issues', function () { '{% endif %}', {}) expect(result).toEqual('show') }) + it('#675 10.10.1 Operator: contains regression', () => { + const engine = new Liquid() + class StrictStringForLiquid { + constructor (private value: string) {} + indexOf (other: unknown) { + return this.value.indexOf(String(other)) + } + } + const result = engine.parseAndRenderSync('{{ str contains sub }}', { + str: new StrictStringForLiquid('string'), + sub: 'str' + }) + expect(result).toEqual('true') + }) })