Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 25 additions & 5 deletions rules/camunda-cloud/feel.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,19 @@ const { ERROR_TYPES } = require('../utils/error-types');
const { skipInNonExecutableProcess } = require('../utils/rule');
const { annotateRule } = require('../helper');

// Properties ignored globally
const IGNORED_PROPERTIES = [
'name'
];

// Properties ignored only for specific element types
const IGNORED_PROPERTIES_BY_TYPE = {
'zeebe:Input': [ 'target' ],
'zeebe:Output': [ 'target' ],
'zeebe:Header': [ 'key', 'value' ],
'zeebe:Property': [ 'name', 'value' ]
};

module.exports = skipInNonExecutableProcess(function() {
function check(node, reporter) {
if (is(node, 'bpmn:Expression')) {
Expand All @@ -36,7 +49,7 @@ module.exports = skipInNonExecutableProcess(function() {
propertyValue = propertyValue.get('body');
}

if (isFeelProperty([ propertyName, propertyValue ])) {
if (isFeelProperty(node, propertyName, propertyValue)) {
const lintErrors = lintExpression(propertyValue.substring(1), {
parserDialect: 'camunda',
builtins: camundaReservedNameBuiltins
Expand Down Expand Up @@ -74,12 +87,19 @@ module.exports = skipInNonExecutableProcess(function() {
});
});

const isFeelProperty = ([ propertyName, value ]) => {
return !isIgnoredProperty(propertyName) && isString(value) && value.startsWith('=');
const isFeelProperty = (node, propertyName, value) => {
return !isIgnoredProperty(node, propertyName) && isString(value) && value.startsWith('=');
};

const isIgnoredProperty = propertyName => {
return propertyName.startsWith('$');
const isIgnoredProperty = (node, propertyName) => {
if (propertyName.startsWith('$') || IGNORED_PROPERTIES.includes(propertyName)) {
return true;
}

const nodeType = node.$type;
const ignoredForType = IGNORED_PROPERTIES_BY_TYPE[nodeType];

return ignoredForType && ignoredForType.includes(propertyName);
};

const findParentNode = node => {
Expand Down
54 changes: 54 additions & 0 deletions test/camunda-cloud/feel.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,60 @@ const valid = [
</bpmn:serviceTask>
</bpmn:process>
`))
},
{
name: 'name with FEEL-like expression (ignored)',
moddleElement: createModdle(createProcess(`
<bpmn:task id="Task_1" name="==...foo" />
`))
},
{
name: 'input target with FEEL-like expression (ignored)',
moddleElement: createModdle(createProcess(`
<bpmn:serviceTask id="Task_1">
<bpmn:extensionElements>
<zeebe:ioMapping>
<zeebe:input target="=...foo" />
</zeebe:ioMapping>
</bpmn:extensionElements>
</bpmn:serviceTask>
`))
},
{
name: 'output target with FEEL-like expression (ignored)',
moddleElement: createModdle(createProcess(`
<bpmn:serviceTask id="Task_1">
<bpmn:extensionElements>
<zeebe:ioMapping>
<zeebe:output target="=...foo" />
</zeebe:ioMapping>
</bpmn:extensionElements>
</bpmn:serviceTask>
`))
},
{
name: 'task header key and value with FEEL-like expression (ignored)',
moddleElement: createModdle(createProcess(`
<bpmn:serviceTask id="Task_1">
<bpmn:extensionElements>
<zeebe:taskHeaders>
<zeebe:header key="==...foo" value="==...foo" />
</zeebe:taskHeaders>
</bpmn:extensionElements>
</bpmn:serviceTask>
`))
},
{
name: 'zeebe property name and value with FEEL-like expression (ignored)',
moddleElement: createModdle(createProcess(`
<bpmn:serviceTask id="Task_1">
<bpmn:extensionElements>
<zeebe:properties>
<zeebe:property name="==...foo" value="==...foo" />
</zeebe:properties>
</bpmn:extensionElements>
</bpmn:serviceTask>
`))
}
];

Expand Down
Loading