Skip to content

Commit 9e90ca4

Browse files
committed
feat: provide variables used in feel expressions
Related to camunda/camunda-modeler#5639
1 parent fce73d0 commit 9e90ca4

File tree

10 files changed

+1156
-47
lines changed

10 files changed

+1156
-47
lines changed

lib/base/VariableResolver.js

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ export class BaseVariableResolver {
159159
variables.forEach(variable => {
160160
const existingVariable = mergedVariables.find(v =>
161161
v.name === variable.name && v.scope === variable.scope
162+
&& !v.usedBy && !variable.usedBy
162163
);
163164

164165
if (existingVariable) {
@@ -251,7 +252,7 @@ export class BaseVariableResolver {
251252
*
252253
* @async
253254
* @param {ModdleElement} element
254-
* @returns {Array<ProcessVariable>} variables
255+
* @returns {Promise<Array<ProcessVariable>>} variables
255256
*/
256257
async getVariablesForElement(element) {
257258
const bo = getBusinessObject(element);
@@ -261,14 +262,14 @@ export class BaseVariableResolver {
261262

262263
// (1) get variables for given scope
263264
var scopeVariables = allVariables.filter(function(variable) {
264-
return variable.scope.id === bo.id;
265+
return variable.scope && variable.scope.id === bo.id;
265266
});
266267

267268
// (2) get variables for parent scopes
268269
var parents = getParents(bo);
269270

270271
var parentsScopeVariables = allVariables.filter(function(variable) {
271-
return parents.find(function(parent) {
272+
return variable.scope && parents.find(function(parent) {
272273
return parent.id === variable.scope.id;
273274
});
274275
});
@@ -294,6 +295,31 @@ export class BaseVariableResolver {
294295
return false;
295296
});
296297
}
298+
299+
/**
300+
* Returns consumed variables for an element — variables
301+
* the element needs as input for its expressions and mappings.
302+
*
303+
* Uses `getVariables()` instead of `getVariablesForElement()` to
304+
* bypass the name-based deduplication that would drop requirement
305+
* entries for variables that also exist in ancestor scopes.
306+
*
307+
* @param {Object} element
308+
* @returns {Promise<Array<ProcessVariable>>}
309+
*/
310+
async getConsumedVariablesForElement(element) {
311+
const allVariablesByRoot = await this.getVariables()
312+
.catch(() => {
313+
return {};
314+
});
315+
316+
const allVariables = Object.values(allVariablesByRoot).flat();
317+
318+
return allVariables.filter(v =>
319+
v.usedBy && v.usedBy.length > 0
320+
&& v.origin.length === 1 && v.origin[0].id === element.id
321+
);
322+
}
297323
}
298324

299325
BaseVariableResolver.$inject = [ 'eventBus', 'bpmnjs' ];

lib/zeebe/VariableResolver.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,9 +98,9 @@ export default class ZeebeVariableResolver extends BaseVariableResolver {
9898

9999
for (const key in rawVariables) {
100100
const variables = rawVariables[key];
101-
const newVariables = parseVariables(variables);
101+
const { resolvedVariables, consumedVariables } = parseVariables(variables);
102102

103-
mappedVariables[key] = [ ...variables, ...newVariables ];
103+
mappedVariables[key] = [ ...variables, ...resolvedVariables, ...consumedVariables ];
104104
}
105105

106106
context.variables = mappedVariables;

0 commit comments

Comments
 (0)