diff --git a/src/stores/contextKeyStore.ts b/src/stores/contextKeyStore.ts index 9da1de800..6ea13b2e3 100644 --- a/src/stores/contextKeyStore.ts +++ b/src/stores/contextKeyStore.ts @@ -10,14 +10,19 @@ import { reactive } from 'vue' */ function tokenize(expr: string): { t: string }[] { const tokens: { t: string }[] = [] + let pos = 0 const re = /\s*("(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|==|!=|&&|\|\||[A-Za-z0-9_.]+|!|\(|\))\s*/g let m: RegExpExecArray | null while ((m = re.exec(expr))) { + if (m.index !== pos) { + throw new Error(`Invalid character in expression at pos ${pos}`) + } tokens.push({ t: m[1] }) + pos = re.lastIndex } - if (re.lastIndex !== expr.length) { - throw new Error(`Invalid character in expression at pos ${re.lastIndex}`) + if (pos !== expr.length) { + throw new Error(`Invalid character in expression at pos ${pos}`) } return tokens } diff --git a/tests-ui/tests/store/contextKeyStore.spec.ts b/tests-ui/tests/store/contextKeyStore.spec.ts index 1a01e73f5..5f0da3918 100644 --- a/tests-ui/tests/store/contextKeyStore.spec.ts +++ b/tests-ui/tests/store/contextKeyStore.spec.ts @@ -11,6 +11,13 @@ describe('evalAst via evaluateCondition', () => { store = useContextKeyStore() }) + it('evaluates logical OR correctly', () => { + store.setContextKey('a', true) + store.setContextKey('b', false) + const result = store.evaluateCondition('a || b') + expect(result).toBe(true) + }) + it('evaluates logical AND and NOT correctly', () => { store.setContextKey('a', true) store.setContextKey('b', false)