Skip to content

Commit

Permalink
feat(rules): add duplicate-task-headers rule
Browse files Browse the repository at this point in the history
Related to camunda/linting#4
Co-authored-by: Niklas Kiefer <[email protected]>
  • Loading branch information
philippfromme committed Aug 18, 2022
1 parent f5f45e7 commit 7e70764
Show file tree
Hide file tree
Showing 6 changed files with 482 additions and 2 deletions.
5 changes: 5 additions & 0 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ module.exports = {
rules: {
'called-decision-or-task-definition': [ 'error', calledDecisionOrTaskDefinitionConfig.camundaCloud10 ],
'called-element': 'error',
'duplicate-task-headers': 'error',
'element-type': [ 'error', elementTypeConfig.camundaCloud10 ],
'error-reference': 'error',
'loop-characteristics': 'error',
Expand All @@ -20,6 +21,7 @@ module.exports = {
rules: {
'called-decision-or-task-definition': [ 'error', calledDecisionOrTaskDefinitionConfig.camundaCloud11 ],
'called-element': 'error',
'duplicate-task-headers': 'error',
'element-type': [ 'error', elementTypeConfig.camundaCloud11 ],
'error-reference': 'error',
'loop-characteristics': 'error',
Expand All @@ -33,6 +35,7 @@ module.exports = {
rules: {
'called-decision-or-task-definition': [ 'error', calledDecisionOrTaskDefinitionConfig.camundaCloud12 ],
'called-element': 'error',
'duplicate-task-headers': 'error',
'element-type': [ 'error', elementTypeConfig.camundaCloud12 ],
'error-reference': 'error',
'loop-characteristics': 'error',
Expand All @@ -46,6 +49,7 @@ module.exports = {
rules: {
'called-decision-or-task-definition': [ 'error', calledDecisionOrTaskDefinitionConfig.camundaCloud13 ],
'called-element': 'error',
'duplicate-task-headers': 'error',
'element-type': [ 'error', elementTypeConfig.camundaCloud12 ],
'error-reference': 'error',
'loop-characteristics': 'error',
Expand All @@ -59,6 +63,7 @@ module.exports = {
rules: {
'called-decision-or-task-definition': [ 'error', calledDecisionOrTaskDefinitionConfig.camundaCloud13 ],
'called-element': 'error',
'duplicate-task-headers': 'error',
'element-type': [ 'error', elementTypeConfig.camundaCloud12 ],
'error-reference': 'error',
'loop-characteristics': 'error',
Expand Down
57 changes: 57 additions & 0 deletions rules/duplicate-task-headers.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
const {
is,
isAny
} = require('bpmnlint-utils');

const {
findExtensionElement,
getMessageEventDefinition,
hasDuplicatedPropertyValues
} = require('./utils/element');

const { reportErrors } = require('./utils/reporter');

module.exports = function() {
function check(node, reporter) {
if (!is(node, 'bpmn:UserTask') && !isZeebeServiceTask(node)) {
return;
}

const taskHeaders = findExtensionElement(node, 'zeebe:TaskHeaders');

if (!taskHeaders) {
return;
}

const errors = hasDuplicatedPropertyValues(taskHeaders, 'values', 'key', node);

if (errors && errors.length) {
reportErrors(node, reporter, errors);
}
}

return {
check
};
};

// helpers //////////

function isZeebeServiceTask(element) {
if (is(element, 'zeebe:ZeebeServiceTask')) {
return true;
}

if (isAny(element, [
'bpmn:EndEvent',
'bpmn:IntermediateThrowEvent'
])) {
return getMessageEventDefinition(element);
}

if (is(element, 'bpmn:BusinessRuleTask')) {
return findExtensionElement(element, 'zeebe:TaskDefinition');
}

return false;
}
2 changes: 2 additions & 0 deletions rules/user-task-form.js
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@ module.exports = function() {
};
};

// helpers //////////

function findUserTaskForm(node, formKey) {
const process = findParent(node, 'bpmn:Process');

Expand Down
17 changes: 15 additions & 2 deletions rules/utils/element.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,33 @@ const {
some
} = require('min-dash');

const { isAny } = require('bpmnlint-utils');
const {
is,
isAny
} = require('bpmnlint-utils');

const { getPath } = require('@bpmn-io/moddle-utils');

const { ERROR_TYPES } = require('./error-types');

module.exports.ERROR_TYPES = ERROR_TYPES;

module.exports.getEventDefinition = function(node) {
function getEventDefinition(node) {
const eventDefinitions = node.get('eventDefinitions');

if (eventDefinitions) {
return eventDefinitions[ 0 ];
}
}

module.exports.getEventDefinition = getEventDefinition;

module.exports.getMessageEventDefinition = function(node) {
if (is(node, 'bpmn:ReceiveTask')) {
return node;
}

return getEventDefinition(node);
};

function findExtensionElements(node, types) {
Expand Down
Loading

0 comments on commit 7e70764

Please sign in to comment.