@onify/flow-extensions 4.0.0 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,6 +1,10 @@
1
1
  Changelog
2
2
  =========
3
3
 
4
+ # 4.1.0
5
+
6
+ - Support sequence flow properties and take execution listener. Requires `bpmn-elements >= 9.2`
7
+
4
8
  # 4.0.0
5
9
 
6
10
  - make sure sub-process extensions are only triggered once. Sub process activities unintentionally trigger formatting since events bubble
package/README.md CHANGED
@@ -120,3 +120,92 @@ function getModdleContext(source, options) {
120
120
  return bpmnModdle.fromXML(Buffer.isBuffer(source) ? source.toString() : source.trim());
121
121
  }
122
122
  ```
123
+
124
+ ## Extend sequence flow with properties and take listeners
125
+
126
+ ```js
127
+ const {OnifySequenceFlow, extensions} = require('@onify/flow-extensions');
128
+ const FlowScripts = require('@onify/flow-extensions/dist/src/FlowScripts');
129
+ const {Engine} = require('bpmn-engine');
130
+ const Elements = require('bpmn-elements');
131
+
132
+ const source = `
133
+ <?xml version="1.0" encoding="UTF-8"?>
134
+ <definitions
135
+ id="Def_0"
136
+ xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
137
+ xmlns:camunda="http://camunda.org/schema/1.0/bpmn"
138
+ targetNamespace="http://bpmn.io/schema/bpmn">
139
+ <process id="Process_1kk79yr" isExecutable="true">
140
+ <startEvent id="start" />
141
+ <sequenceFlow id="to-script" sourceRef="start" targetRef="script">
142
+ <extensionElements>
143
+ <camunda:properties>
144
+ <camunda:property name="source" value="\${content.id}" />
145
+ </camunda:properties>
146
+ <camunda:executionListener event="take">
147
+ <camunda:script scriptFormat="js">environment.output.fields = listener.fields; next();</camunda:script>
148
+ <camunda:field name="taken">
149
+ <camunda:expression>\${true}</camunda:expression>
150
+ </camunda:field>
151
+ <camunda:field name="bar">
152
+ <camunda:string>baz</camunda:string>
153
+ </camunda:field>
154
+ </camunda:executionListener>
155
+ </extensionElements>
156
+ </sequenceFlow>
157
+ <sequenceFlow id="to-end" sourceRef="script" targetRef="end">
158
+ <extensionElements>
159
+ <camunda:properties>
160
+ <camunda:property name="foo" value="bar" />
161
+ </camunda:properties>
162
+ </extensionElements>
163
+ </sequenceFlow>
164
+ <scriptTask id="script" name="script" scriptFormat="js">
165
+ <script>next(null, { foo: environment.variables.required.input });</script>
166
+ </scriptTask>
167
+ <boundaryEvent id="catch-err" attachedToRef="script">
168
+ <errorEventDefinition />
169
+ </boundaryEvent>
170
+ <endEvent id="end-err">
171
+ <extensionElements>
172
+ <camunda:executionListener event="start">
173
+ <camunda:script scriptFormat="js">
174
+ environment.output.failedBy = content.inbound[0].properties.error;
175
+ if (next) next();
176
+ </camunda:script>
177
+ </camunda:executionListener>
178
+ </extensionElements>
179
+ </endEvent>
180
+ <sequenceFlow id="to-end-err" sourceRef="catch-err" targetRef="end-err">
181
+ <extensionElements>
182
+ <camunda:properties>
183
+ <camunda:property name="error" value="\${content.output}" />
184
+ </camunda:properties>
185
+ </extensionElements>
186
+ </sequenceFlow>
187
+ <endEvent id="end" />
188
+ </process>
189
+ </definitions>`;
190
+
191
+ const engine = new Engine({
192
+ name: 'sequence flow extension',
193
+ source,
194
+ moddleOptions: {
195
+ camunda: require('camunda-bpmn-moddle/resources/camunda.json'),
196
+ },
197
+ extensions: {
198
+ onify: extensions,
199
+ },
200
+ scripts: new FlowScripts('sequence flow extension'),
201
+ elements: {
202
+ ...Elements,
203
+ SequenceFlow: OnifySequenceFlow,
204
+ },
205
+ });
206
+
207
+ engine.execute((err, instance) => {
208
+ if (err) throw err;
209
+ console.log(instance.name, instance.environment.output);
210
+ });
211
+ ```
package/dist/index.js CHANGED
@@ -3,10 +3,17 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ Object.defineProperty(exports, "OnifySequenceFlow", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _OnifySequenceFlow.OnifySequenceFlow;
10
+ }
11
+ });
6
12
  exports.extendFn = extendFn;
7
13
  exports.extensions = extensions;
8
14
  var _OnifyProcessExtensions = require("./src/OnifyProcessExtensions.js");
9
15
  var _OnifyElementExtensions = require("./src/OnifyElementExtensions.js");
16
+ var _OnifySequenceFlow = require("./src/OnifySequenceFlow.js");
10
17
  function extensions(element, context) {
11
18
  if (element.type === 'bpmn:Process') return new _OnifyProcessExtensions.OnifyProcessExtensions(element, context);
12
19
  return new _OnifyElementExtensions.OnifyElementExtensions(element, context);
@@ -62,6 +62,8 @@ class ScriptListener extends Listener {
62
62
  id: this.id,
63
63
  resolveExpression
64
64
  });
65
+ const listenerFields = this._getFields(environment, scope);
66
+ if (listenerFields) scope.listener.fields = listenerFields;
65
67
  const script = this.environment.scripts.getScript(this.extension.scriptFormat, {
66
68
  id: this.id
67
69
  });
@@ -109,23 +111,27 @@ class ExecutionListeners {
109
111
  this.activity = activity;
110
112
  this.context = context;
111
113
  this.listeners = [];
112
- this.onStart = false;
113
- this.onEnd = false;
114
114
  }
115
115
  get length() {
116
116
  return this.listeners.length;
117
117
  }
118
+ get onStart() {
119
+ return this.listeners.some(l => l.event === 'start');
120
+ }
121
+ get onEnd() {
122
+ return this.listeners.some(l => l.event === 'end');
123
+ }
124
+ get onTake() {
125
+ return this.listeners.some(l => l.event === 'take');
126
+ }
118
127
  add(extension, pos) {
119
128
  const {
120
- event,
121
129
  script,
122
130
  expression
123
131
  } = extension;
124
132
  if (!script && !expression) return;
125
133
  const list = this.listeners;
126
134
  if (script && (script.value || script.resource)) list.push(new ScriptListener(this.activity, this.context, extension, pos));else if (expression) list.push(new ExpressionListener(this.activity, this.context, extension));
127
- if (event === 'start') this.onStart = true;
128
- if (event === 'end') this.onEnd = true;
129
135
  }
130
136
  async execute(event, message) {
131
137
  const found = this.listeners.filter(l => l.event === event);
@@ -80,7 +80,7 @@ FlowScripts.prototype.register = function register({
80
80
  resource = behaviour.resource;
81
81
  }
82
82
  }
83
- if (!language) language = 'javascript';
83
+ if (!language) return;
84
84
  if (!['js', 'javascript'].includes(language.toLowerCase().trim())) return;
85
85
  language = 'javascript';
86
86
  const name = this._name;
@@ -20,6 +20,7 @@ class OnifyElementExtensions {
20
20
  const activity = this.activity;
21
21
  const broker = activity.broker;
22
22
  const formatQ = activity.broker.getQueue('format-run-q');
23
+ const executionListeners = this.extensions.listeners;
23
24
  if (message.fields.redelivered && message.fields.routingKey === 'run.start') {
24
25
  activity.on('start', elementApi => {
25
26
  this._formatOnEnter(broker, formatQ, elementApi);
@@ -59,7 +60,6 @@ class OnifyElementExtensions {
59
60
  }, {
60
61
  consumerTag: '_onify-extension-on-executed'
61
62
  });
62
- const executionListeners = this.extensions.listeners;
63
63
  if (executionListeners !== null && executionListeners !== void 0 && executionListeners.onStart) {
64
64
  activity.on('start', async elementApi => {
65
65
  if (activity.isSubProcess && activity.id !== elementApi.id) return;
@@ -211,11 +211,12 @@ class OnifyElementExtensions {
211
211
  assignToOutput,
212
212
  resultVariable
213
213
  } = elementApi.content;
214
- if (output === undefined || output === null) return result;
215
- if (assignToOutput && typeof output === 'object') {
216
- Object.assign(this.activity.environment.output, output);
217
- } else if (resultVariable) {
218
- elementApi.environment.output[resultVariable] = output;
214
+ if (output !== undefined && output !== null) {
215
+ if (assignToOutput && typeof output === 'object') {
216
+ Object.assign(this.activity.environment.output, output);
217
+ } else if (resultVariable) {
218
+ elementApi.environment.output[resultVariable] = output;
219
+ }
219
220
  }
220
221
  return result;
221
222
  }
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.OnifySequenceFlow = void 0;
7
+ var _bpmnElements = require("bpmn-elements");
8
+ var _getExtensions = require("./getExtensions.js");
9
+ class OnifySequenceFlow extends _bpmnElements.SequenceFlow {
10
+ constructor(flowDef, context) {
11
+ super(flowDef, context);
12
+ this.extensions = (0, _getExtensions.getExtensions)(this, context);
13
+ this._activate();
14
+ }
15
+ _activate() {
16
+ var _this$extensions$list;
17
+ if (!((_this$extensions$list = this.extensions.listeners) !== null && _this$extensions$list !== void 0 && _this$extensions$list.onTake)) return;
18
+ this.broker.subscribeTmp('event', 'flow.take', (_, msg) => {
19
+ this._executeListeners(msg);
20
+ }, {
21
+ noAck: true,
22
+ consumerTag: '_onify-execution-listener'
23
+ });
24
+ }
25
+ async _executeListeners(message) {
26
+ try {
27
+ await this.extensions.listeners.execute('take', message);
28
+ } catch (err) {
29
+ this.logger.error(`<${this.id}> execution listener error: ${err}`);
30
+ }
31
+ }
32
+ evaluate(fromMessage, callback) {
33
+ const properties = this.extensions.properties;
34
+ if (!properties) return super.evaluate(fromMessage, callback);
35
+ super.evaluate(fromMessage, (err, result) => {
36
+ if (err) return callback(err);
37
+ try {
38
+ let overriddenResult = result ? {} : false;
39
+ if (result) {
40
+ overriddenResult = {
41
+ ...(typeof result === 'object' && result),
42
+ properties: properties.resolve(this.getApi(fromMessage))
43
+ };
44
+ }
45
+ return callback(err, overriddenResult);
46
+ } catch (formatErr) {
47
+ return callback(formatErr);
48
+ }
49
+ });
50
+ }
51
+ }
52
+ exports.OnifySequenceFlow = OnifySequenceFlow;
@@ -14,39 +14,47 @@ var _ServiceExpression = _interopRequireDefault(require("./ServiceExpression.js"
14
14
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
15
  function getExtensions(element, context) {
16
16
  var _element$behaviour$ex, _ext$values, _ext$fields;
17
- const result = {
18
- format: element.type === 'bpmn:Process' ? new _formatters.FormatProcess(element) : new _formatters.FormatActivity(element)
19
- };
17
+ const result = {};
18
+ switch (element.type) {
19
+ case 'bpmn:SequenceFlow':
20
+ break;
21
+ case 'bpmn:Process':
22
+ result.format = new _formatters.FormatProcess(element);
23
+ break;
24
+ default:
25
+ result.format = new _formatters.FormatActivity(element);
26
+ }
27
+ let listenerPosition = 0;
28
+ const listeners = new _ExecutionListeners.default(element, context);
20
29
  const expression = element.behaviour.expression;
21
30
  if (expression) result.Service = _ServiceExpression.default;
22
31
  const extensions = (_element$behaviour$ex = element.behaviour.extensionElements) === null || _element$behaviour$ex === void 0 ? void 0 : _element$behaviour$ex.values;
23
- if (!extensions) return result;
24
- const listeners = new _ExecutionListeners.default(element, context);
25
- let listener = 0;
26
- for (const ext of extensions) {
27
- switch (ext.$type) {
28
- case 'camunda:Properties':
29
- if ((_ext$values = ext.values) !== null && _ext$values !== void 0 && _ext$values.length) result.properties = new _IOProperties.default(element, ext);
30
- break;
31
- case 'camunda:InputOutput':
32
- result.io = new _IO.InputOutput(element.id, ext, context);
33
- break;
34
- case 'camunda:FormData':
35
- if ((_ext$fields = ext.fields) !== null && _ext$fields !== void 0 && _ext$fields.length) result.form = new _IOForm.default(element, ext);
36
- break;
37
- case 'camunda:Connector':
38
- {
39
- const {
40
- connectorId,
41
- inputOutput
42
- } = ext;
43
- const io = inputOutput && new _IO.InputOutput(`${element.id}/${ext.$type.toLowerCase()}`, inputOutput, context);
44
- result.Service = _Connector.default.bind(_Connector.default, connectorId, io);
32
+ if (extensions) {
33
+ for (const ext of extensions) {
34
+ switch (ext.$type) {
35
+ case 'camunda:Properties':
36
+ if ((_ext$values = ext.values) !== null && _ext$values !== void 0 && _ext$values.length) result.properties = new _IOProperties.default(element, ext);
37
+ break;
38
+ case 'camunda:InputOutput':
39
+ result.io = new _IO.InputOutput(element.id, ext, context);
40
+ break;
41
+ case 'camunda:FormData':
42
+ if ((_ext$fields = ext.fields) !== null && _ext$fields !== void 0 && _ext$fields.length) result.form = new _IOForm.default(element, ext);
43
+ break;
44
+ case 'camunda:Connector':
45
+ {
46
+ const {
47
+ connectorId,
48
+ inputOutput
49
+ } = ext;
50
+ const io = inputOutput && new _IO.InputOutput(`${element.id}/${ext.$type.toLowerCase()}`, inputOutput, context);
51
+ result.Service = _Connector.default.bind(_Connector.default, connectorId, io);
52
+ break;
53
+ }
54
+ case 'camunda:ExecutionListener':
55
+ listeners.add(ext, listenerPosition++);
45
56
  break;
46
- }
47
- case 'camunda:ExecutionListener':
48
- listeners.add(ext, listener++);
49
- break;
57
+ }
50
58
  }
51
59
  }
52
60
  if (listeners.length) result.listeners = listeners;
package/index.js CHANGED
@@ -1,9 +1,11 @@
1
1
  import {OnifyProcessExtensions} from './src/OnifyProcessExtensions.js';
2
2
  import {OnifyElementExtensions} from './src/OnifyElementExtensions.js';
3
+ import {OnifySequenceFlow} from './src/OnifySequenceFlow.js';
3
4
 
4
5
  export {
5
6
  extensions,
6
7
  extendFn,
8
+ OnifySequenceFlow,
7
9
  };
8
10
 
9
11
  function extensions(element, context) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onify/flow-extensions",
3
- "version": "4.0.0",
3
+ "version": "4.1.0",
4
4
  "description": "Onify Flow extensions",
5
5
  "module": "index.js",
6
6
  "main": "dist/index.js",
@@ -35,26 +35,26 @@
35
35
  "license": "MIT",
36
36
  "devDependencies": {
37
37
  "@aircall/expression-parser": "^1.0.4",
38
- "@babel/cli": "^7.20.7",
39
- "@babel/core": "^7.20.12",
40
- "@babel/preset-env": "^7.20.2",
41
- "@babel/register": "^7.18.9",
38
+ "@babel/cli": "^7.21.5",
39
+ "@babel/core": "^7.21.5",
40
+ "@babel/preset-env": "^7.21.5",
41
+ "@babel/register": "^7.21.0",
42
42
  "bpmn-elements-8-1": "npm:bpmn-elements@8.1",
43
- "bpmn-engine": "^15.1.2",
43
+ "bpmn-engine": "^16.0.0",
44
44
  "bpmn-engine-14": "npm:bpmn-engine@14",
45
- "bpmn-moddle": "^7.1.3",
46
- "c8": "^7.12.0",
45
+ "bpmn-moddle": "^8.0.1",
46
+ "c8": "^7.13.0",
47
47
  "camunda-bpmn-moddle": "^7.0.1",
48
48
  "chai": "^4.3.7",
49
- "chronokinesis": "^4.0.1",
49
+ "chronokinesis": "^5.0.2",
50
50
  "debug": "^4.3.4",
51
- "eslint": "^8.32.0",
51
+ "eslint": "^8.39.0",
52
52
  "mocha": "^10.2.0",
53
53
  "mocha-cakes-2": "^3.3.0",
54
- "moddle-context-serializer": "^3.1.1"
54
+ "moddle-context-serializer": "^3.2.2"
55
55
  },
56
56
  "dependencies": {
57
- "cron-parser": "^4.7.1"
57
+ "cron-parser": "^4.8.1"
58
58
  },
59
59
  "files": [
60
60
  "src",
@@ -49,6 +49,8 @@ class ScriptListener extends Listener {
49
49
  execute(api) {
50
50
  const environment = this.environment;
51
51
  const scope = this._getScope(api, {id: this.id, resolveExpression});
52
+ const listenerFields = this._getFields(environment, scope);
53
+ if (listenerFields) scope.listener.fields = listenerFields;
52
54
  const script = this.environment.scripts.getScript(this.extension.scriptFormat, {id: this.id});
53
55
 
54
56
  return new Promise((resolve, reject) => {
@@ -97,22 +99,26 @@ export default class ExecutionListeners {
97
99
  this.activity = activity;
98
100
  this.context = context;
99
101
  this.listeners = [];
100
- this.onStart = false;
101
- this.onEnd = false;
102
102
  }
103
103
  get length() {
104
104
  return this.listeners.length;
105
105
  }
106
+ get onStart() {
107
+ return this.listeners.some((l) => l.event === 'start');
108
+ }
109
+ get onEnd() {
110
+ return this.listeners.some((l) => l.event === 'end');
111
+ }
112
+ get onTake() {
113
+ return this.listeners.some((l) => l.event === 'take');
114
+ }
106
115
  add(extension, pos) {
107
- const {event, script, expression} = extension;
116
+ const {script, expression} = extension;
108
117
  if (!script && !expression) return;
109
118
 
110
119
  const list = this.listeners;
111
120
  if (script && (script.value || script.resource)) list.push(new ScriptListener(this.activity, this.context, extension, pos));
112
121
  else if (expression) list.push(new ExpressionListener(this.activity, this.context, extension));
113
-
114
- if (event === 'start') this.onStart = true;
115
- if (event === 'end') this.onEnd = true;
116
122
  }
117
123
  async execute(event, message) {
118
124
  const found = this.listeners.filter((l) => l.event === event);
@@ -13,6 +13,7 @@ export class OnifyElementExtensions {
13
13
  const activity = this.activity;
14
14
  const broker = activity.broker;
15
15
  const formatQ = activity.broker.getQueue('format-run-q');
16
+ const executionListeners = this.extensions.listeners;
16
17
 
17
18
  if (message.fields.redelivered && message.fields.routingKey === 'run.start') {
18
19
  activity.on('start', (elementApi) => {
@@ -38,7 +39,6 @@ export class OnifyElementExtensions {
38
39
  broker.publish('format', 'run.end.complete', {...format}, {persistent: false});
39
40
  }, {consumerTag: '_onify-extension-on-executed'});
40
41
 
41
- const executionListeners = this.extensions.listeners;
42
42
  if (executionListeners?.onStart) {
43
43
  activity.on('start', async (elementApi) => {
44
44
  if (activity.isSubProcess && activity.id !== elementApi.id) return;
@@ -137,12 +137,12 @@ export class OnifyElementExtensions {
137
137
 
138
138
  const {output, assignToOutput, resultVariable} = elementApi.content;
139
139
 
140
- if (output === undefined || output === null) return result;
141
-
142
- if (assignToOutput && typeof output === 'object') {
143
- Object.assign(this.activity.environment.output, output);
144
- } else if (resultVariable) {
145
- elementApi.environment.output[resultVariable] = output;
140
+ if (output !== undefined && output !== null) {
141
+ if (assignToOutput && typeof output === 'object') {
142
+ Object.assign(this.activity.environment.output, output);
143
+ } else if (resultVariable) {
144
+ elementApi.environment.output[resultVariable] = output;
145
+ }
146
146
  }
147
147
 
148
148
  return result;
@@ -0,0 +1,45 @@
1
+ import {SequenceFlow} from 'bpmn-elements';
2
+ import {getExtensions} from './getExtensions.js';
3
+
4
+ export class OnifySequenceFlow extends SequenceFlow {
5
+ constructor(flowDef, context) {
6
+ super(flowDef, context);
7
+ this.extensions = getExtensions(this, context);
8
+ this._activate();
9
+ }
10
+ _activate() {
11
+ if (!this.extensions.listeners?.onTake) return;
12
+
13
+ this.broker.subscribeTmp('event', 'flow.take', (_, msg) => {
14
+ this._executeListeners(msg);
15
+ }, {noAck: true, consumerTag: '_onify-execution-listener'});
16
+ }
17
+ async _executeListeners(message) {
18
+ try {
19
+ await this.extensions.listeners.execute('take', message);
20
+ } catch (err) {
21
+ this.logger.error(`<${this.id}> execution listener error: ${err}`);
22
+ }
23
+ }
24
+ evaluate(fromMessage, callback) {
25
+ const properties = this.extensions.properties;
26
+ if (!properties) return super.evaluate(fromMessage, callback);
27
+
28
+ super.evaluate(fromMessage, (err, result) => {
29
+ if (err) return callback(err);
30
+
31
+ try {
32
+ let overriddenResult = result ? {} : false;
33
+ if (result) {
34
+ overriddenResult = {
35
+ ...(typeof result === 'object' && result),
36
+ properties: properties.resolve(this.getApi(fromMessage)),
37
+ };
38
+ }
39
+ return callback(err, overriddenResult);
40
+ } catch (formatErr) {
41
+ return callback(formatErr);
42
+ }
43
+ });
44
+ }
45
+ }
@@ -7,39 +7,47 @@ import IOProperties from './IOProperties.js';
7
7
  import ServiceExpression from './ServiceExpression.js';
8
8
 
9
9
  export function getExtensions(element, context) {
10
- const result = {
11
- format: element.type === 'bpmn:Process' ? new FormatProcess(element) : new FormatActivity(element),
12
- };
10
+ const result = {};
11
+
12
+ switch (element.type) {
13
+ case 'bpmn:SequenceFlow':
14
+ break;
15
+ case 'bpmn:Process':
16
+ result.format = new FormatProcess(element);
17
+ break;
18
+ default:
19
+ result.format = new FormatActivity(element);
20
+ }
21
+
22
+ let listenerPosition = 0;
23
+ const listeners = new ExecutionListeners(element, context);
13
24
 
14
25
  const expression = element.behaviour.expression;
15
26
  if (expression) result.Service = ServiceExpression;
16
27
 
17
28
  const extensions = element.behaviour.extensionElements?.values;
18
- if (!extensions) return result;
19
-
20
- const listeners = new ExecutionListeners(element, context);
21
-
22
- let listener = 0;
23
- for (const ext of extensions) {
24
- switch (ext.$type) {
25
- case 'camunda:Properties':
26
- if (ext.values?.length) result.properties = new IOProperties(element, ext);
27
- break;
28
- case 'camunda:InputOutput':
29
- result.io = new InputOutput(element.id, ext, context);
30
- break;
31
- case 'camunda:FormData':
32
- if (ext.fields?.length) result.form = new IOForm(element, ext);
33
- break;
34
- case 'camunda:Connector': {
35
- const {connectorId, inputOutput} = ext;
36
- const io = inputOutput && new InputOutput(`${element.id}/${ext.$type.toLowerCase()}`, inputOutput, context);
37
- result.Service = Connector.bind(Connector, connectorId, io);
38
- break;
29
+ if (extensions) {
30
+ for (const ext of extensions) {
31
+ switch (ext.$type) {
32
+ case 'camunda:Properties':
33
+ if (ext.values?.length) result.properties = new IOProperties(element, ext);
34
+ break;
35
+ case 'camunda:InputOutput':
36
+ result.io = new InputOutput(element.id, ext, context);
37
+ break;
38
+ case 'camunda:FormData':
39
+ if (ext.fields?.length) result.form = new IOForm(element, ext);
40
+ break;
41
+ case 'camunda:Connector': {
42
+ const {connectorId, inputOutput} = ext;
43
+ const io = inputOutput && new InputOutput(`${element.id}/${ext.$type.toLowerCase()}`, inputOutput, context);
44
+ result.Service = Connector.bind(Connector, connectorId, io);
45
+ break;
46
+ }
47
+ case 'camunda:ExecutionListener':
48
+ listeners.add(ext, listenerPosition++);
49
+ break;
39
50
  }
40
- case 'camunda:ExecutionListener':
41
- listeners.add(ext, listener++);
42
- break;
43
51
  }
44
52
  }
45
53