From cff7d40e4a31f8a0e63481fd2a234baf78d3cb4c Mon Sep 17 00:00:00 2001 From: Jarek Danielak Date: Fri, 14 Feb 2025 17:50:51 +0100 Subject: [PATCH] feat: add `ad-hoc-sub-process` rule Verify that an ad-hoc sub-process is valid: * Must not contain start or end events. * Every intermediate event must have an outgoing sequence flow. Related to https://github.com/camunda/camunda-modeler/issues/4811 --- config/all.js | 1 + config/recommended.js | 1 + docs/rules/README.md | 1 + docs/rules/ad-hoc-sub-process.md | 20 +++ .../examples/ad-hoc-sub-process-correct.bpmn | 62 ++++++++++ .../examples/ad-hoc-sub-process-correct.png | Bin 0 -> 33038 bytes .../ad-hoc-sub-process-incorrect.bpmn | 70 +++++++++++ .../examples/ad-hoc-sub-process-incorrect.png | Bin 0 -> 37433 bytes rules/ad-hoc-sub-process.js | 45 +++++++ .../compilation/test/bpmnlintrc.expected.js | 117 +++++++++--------- test/rules/ad-hoc-sub-process.mjs | 50 ++++++++ .../invalid-intermediate.bpmn | 24 ++++ .../ad-hoc-sub-process/invalid-start-end.bpmn | 22 ++++ test/rules/ad-hoc-sub-process/valid.bpmn | 53 ++++++++ 14 files changed, 410 insertions(+), 56 deletions(-) create mode 100644 docs/rules/ad-hoc-sub-process.md create mode 100644 docs/rules/examples/ad-hoc-sub-process-correct.bpmn create mode 100644 docs/rules/examples/ad-hoc-sub-process-correct.png create mode 100644 docs/rules/examples/ad-hoc-sub-process-incorrect.bpmn create mode 100644 docs/rules/examples/ad-hoc-sub-process-incorrect.png create mode 100644 rules/ad-hoc-sub-process.js create mode 100644 test/rules/ad-hoc-sub-process.mjs create mode 100644 test/rules/ad-hoc-sub-process/invalid-intermediate.bpmn create mode 100644 test/rules/ad-hoc-sub-process/invalid-start-end.bpmn create mode 100644 test/rules/ad-hoc-sub-process/valid.bpmn diff --git a/config/all.js b/config/all.js index 1a54780..e18d76c 100644 --- a/config/all.js +++ b/config/all.js @@ -1,4 +1,5 @@ const allRules = [ + 'ad-hoc-sub-process', 'conditional-flows', 'end-event-required', 'event-sub-process-typed-start-event', diff --git a/config/recommended.js b/config/recommended.js index d9fbe9a..d8cc9a1 100644 --- a/config/recommended.js +++ b/config/recommended.js @@ -1,5 +1,6 @@ module.exports = { rules: { + 'ad-hoc-sub-process': 'error', 'conditional-flows': 'error', 'end-event-required': 'error', 'event-sub-process-typed-start-event': 'error', diff --git a/docs/rules/README.md b/docs/rules/README.md index 342ada4..30537a1 100644 --- a/docs/rules/README.md +++ b/docs/rules/README.md @@ -2,6 +2,7 @@ This library implements the following lint rules: +* [Ad-Hoc Sub-Process](./ad-hoc-sub-process.md) * [Conditional Flows](./conditional-flows.md) * [End Event Required](./end-event-required.md) * [Event Sub-Process Typed Start Event](./event-sub-process-typed-start-event.md) diff --git a/docs/rules/ad-hoc-sub-process.md b/docs/rules/ad-hoc-sub-process.md new file mode 100644 index 0000000..1ce397f --- /dev/null +++ b/docs/rules/ad-hoc-sub-process.md @@ -0,0 +1,20 @@ +# Ad-hoc Sub-Process (ad-hoc-sub-process) + +Ensure that an Ad-Hoc Sub-Process is valid according to the BPMN specification: + +- Must not contain start or end events. +- Every intermediate event must have an outgoing sequence flow. + + +Example of __incorrect__ usage for this rule: + +![Incorrect usage example](./examples/ad-hoc-sub-process-incorrect.png) + +Cf. [`ad-hoc-sub-process-incorrect.bpmn`](./examples/no-complex-gateway-incorrect.bpmn). + + +Example of __correct__ usage for this rule: + +![Correct usage example](./examples/ad-hoc-sub-process-correct.png) + +Cf. [`ad-hoc-sub-process-correct.bpmn`](./examples/no-complex-gateway-correct.bpmn). diff --git a/docs/rules/examples/ad-hoc-sub-process-correct.bpmn b/docs/rules/examples/ad-hoc-sub-process-correct.bpmn new file mode 100644 index 0000000..240e40e --- /dev/null +++ b/docs/rules/examples/ad-hoc-sub-process-correct.bpmn @@ -0,0 +1,62 @@ + + + + + + Flow_0ki1200 + + + + Flow_0togudw + + + + Flow_0togudw + + + + + Flow_0ki1200 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/rules/examples/ad-hoc-sub-process-correct.png b/docs/rules/examples/ad-hoc-sub-process-correct.png new file mode 100644 index 0000000000000000000000000000000000000000..0d8882326553432caa735962c6fe8e95fb730075 GIT binary patch literal 33038 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 z%0D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

