From 013f32417d47a4995566280a2ebc05c5351e7079 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Konopski?= Date: Tue, 12 Nov 2024 12:48:10 +0100 Subject: [PATCH] feat: support task listeners related to https://github.com/camunda/camunda-modeler/issues/4590 --- CHANGELOG.md | 6 + index.js | 10 +- package-lock.json | 17 +- package.json | 2 +- .../camunda-cloud/duplicate-task-listeners.js | 33 ++ rules/camunda-cloud/no-task-listeners.js | 21 ++ rules/camunda-cloud/task-listener.js | 47 +++ .../duplicate-task-listeners.spec.js | 295 ++++++++++++++++++ test/camunda-cloud/no-task-listeners.spec.js | 57 ++++ test/camunda-cloud/task-listener.spec.js | 214 +++++++++++++ test/config/configs.spec.js | 16 + 11 files changed, 707 insertions(+), 11 deletions(-) create mode 100644 rules/camunda-cloud/duplicate-task-listeners.js create mode 100644 rules/camunda-cloud/no-task-listeners.js create mode 100644 rules/camunda-cloud/task-listener.js create mode 100644 test/camunda-cloud/duplicate-task-listeners.spec.js create mode 100644 test/camunda-cloud/no-task-listeners.spec.js create mode 100644 test/camunda-cloud/task-listener.spec.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 6916ed6..59b6b7d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,12 @@ All notable changes to [bpmnlint-plugin-camunda-compat](https://github.com/camun ___Note:__ Yet to be released changes appear here._ +* `DEPS`: bump `zeebe-bpmn-moddle@1.7.0` +* `FEAT`: support task listeners ([#181](https://github.com/camunda/bpmnlint-plugin-camunda-compat/pull/181)) +* `FEAT`: add `no-duplicate-task-listeners` rule +* `FEAT`: add `no-task-listeners` rule +* `FEAT`: add `task-listener` rule + # 2.27.0 * `FEAT`: add `zeebe-user-task` rule ([#179](https://github.com/camunda/bpmnlint-plugin-camunda-compat/pull/179)) diff --git a/index.js b/index.js index d1cbc72..770b4bb 100644 --- a/index.js +++ b/index.js @@ -21,6 +21,7 @@ const camundaCloud10Rules = withConfig({ 'no-propagate-all-parent-variables': 'error', 'no-task-schedule': 'error', 'no-template': 'error', + 'no-task-listeners': 'error', 'no-version-tag': 'error', 'no-zeebe-properties': 'error', 'no-zeebe-user-task': 'error', @@ -94,8 +95,10 @@ const camundaCloud86Rules = withConfig({ }, { version: '8.6' }); const camundaCloud87Rules = withConfig({ - ...camundaCloud86Rules, - 'zeebe-user-task': 'error' + ...omit(camundaCloud86Rules, [ 'no-task-listeners' ]), + 'zeebe-user-task': 'error', + 'duplicate-task-listeners': 'error', + 'task-listener': 'error' }, { version: '8.7' }); const camundaPlatform719Rules = withConfig({ @@ -132,6 +135,7 @@ const rules = { 'connector-properties': './rules/camunda-cloud/connector-properties', 'duplicate-execution-listeners': './rules/camunda-cloud/duplicate-execution-listeners', 'duplicate-task-headers': './rules/camunda-cloud/duplicate-task-headers', + 'duplicate-task-listeners': './rules/camunda-cloud/duplicate-task-listeners', 'error-reference': './rules/camunda-cloud/error-reference', 'escalation-boundary-event-attached-to-ref': './rules/camunda-cloud/escalation-boundary-event-attached-to-ref', 'escalation-reference': './rules/camunda-cloud/escalation-reference', @@ -155,6 +159,7 @@ const rules = { 'no-propagate-all-parent-variables': './rules/camunda-cloud/no-propagate-all-parent-variables', 'no-signal-event-sub-process': './rules/camunda-cloud/no-signal-event-sub-process', 'no-task-schedule': './rules/camunda-cloud/no-task-schedule', + 'no-task-listeners': './rules/camunda-cloud/no-task-listeners', 'no-template': './rules/camunda-cloud/no-template', 'no-version-tag': './rules/camunda-cloud/no-version-tag', 'no-zeebe-properties': './rules/camunda-cloud/no-zeebe-properties', @@ -165,6 +170,7 @@ const rules = { 'signal-reference': './rules/camunda-cloud/signal-reference', 'start-event-form': './rules/camunda-cloud/start-event-form', 'subscription': './rules/camunda-cloud/subscription', + 'task-listener': './rules/camunda-cloud/task-listener', 'task-schedule': './rules/camunda-cloud/task-schedule', 'timer': './rules/camunda-cloud/timer', 'user-task-definition': './rules/camunda-cloud/user-task-definition', diff --git a/package-lock.json b/package-lock.json index 6abe515..f9744bb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,7 +26,7 @@ "modeler-moddle": "^0.2.0", "sinon": "^17.0.1", "sinon-chai": "^3.7.0", - "zeebe-bpmn-moddle": "^1.6.0" + "zeebe-bpmn-moddle": "^1.7.0" }, "engines": { "node": "*" @@ -3118,10 +3118,11 @@ } }, "node_modules/zeebe-bpmn-moddle": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/zeebe-bpmn-moddle/-/zeebe-bpmn-moddle-1.6.0.tgz", - "integrity": "sha512-vjPeJoLQs7UkC5m27K0CyZkQMEAI8GsISU6TcfD2n/SzqkhJ6tubvcIabLRAhreaiuHY26MjtSVXw1LRVgd7Iw==", - "dev": true + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/zeebe-bpmn-moddle/-/zeebe-bpmn-moddle-1.7.0.tgz", + "integrity": "sha512-eZ6OXSt0c4n9V/oN/46gTlwDIS3GhWQLt9jbM5uS/YryB4yN8wdrrKrtw+TpyNy0SSKWXNDHyC83nCA2blPO3Q==", + "dev": true, + "license": "MIT" } }, "dependencies": { @@ -5405,9 +5406,9 @@ "dev": true }, "zeebe-bpmn-moddle": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/zeebe-bpmn-moddle/-/zeebe-bpmn-moddle-1.6.0.tgz", - "integrity": "sha512-vjPeJoLQs7UkC5m27K0CyZkQMEAI8GsISU6TcfD2n/SzqkhJ6tubvcIabLRAhreaiuHY26MjtSVXw1LRVgd7Iw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/zeebe-bpmn-moddle/-/zeebe-bpmn-moddle-1.7.0.tgz", + "integrity": "sha512-eZ6OXSt0c4n9V/oN/46gTlwDIS3GhWQLt9jbM5uS/YryB4yN8wdrrKrtw+TpyNy0SSKWXNDHyC83nCA2blPO3Q==", "dev": true } } diff --git a/package.json b/package.json index a2c63ea..bb424d7 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "modeler-moddle": "^0.2.0", "sinon": "^17.0.1", "sinon-chai": "^3.7.0", - "zeebe-bpmn-moddle": "^1.6.0" + "zeebe-bpmn-moddle": "^1.7.0" }, "dependencies": { "@bpmn-io/feel-lint": "^1.2.0", diff --git a/rules/camunda-cloud/duplicate-task-listeners.js b/rules/camunda-cloud/duplicate-task-listeners.js new file mode 100644 index 0000000..1ebd4ba --- /dev/null +++ b/rules/camunda-cloud/duplicate-task-listeners.js @@ -0,0 +1,33 @@ +const { + findExtensionElement, + hasDuplicatedPropertiesValues +} = require('../utils/element'); + +const { reportErrors } = require('../utils/reporter'); + +const { skipInNonExecutableProcess } = require('../utils/rule'); + +module.exports = skipInNonExecutableProcess(function() { + function check(node, reporter) { + const taskListeners = findExtensionElement(node, 'zeebe:TaskListeners'); + + if (!taskListeners) { + return; + } + + const errors = hasDuplicatedTaskListeners(taskListeners, node); + + if (errors && errors.length) { + reportErrors(node, reporter, errors); + } + } + + return { + check + }; +}); + +// helpers ////////// +function hasDuplicatedTaskListeners(taskListeners, parentNode = null) { + return hasDuplicatedPropertiesValues(taskListeners, 'listeners', [ 'eventType', 'type' ], parentNode); +} diff --git a/rules/camunda-cloud/no-task-listeners.js b/rules/camunda-cloud/no-task-listeners.js new file mode 100644 index 0000000..68b22ac --- /dev/null +++ b/rules/camunda-cloud/no-task-listeners.js @@ -0,0 +1,21 @@ +const { reportErrors } = require('../utils/reporter'); + +const { skipInNonExecutableProcess } = require('../utils/rule'); + +const { hasNoExtensionElement } = require('../utils/element'); + +const ALLOWED_VERSION = '8.7'; + +module.exports = skipInNonExecutableProcess(function() { + function check(node, reporter) { + const errors = hasNoExtensionElement(node, 'zeebe:TaskListeners', node, ALLOWED_VERSION); + + if (errors && errors.length) { + reportErrors(node, reporter, errors); + } + } + + return { + check + }; +}); diff --git a/rules/camunda-cloud/task-listener.js b/rules/camunda-cloud/task-listener.js new file mode 100644 index 0000000..2a8c468 --- /dev/null +++ b/rules/camunda-cloud/task-listener.js @@ -0,0 +1,47 @@ +const { is } = require('bpmnlint-utils'); + +const { + findExtensionElement, + hasProperties, + hasExtensionElement +} = require('../utils/element'); + +const { reportErrors } = require('../utils/reporter'); + +const { skipInNonExecutableProcess } = require('../utils/rule'); + + +module.exports = skipInNonExecutableProcess(function() { + function check(node, reporter) { + if (!is(node, 'bpmn:UserTask')) { + return; + } + + let errors = hasExtensionElement(node, 'zeebe:UserTask', node); + + if (errors && errors.length) { + reportErrors(node, reporter, errors); + } + + const taskListeners = findExtensionElement(node, 'zeebe:TaskListeners'); + + if (!taskListeners) { + return; + } + + const listeners = taskListeners.get('listeners'); + errors = listeners.flatMap(listener => hasProperties(listener, { + type: { + required: true + } + }, node)); + + if (errors.length) { + reportErrors(node, reporter, errors); + } + } + + return { + check + }; +}); diff --git a/test/camunda-cloud/duplicate-task-listeners.spec.js b/test/camunda-cloud/duplicate-task-listeners.spec.js new file mode 100644 index 0000000..a0e7059 --- /dev/null +++ b/test/camunda-cloud/duplicate-task-listeners.spec.js @@ -0,0 +1,295 @@ +const RuleTester = require('bpmnlint/lib/testers/rule-tester'); + +const rule = require('../../rules/camunda-cloud/duplicate-task-listeners'); + +const { + createDefinitions, + createModdle, + createProcess +} = require('../helper'); + +const { ERROR_TYPES } = require('../../rules/utils/element'); + +const valid = [ + { + name: 'service task', + moddleElement: createModdle(createProcess(` + + + + + + + + + `)) + }, + { + name: 'send task', + moddleElement: createModdle(createProcess(` + + + + + + + + + `)) + }, + { + name: 'user task', + moddleElement: createModdle(createProcess(` + + + + + + + + + `)) + }, + { + name: 'business rule task', + moddleElement: createModdle(createProcess(` + + + + + + + + + + `)) + }, + { + name: 'script task', + moddleElement: createModdle(createProcess(` + + + + + + + + + + + `)) + }, + { + name: 'message throw event', + moddleElement: createModdle(createProcess(` + + + + + + + + + + `)) + }, + { + name: 'service task (non-executable process)', + config: { version: '8.7' }, + moddleElement: createModdle(createDefinitions(` + + + + + + + + + + + `)) + } +]; + +const invalid = [ + { + name: 'service task', + moddleElement: createModdle(createProcess(` + + + + + + + + + `)), + report: { + id: 'ServiceTask_1', + message: 'Properties of type have properties with duplicate values (property with duplicate value of , property with duplicate value of )', + path: null, + data: { + type: ERROR_TYPES.PROPERTY_VALUES_DUPLICATED, + node: 'zeebe:TaskListeners', + parentNode: 'ServiceTask_1', + 'duplicatedProperties': { + 'eventType': 'start', + 'type': 'duplicate' + }, + properties: [ + 'zeebe:TaskListener', + 'zeebe:TaskListener' + ], + propertiesName: 'listeners' + } + } + }, + { + name: 'service task (multiple duplicates)', + moddleElement: createModdle(createProcess(` + + + + + + + + + + `)), + report: [ + { + id: 'ServiceTask_1', + message: 'Properties of type have properties with duplicate values (property with duplicate value of , property with duplicate value of )', + path: null, + data: { + type: ERROR_TYPES.PROPERTY_VALUES_DUPLICATED, + node: 'zeebe:TaskListeners', + parentNode: 'ServiceTask_1', + 'duplicatedProperties': { + 'eventType': 'start', + 'type': 'duplicate' + }, + properties: [ + 'zeebe:TaskListener', + 'zeebe:TaskListener', + 'zeebe:TaskListener' + ], + propertiesName: 'listeners' + } + }, + { + id: 'ServiceTask_1', + message: 'Properties of type have properties with duplicate values (property with duplicate value of , property with duplicate value of )', + path: null, + data: { + type: ERROR_TYPES.PROPERTY_VALUES_DUPLICATED, + node: 'zeebe:TaskListeners', + parentNode: 'ServiceTask_1', + 'duplicatedProperties': { + 'eventType': 'start', + 'type': 'duplicate' + }, + properties: [ + 'zeebe:TaskListener', + 'zeebe:TaskListener', + 'zeebe:TaskListener' + ], + propertiesName: 'listeners' + } + } + ] + }, + { + name: 'service task (multiple duplicates)', + moddleElement: createModdle(createProcess(` + + + + + + + + + + + `)), + report: [ + { + id: 'ServiceTask_1', + message: 'Properties of type have properties with duplicate values (property with duplicate value of , property with duplicate value of )', + path: null, + data: { + type: ERROR_TYPES.PROPERTY_VALUES_DUPLICATED, + node: 'zeebe:TaskListeners', + parentNode: 'ServiceTask_1', + 'duplicatedProperties': { + 'eventType': 'start', + 'type': 'duplicate' + }, + properties: [ + 'zeebe:TaskListener', + 'zeebe:TaskListener' + ], + propertiesName: 'listeners' + } + }, + { + id: 'ServiceTask_1', + message: 'Properties of type have properties with duplicate values (property with duplicate value of , property with duplicate value of )', + path: null, + data: { + type: ERROR_TYPES.PROPERTY_VALUES_DUPLICATED, + node: 'zeebe:TaskListeners', + parentNode: 'ServiceTask_1', + 'duplicatedProperties': { + 'eventType': 'start', + 'type': 'duplicate_2' + }, + properties: [ + 'zeebe:TaskListener', + 'zeebe:TaskListener' + ], + propertiesName: 'listeners' + } + } + ] + }, + { + name: 'service task (no type)', + moddleElement: createModdle(createProcess(` + + + + + + + + + `)), + report: { + id: 'ServiceTask_1', + message: 'Properties of type have properties with duplicate values (property with duplicate value of , property with duplicate value of <>)', + path: null, + data: { + type: ERROR_TYPES.PROPERTY_VALUES_DUPLICATED, + node: 'zeebe:TaskListeners', + parentNode: 'ServiceTask_1', + 'duplicatedProperties': { + 'eventType': 'start', + 'type': '' + }, + properties: [ + 'zeebe:TaskListener', + 'zeebe:TaskListener' + ], + propertiesName: 'listeners' + } + } + } +]; + +RuleTester.verify('duplicate-task-listeners', rule, { + valid, + invalid +}); \ No newline at end of file diff --git a/test/camunda-cloud/no-task-listeners.spec.js b/test/camunda-cloud/no-task-listeners.spec.js new file mode 100644 index 0000000..8c5602e --- /dev/null +++ b/test/camunda-cloud/no-task-listeners.spec.js @@ -0,0 +1,57 @@ +const RuleTester = require('bpmnlint/lib/testers/rule-tester'); + +const rule = require('../../rules/camunda-cloud/no-task-listeners'); + +const { + createModdle, + createProcess +} = require('../helper'); + +const { ERROR_TYPES } = require('../../rules/utils/element'); + +const valid = [ + { + name: 'user task without task listeners', + config: { version: '8.6' }, + moddleElement: createModdle(createProcess(` + + `)) + } +]; + +const invalid = [ + { + name: 'no task listeners (Camunda 8.6)', + config: { version: '8.6' }, + moddleElement: createModdle(createProcess(` + + + + + + + + `)), + report: { + id: 'UserTask_1', + message: 'Extension element of type only allowed by Camunda 8.7', + path: [ + 'extensionElements', + 'values', + 0 + ], + data: { + type: ERROR_TYPES.EXTENSION_ELEMENT_NOT_ALLOWED, + node: 'UserTask_1', + parentNode: null, + extensionElement: 'zeebe:TaskListeners', + allowedVersion: '8.7' + } + } + } +]; + +RuleTester.verify('no-task-listeners', rule, { + valid, + invalid +}); \ No newline at end of file diff --git a/test/camunda-cloud/task-listener.spec.js b/test/camunda-cloud/task-listener.spec.js new file mode 100644 index 0000000..be539ef --- /dev/null +++ b/test/camunda-cloud/task-listener.spec.js @@ -0,0 +1,214 @@ +const RuleTester = require('bpmnlint/lib/testers/rule-tester'); + +const rule = require('../../rules/camunda-cloud/task-listener'); + +const { + createModdle, + createProcess +} = require('../helper'); + +const { ERROR_TYPES } = require('../../rules/utils/element'); + +const valid = [ + { + name: 'task listener with type', + config: { version: '8.7' }, + moddleElement: createModdle(createProcess(` + + + + + + + + + `)) + } +]; + +const invalid = [ + { + name: 'task listener not in zeebe:UserTask', + config: { version: '8.7' }, + moddleElement: createModdle(createProcess(` + + + + + + + + `)), + report: { + id: 'UserTask_1', + message: 'Element of type must have one extension element of type ', + path: [], + data: { + type: ERROR_TYPES.EXTENSION_ELEMENT_REQUIRED, + node: 'UserTask_1', + parentNode: null, + requiredExtensionElement: 'zeebe:UserTask' + } + } + }, + { + name: 'task listener with empty type', + config: { version: '8.7' }, + moddleElement: createModdle(createProcess(` + + + + + + + + + `)), + report: { + id: 'UserTask_1', + message: 'Element of type must have property ', + path: [ + 'extensionElements', + 'values', + 0, + 'listeners', + 0, + 'type' + ], + data: { + type: ERROR_TYPES.PROPERTY_REQUIRED, + node: 'zeebe:TaskListener', + parentNode: 'UserTask_1', + requiredProperty: 'type' + } + } + }, + { + name: 'task listener with no type', + config: { version: '8.7' }, + moddleElement: createModdle(createProcess(` + + + + + + + + + `)), + report: { + id: 'UserTask_1', + message: 'Element of type must have property ', + path: [ + 'extensionElements', + 'values', + 0, + 'listeners', + 0, + 'type' + ], + data: { + type: ERROR_TYPES.PROPERTY_REQUIRED, + node: 'zeebe:TaskListener', + parentNode: 'UserTask_1', + requiredProperty: 'type' + } + } + }, + { + name: 'multiple task listeners with no type', + config: { version: '8.7' }, + moddleElement: createModdle(createProcess(` + + + + + + + + + + + + `)), + report: [ + { + id: 'UserTask_1', + message: 'Element of type must have property ', + path: [ + 'extensionElements', + 'values', + 0, + 'listeners', + 0, + 'type' + ], + data: { + type: ERROR_TYPES.PROPERTY_REQUIRED, + node: 'zeebe:TaskListener', + parentNode: 'UserTask_1', + requiredProperty: 'type' + } + }, + { + id: 'UserTask_1', + message: 'Element of type must have property ', + path: [ + 'extensionElements', + 'values', + 0, + 'listeners', + 1, + 'type' + ], + data: { + type: ERROR_TYPES.PROPERTY_REQUIRED, + node: 'zeebe:TaskListener', + parentNode: 'UserTask_1', + requiredProperty: 'type' + } + }, + { + id: 'UserTask_1', + message: 'Element of type must have property ', + path: [ + 'extensionElements', + 'values', + 0, + 'listeners', + 2, + 'type' + ], + data: { + type: ERROR_TYPES.PROPERTY_REQUIRED, + node: 'zeebe:TaskListener', + parentNode: 'UserTask_1', + requiredProperty: 'type' + } + }, + { + id: 'UserTask_1', + message: 'Element of type must have property ', + path: [ + 'extensionElements', + 'values', + 0, + 'listeners', + 3, + 'type' + ], + data: { + type: ERROR_TYPES.PROPERTY_REQUIRED, + node: 'zeebe:TaskListener', + parentNode: 'UserTask_1', + requiredProperty: 'type' + } + } + ] + } +]; + +RuleTester.verify('task-listener', rule, { + valid, + invalid +}); \ No newline at end of file diff --git a/test/config/configs.spec.js b/test/config/configs.spec.js index b67f86f..6682157 100644 --- a/test/config/configs.spec.js +++ b/test/config/configs.spec.js @@ -24,6 +24,7 @@ describe('configs', function() { 'no-multiple-none-start-events' : [ 'error', { version: '1.0' } ], 'no-priority-definition': [ 'error', { version: '1.0' } ], 'no-propagate-all-parent-variables' : [ 'error', { version: '1.0' } ], + 'no-task-listeners': [ 'error', { version: '1.0' } ], 'no-task-schedule': [ 'error', { version: '1.0' } ], 'no-template': [ 'error', { version: '1.0' } ], 'no-version-tag': [ 'error', { version: '1.0' } ], @@ -58,6 +59,7 @@ describe('configs', function() { 'no-multiple-none-start-events' : [ 'error', { version: '1.1' } ], 'no-priority-definition': [ 'error', { version: '1.1' } ], 'no-propagate-all-parent-variables' : [ 'error', { version: '1.1' } ], + 'no-task-listeners': [ 'error', { version: '1.1' } ], 'no-task-schedule': [ 'error', { version: '1.1' } ], 'no-template': [ 'error', { version: '1.1' } ], 'no-version-tag': [ 'error', { version: '1.1' } ], @@ -92,6 +94,7 @@ describe('configs', function() { 'no-multiple-none-start-events' : [ 'error', { version: '1.2' } ], 'no-priority-definition': [ 'error', { version: '1.2' } ], 'no-propagate-all-parent-variables' : [ 'error', { version: '1.2' } ], + 'no-task-listeners': [ 'error', { version: '1.2' } ], 'no-task-schedule': [ 'error', { version: '1.2' } ], 'no-template': [ 'error', { version: '1.2' } ], 'no-version-tag': [ 'error', { version: '1.2' } ], @@ -127,6 +130,7 @@ describe('configs', function() { 'no-priority-definition': [ 'error', { version: '1.3' } ], 'no-propagate-all-parent-variables' : [ 'error', { version: '1.3' } ], 'no-task-schedule': [ 'error', { version: '1.3' } ], + 'no-task-listeners': [ 'error', { version: '1.3' } ], 'no-template': [ 'error', { version: '1.3' } ], 'no-version-tag': [ 'error', { version: '1.3' } ], 'no-zeebe-properties': [ 'error', { version: '1.3' } ], @@ -162,6 +166,7 @@ describe('configs', function() { 'no-priority-definition': [ 'error', { version: '8.0' } ], 'no-propagate-all-parent-variables' : [ 'error', { version: '8.0' } ], 'no-task-schedule': [ 'error', { version: '8.0' } ], + 'no-task-listeners': [ 'error', { version: '8.0' } ], 'no-version-tag': [ 'error', { version: '8.0' } ], 'no-zeebe-properties': [ 'error', { version: '8.0' } ], 'no-zeebe-user-task': [ 'error', { version: '8.0' } ], @@ -197,6 +202,7 @@ describe('configs', function() { 'no-priority-definition': [ 'error', { version: '8.1' } ], 'no-propagate-all-parent-variables' : [ 'error', { version: '8.1' } ], 'no-task-schedule': [ 'error', { version: '8.1' } ], + 'no-task-listeners': [ 'error', { version: '8.1' } ], 'no-version-tag': [ 'error', { version: '8.1' } ], 'no-zeebe-user-task': [ 'error', { version: '8.1' } ], 'sequence-flow-condition': [ 'error', { version: '8.1' } ], @@ -232,6 +238,7 @@ describe('configs', function() { 'no-multiple-none-start-events' : [ 'error', { version: '8.2' } ], 'no-priority-definition': [ 'error', { version: '8.2' } ], 'no-signal-event-sub-process': [ 'error', { version: '8.2' } ], + 'no-task-listeners': [ 'error', { version: '8.2' } ], 'no-version-tag': [ 'error', { version: '8.2' } ], 'no-zeebe-user-task': [ 'error', { version: '8.2' } ], 'sequence-flow-condition': [ 'error', { version: '8.2' } ], @@ -267,6 +274,7 @@ describe('configs', function() { 'no-loop': [ 'error', { version: '8.3' } ], 'no-multiple-none-start-events' : [ 'error', { version: '8.3' } ], 'no-priority-definition': [ 'error', { version: '8.3' } ], + 'no-task-listeners': [ 'error', { version: '8.3' } ], 'no-version-tag': [ 'error', { version: '8.3' } ], 'no-zeebe-user-task': [ 'error', { version: '8.3' } ], 'secrets': [ 'warn', { version: '8.3' } ], @@ -303,6 +311,7 @@ describe('configs', function() { 'no-loop': [ 'error', { version: '8.4' } ], 'no-multiple-none-start-events' : [ 'error', { version: '8.4' } ], 'no-priority-definition': [ 'error', { version: '8.4' } ], + 'no-task-listeners': [ 'error', { version: '8.4' } ], 'no-version-tag': [ 'error', { version: '8.4' } ], 'no-zeebe-user-task': [ 'error', { version: '8.4' } ], 'secrets': [ 'warn', { version: '8.4' } ], @@ -339,6 +348,7 @@ describe('configs', function() { 'no-loop': [ 'error', { version: '8.5' } ], 'no-multiple-none-start-events' : [ 'error', { version: '8.5' } ], 'no-priority-definition': [ 'error', { version: '8.5' } ], + 'no-task-listeners': [ 'error', { version: '8.5' } ], 'no-version-tag': [ 'error', { version: '8.5' } ], 'secrets': [ 'warn', { version: '8.5' } ], 'sequence-flow-condition': [ 'error', { version: '8.5' } ], @@ -373,6 +383,7 @@ describe('configs', function() { 'no-expression': [ 'error', { version: '8.6' } ], 'no-loop': [ 'error', { version: '8.6' } ], 'no-multiple-none-start-events' : [ 'error', { version: '8.6' } ], + 'no-task-listeners': [ 'error', { version: '8.6' } ], 'priority-definition': [ 'error', { version: '8.6' } ], 'secrets': [ 'warn', { version: '8.6' } ], 'sequence-flow-condition': [ 'error', { version: '8.6' } ], @@ -393,6 +404,7 @@ describe('configs', function() { 'connector-properties': [ 'warn', { version: '8.7' } ], 'duplicate-execution-listeners': [ 'error', { version: '8.7' } ], 'duplicate-task-headers': [ 'error', { version: '8.7' } ], + 'duplicate-task-listeners': [ 'error', { version: '8.7' } ], 'element-type': [ 'error', { version: '8.7' } ], 'error-reference': [ 'error', { version: '8.7' } ], 'escalation-boundary-event-attached-to-ref': [ 'error', { version: '8.7' } ], @@ -415,6 +427,7 @@ describe('configs', function() { 'start-event-form': [ 'error', { version: '8.7' } ], 'subscription': [ 'error', { version: '8.7' } ], 'task-schedule': [ 'error', { version: '8.7' } ], + 'task-listener': [ 'error', { version: '8.7' } ], 'timer': [ 'error', { version: '8.7' } ], 'user-task-definition': [ 'warn', { version: '8.7' } ], 'user-task-form': [ 'error', { version: '8.7' } ], @@ -455,6 +468,7 @@ describe('configs', function() { 'connector-properties': 'warn', 'duplicate-execution-listeners': 'error', 'duplicate-task-headers': 'error', + 'duplicate-task-listeners': 'error', 'error-reference': 'error', 'escalation-boundary-event-attached-to-ref': 'error', 'escalation-reference': 'error', @@ -477,6 +491,7 @@ describe('configs', function() { 'no-priority-definition': 'error', 'no-propagate-all-parent-variables': 'error', 'no-signal-event-sub-process': 'error', + 'no-task-listeners': 'error', 'no-task-schedule': 'error', 'no-template': 'error', 'no-version-tag': 'error', @@ -489,6 +504,7 @@ describe('configs', function() { 'subscription': 'error', 'start-event-form': 'error', 'task-schedule': 'error', + 'task-listener': 'error', 'timer': 'error', 'user-task-definition': 'warn', 'user-task-form': 'error',