From a69f88e77580787a85019b081b5c2ec832ac05f6 Mon Sep 17 00:00:00 2001 From: Maciej Barelkowski Date: Mon, 29 Sep 2025 16:24:18 +0200 Subject: [PATCH] fix: always return variables context in `getResultContext` --- CHANGELOG.md | 4 + lib/zeebe/util/feelUtility.js | 2 +- .../zeebe/immediately-broken-expression.bpmn | 33 ++++++++ .../zeebe/long-broken-expression.bpmn | 6 +- test/spec/zeebe/ZeebeVariableResolver.spec.js | 76 ++++++++++++++----- 5 files changed, 96 insertions(+), 25 deletions(-) create mode 100644 test/fixtures/zeebe/immediately-broken-expression.bpmn diff --git a/CHANGELOG.md b/CHANGELOG.md index e23b748..8ecaaac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ All notable changes to [@bpmn-io/variable-resolver](https://github.com/bpmn-io/v ___Note:__ Yet to be released changes appear here._ +## 1.3.6 + +* `FIX`: always return an instance of variables context in `getResultContext` ([#58](https://github.com/bpmn-io/variable-resolver/pull/58)) + ## 1.3.5 * `FIX`: do not try to find unresolved variables of a broken expression ([#50](https://github.com/bpmn-io/variable-resolver/issues/50)) diff --git a/lib/zeebe/util/feelUtility.js b/lib/zeebe/util/feelUtility.js index b42ecc5..c647576 100644 --- a/lib/zeebe/util/feelUtility.js +++ b/lib/zeebe/util/feelUtility.js @@ -129,7 +129,7 @@ export function getResultContext(expression, variables = {}) { // This is a hack to get the latest variables from the context tracker // lezer does not automatically annotate the parse tree with the context - let latestVariables = null; + let latestVariables = contextTracker.start; const customContextTracker = new ContextTracker({ start: contextTracker.start, diff --git a/test/fixtures/zeebe/immediately-broken-expression.bpmn b/test/fixtures/zeebe/immediately-broken-expression.bpmn new file mode 100644 index 0000000..f759a6b --- /dev/null +++ b/test/fixtures/zeebe/immediately-broken-expression.bpmn @@ -0,0 +1,33 @@ + + + + + Flow_1imcl82 + + + + + + + + + Flow_1imcl82 + + + + + + + + + + + + + + + + + + + diff --git a/test/fixtures/zeebe/long-broken-expression.bpmn b/test/fixtures/zeebe/long-broken-expression.bpmn index fadd8da..ebeca2c 100644 --- a/test/fixtures/zeebe/long-broken-expression.bpmn +++ b/test/fixtures/zeebe/long-broken-expression.bpmn @@ -1,7 +1,7 @@ - + @@ -10,14 +10,14 @@ Flow_1imcl82 - + Flow_1imcl82 - + diff --git a/test/spec/zeebe/ZeebeVariableResolver.spec.js b/test/spec/zeebe/ZeebeVariableResolver.spec.js index 60f0de5..3bcaf3a 100644 --- a/test/spec/zeebe/ZeebeVariableResolver.spec.js +++ b/test/spec/zeebe/ZeebeVariableResolver.spec.js @@ -14,6 +14,7 @@ import complexXML from 'test/fixtures/zeebe/complex.bpmn'; import connectorsXML from 'test/fixtures/zeebe/connectors.bpmn'; import ioMappingsXML from 'test/fixtures/zeebe/ioMappings.bpmn'; import longBrokenExpressionXML from 'test/fixtures/zeebe/long-broken-expression.bpmn'; +import immediatelyBrokenExpressionXML from 'test/fixtures/zeebe/immediately-broken-expression.bpmn'; import VariableProvider from 'lib/VariableProvider'; import { getInputOutput } from '../../../lib/base/util/ExtensionElementsUtil'; @@ -1043,32 +1044,65 @@ describe('ZeebeVariableResolver', function() { describe('parsing', function() { - beforeEach(bootstrapModeler(longBrokenExpressionXML, { - container, - additionalModules: [ - ZeebeVariableResolverModule - ], - moddleExtensions: { - zeebe: ZeebeModdle - } - })); + describe('long broken expression', function() { + beforeEach(bootstrapModeler(longBrokenExpressionXML, { + container, + additionalModules: [ + ZeebeVariableResolverModule + ], + moddleExtensions: { + zeebe: ZeebeModdle + } + })); - it('should NOT error on a long broken expression', inject(async function(elementRegistry, variableResolver) { - // given - const task = elementRegistry.get('Task_1'); - const bo = getBusinessObject(task); - const input = getInputOutput(bo).inputParameters[1]; + it('should NOT error on a long broken expression', inject(async function(elementRegistry, variableResolver) { - // when - const variables = await variableResolver.getVariablesForElement(bo, input); + // given + const task = elementRegistry.get('TASK_WITH_LONG_BROKEN_EXPRESSION'); + const bo = getBusinessObject(task); - // then - expect(variables).to.variableEqual([ - { name: 'target' } - ]); - })); + // when + const variables = await variableResolver.getVariablesForElement(bo); + + // then + expect(variables).to.variableEqual([ + { name: 'target' } + ]); + })); + + }); + + + describe('immediately broken expression', function() { + + beforeEach(bootstrapModeler(immediatelyBrokenExpressionXML, { + container, + additionalModules: [ + ZeebeVariableResolverModule + ], + moddleExtensions: { + zeebe: ZeebeModdle + } + })); + + + it('should NOT error on an immediate syntax error', inject(async function(elementRegistry, variableResolver) { + + // given + const task = elementRegistry.get('TASK_WITH_IMMEDIATELY_BROKEN_EXPRESSION'); + const bo = getBusinessObject(task); + + // when + const variables = await variableResolver.getVariablesForElement(bo); + + // then + expect(variables).to.variableEqual([ + { name: 'target' } + ]); + })); + }); }); });