CQ6Jfj6t)HWMFm5p1t&qwCoV7e%^F@ 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 + + + + + + + + + Flow_0w1fi7u + Flow_10hamq6 + + + Flow_0w1fi7u + + + + Flow_10hamq6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/rules/examples/ad-hoc-sub-process-incorrect.png b/docs/rules/examples/ad-hoc-sub-process-incorrect.png new file mode 100644 index 0000000000000000000000000000000000000000..f9bc94e47b08757575ce785336e42f96d3367452 GIT binary patch literal 37433 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 B)Aj%W literal 0 HcmV?d00001 diff --git a/rules/ad-hoc-sub-process.js b/rules/ad-hoc-sub-process.js new file mode 100644 index 0000000..791dc71 --- /dev/null +++ b/rules/ad-hoc-sub-process.js @@ -0,0 +1,45 @@ +const { + is, + isAny +} = require('bpmnlint-utils'); + +/** + * A rule that ensures that an Ad Hoc Sub Process is valid according to the BPMN spec: + * + * - No start or end events + * - Every intermediate event has an outgoing sequence flow + */ +module.exports = function() { + + function check(node, reporter) { + + if (!is(node, 'bpmn:AdHocSubProcess')) { + return; + } + + const flowElements = node.flowElements || []; + + flowElements.forEach(function(flowElement) { + + if (is(flowElement, 'bpmn:StartEvent')) { + reporter.report(flowElement.id, 'A is not allowed in '); + } + + if (is(flowElement, 'bpmn:EndEvent')) { + reporter.report(flowElement.id, 'An is not allowed in '); + } + + if (isAny(flowElement, [ 'bpmn:IntermediateCatchEvent', 'bpmn:IntermediateThrowEvent' ])) { + if (!flowElement.outgoing || flowElement.outgoing.length === 0) { + reporter.report(flowElement.id, 'An intermediate event inside must have an outgoing sequence flow'); + } + } + + }); + } + + return { + check + }; + +}; \ No newline at end of file diff --git a/test/integration/compilation/test/bpmnlintrc.expected.js b/test/integration/compilation/test/bpmnlintrc.expected.js index a53770e..0144c83 100644 --- a/test/integration/compilation/test/bpmnlintrc.expected.js +++ b/test/integration/compilation/test/bpmnlintrc.expected.js @@ -29,6 +29,7 @@ Resolver.prototype.resolveConfig = function(pkg, configName) { const resolver = new Resolver(); const rules = { + "ad-hoc-sub-process": "error", "conditional-flows": "error", "end-event-required": "error", "event-sub-process-typed-start-event": "error", @@ -72,114 +73,118 @@ export { resolver, config }; export default bundle; -import rule_0 from 'bpmnlint/rules/conditional-flows'; +import rule_0 from 'bpmnlint/rules/ad-hoc-sub-process'; -cache['bpmnlint/conditional-flows'] = rule_0; +cache['bpmnlint/ad-hoc-sub-process'] = rule_0; -import rule_1 from 'bpmnlint/rules/end-event-required'; +import rule_1 from 'bpmnlint/rules/conditional-flows'; -cache['bpmnlint/end-event-required'] = rule_1; +cache['bpmnlint/conditional-flows'] = rule_1; -import rule_2 from 'bpmnlint/rules/event-sub-process-typed-start-event'; +import rule_2 from 'bpmnlint/rules/end-event-required'; -cache['bpmnlint/event-sub-process-typed-start-event'] = rule_2; +cache['bpmnlint/end-event-required'] = rule_2; -import rule_3 from 'bpmnlint/rules/fake-join'; +import rule_3 from 'bpmnlint/rules/event-sub-process-typed-start-event'; -cache['bpmnlint/fake-join'] = rule_3; +cache['bpmnlint/event-sub-process-typed-start-event'] = rule_3; -import rule_4 from 'bpmnlint/rules/global'; +import rule_4 from 'bpmnlint/rules/fake-join'; -cache['bpmnlint/global'] = rule_4; +cache['bpmnlint/fake-join'] = rule_4; -import rule_5 from 'bpmnlint/rules/label-required'; +import rule_5 from 'bpmnlint/rules/global'; -cache['bpmnlint/label-required'] = rule_5; +cache['bpmnlint/global'] = rule_5; -import rule_6 from 'bpmnlint/rules/link-event'; +import rule_6 from 'bpmnlint/rules/label-required'; -cache['bpmnlint/link-event'] = rule_6; +cache['bpmnlint/label-required'] = rule_6; -import rule_7 from 'bpmnlint/rules/no-bpmndi'; +import rule_7 from 'bpmnlint/rules/link-event'; -cache['bpmnlint/no-bpmndi'] = rule_7; +cache['bpmnlint/link-event'] = rule_7; -import rule_8 from 'bpmnlint/rules/no-complex-gateway'; +import rule_8 from 'bpmnlint/rules/no-bpmndi'; -cache['bpmnlint/no-complex-gateway'] = rule_8; +cache['bpmnlint/no-bpmndi'] = rule_8; -import rule_9 from 'bpmnlint/rules/no-disconnected'; +import rule_9 from 'bpmnlint/rules/no-complex-gateway'; -cache['bpmnlint/no-disconnected'] = rule_9; +cache['bpmnlint/no-complex-gateway'] = rule_9; -import rule_10 from 'bpmnlint/rules/no-duplicate-sequence-flows'; +import rule_10 from 'bpmnlint/rules/no-disconnected'; -cache['bpmnlint/no-duplicate-sequence-flows'] = rule_10; +cache['bpmnlint/no-disconnected'] = rule_10; -import rule_11 from 'bpmnlint/rules/no-gateway-join-fork'; +import rule_11 from 'bpmnlint/rules/no-duplicate-sequence-flows'; -cache['bpmnlint/no-gateway-join-fork'] = rule_11; +cache['bpmnlint/no-duplicate-sequence-flows'] = rule_11; -import rule_12 from 'bpmnlint/rules/no-implicit-split'; +import rule_12 from 'bpmnlint/rules/no-gateway-join-fork'; -cache['bpmnlint/no-implicit-split'] = rule_12; +cache['bpmnlint/no-gateway-join-fork'] = rule_12; -import rule_13 from 'bpmnlint/rules/no-implicit-end'; +import rule_13 from 'bpmnlint/rules/no-implicit-split'; -cache['bpmnlint/no-implicit-end'] = rule_13; +cache['bpmnlint/no-implicit-split'] = rule_13; -import rule_14 from 'bpmnlint/rules/no-implicit-start'; +import rule_14 from 'bpmnlint/rules/no-implicit-end'; -cache['bpmnlint/no-implicit-start'] = rule_14; +cache['bpmnlint/no-implicit-end'] = rule_14; -import rule_15 from 'bpmnlint/rules/no-inclusive-gateway'; +import rule_15 from 'bpmnlint/rules/no-implicit-start'; -cache['bpmnlint/no-inclusive-gateway'] = rule_15; +cache['bpmnlint/no-implicit-start'] = rule_15; -import rule_16 from 'bpmnlint/rules/no-overlapping-elements'; +import rule_16 from 'bpmnlint/rules/no-inclusive-gateway'; -cache['bpmnlint/no-overlapping-elements'] = rule_16; +cache['bpmnlint/no-inclusive-gateway'] = rule_16; -import rule_17 from 'bpmnlint/rules/single-blank-start-event'; +import rule_17 from 'bpmnlint/rules/no-overlapping-elements'; -cache['bpmnlint/single-blank-start-event'] = rule_17; +cache['bpmnlint/no-overlapping-elements'] = rule_17; -import rule_18 from 'bpmnlint/rules/single-event-definition'; +import rule_18 from 'bpmnlint/rules/single-blank-start-event'; -cache['bpmnlint/single-event-definition'] = rule_18; +cache['bpmnlint/single-blank-start-event'] = rule_18; -import rule_19 from 'bpmnlint/rules/start-event-required'; +import rule_19 from 'bpmnlint/rules/single-event-definition'; -cache['bpmnlint/start-event-required'] = rule_19; +cache['bpmnlint/single-event-definition'] = rule_19; -import rule_20 from 'bpmnlint/rules/sub-process-blank-start-event'; +import rule_20 from 'bpmnlint/rules/start-event-required'; -cache['bpmnlint/sub-process-blank-start-event'] = rule_20; +cache['bpmnlint/start-event-required'] = rule_20; -import rule_21 from 'bpmnlint/rules/superfluous-gateway'; +import rule_21 from 'bpmnlint/rules/sub-process-blank-start-event'; -cache['bpmnlint/superfluous-gateway'] = rule_21; +cache['bpmnlint/sub-process-blank-start-event'] = rule_21; -import rule_22 from 'bpmnlint/rules/superfluous-termination'; +import rule_22 from 'bpmnlint/rules/superfluous-gateway'; -cache['bpmnlint/superfluous-termination'] = rule_22; +cache['bpmnlint/superfluous-gateway'] = rule_22; -import rule_23 from 'bpmnlint-plugin-test/rules/no-label-foo'; +import rule_23 from 'bpmnlint/rules/superfluous-termination'; -cache['bpmnlint-plugin-test/no-label-foo'] = rule_23; +cache['bpmnlint/superfluous-termination'] = rule_23; -import rule_24 from 'bpmnlint-plugin-exported/src/foo'; +import rule_24 from 'bpmnlint-plugin-test/rules/no-label-foo'; -cache['bpmnlint-plugin-exported/foo'] = rule_24; +cache['bpmnlint-plugin-test/no-label-foo'] = rule_24; -import rule_25 from 'bpmnlint-plugin-exported/src/bar'; +import rule_25 from 'bpmnlint-plugin-exported/src/foo'; -cache['bpmnlint-plugin-exported/bar'] = rule_25; +cache['bpmnlint-plugin-exported/foo'] = rule_25; -import rule_26 from 'bpmnlint-plugin-exported/rules/baz'; +import rule_26 from 'bpmnlint-plugin-exported/src/bar'; -cache['bpmnlint-plugin-exported/baz'] = rule_26; +cache['bpmnlint-plugin-exported/bar'] = rule_26; -import rule_27 from 'bpmnlint-plugin-exported/src/foo'; +import rule_27 from 'bpmnlint-plugin-exported/rules/baz'; -cache['bpmnlint-plugin-exported/foo-absolute'] = rule_27; \ No newline at end of file +cache['bpmnlint-plugin-exported/baz'] = rule_27; + +import rule_28 from 'bpmnlint-plugin-exported/src/foo'; + +cache['bpmnlint-plugin-exported/foo-absolute'] = rule_28; \ No newline at end of file diff --git a/test/rules/ad-hoc-sub-process.mjs b/test/rules/ad-hoc-sub-process.mjs new file mode 100644 index 0000000..06221fd --- /dev/null +++ b/test/rules/ad-hoc-sub-process.mjs @@ -0,0 +1,50 @@ +import RuleTester from '../../lib/testers/rule-tester.js'; + +import rule from '../../rules/ad-hoc-sub-process.js'; + +import { + readModdle +} from '../../lib/testers/helper.js'; + +import { stubCJS } from '../helper.mjs'; + +const { + __dirname +} = stubCJS(import.meta.url); + + +RuleTester.verify('ad-hoc-sub-process', rule, { + valid: [ + { + moddleElement: readModdle(__dirname + '/ad-hoc-sub-process/valid.bpmn') + } + ], + invalid: [ + { + moddleElement: readModdle(__dirname + '/ad-hoc-sub-process/invalid-start-end.bpmn'), + report: [ + { + id: 'StartEvent', + message: 'A is not allowed in ' + }, + { + id: 'EndEvent', + message: 'An is not allowed in ' + } + ] + }, + { + moddleElement: readModdle(__dirname + '/ad-hoc-sub-process/invalid-intermediate.bpmn'), + report: [ + { + id: 'ThrowEvent', + message: 'An intermediate event inside must have an outgoing sequence flow' + }, + { + id: 'CatchEvent', + message: 'An intermediate event inside must have an outgoing sequence flow' + } + ] + } + ] +}); \ No newline at end of file diff --git a/test/rules/ad-hoc-sub-process/invalid-intermediate.bpmn b/test/rules/ad-hoc-sub-process/invalid-intermediate.bpmn new file mode 100644 index 0000000..416bf56 --- /dev/null +++ b/test/rules/ad-hoc-sub-process/invalid-intermediate.bpmn @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/rules/ad-hoc-sub-process/invalid-start-end.bpmn b/test/rules/ad-hoc-sub-process/invalid-start-end.bpmn new file mode 100644 index 0000000..05f2b90 --- /dev/null +++ b/test/rules/ad-hoc-sub-process/invalid-start-end.bpmn @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/rules/ad-hoc-sub-process/valid.bpmn b/test/rules/ad-hoc-sub-process/valid.bpmn new file mode 100644 index 0000000..1a98ade --- /dev/null +++ b/test/rules/ad-hoc-sub-process/valid.bpmn @@ -0,0 +1,53 @@ + + + + + + Flow_1h8yyeu + + + + Flow_0wahprq + + + Flow_1h8yyeu + + + Flow_0wahprq + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +