@0dep/bpmn-extensions 0.0.5 → 0.0.6

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/README.md CHANGED
@@ -12,10 +12,11 @@ which covers the older `camunda:*` extension elements.
12
12
  ## Install
13
13
 
14
14
  ```sh
15
- npm install @0dep/bpmn-extensions bpmn-elements
15
+ npm install @0dep/bpmn-extensions bpmn-elements croner
16
16
  ```
17
17
 
18
- `bpmn-elements` (>= 18) is a peer dependency. Requires Node.js >= 22.
18
+ `bpmn-elements` (>= 18) and [`croner`](https://www.npmjs.com/package/croner) (cron timer cycles) are
19
+ peer dependencies. Requires Node.js >= 22.
19
20
 
20
21
  ## What it does
21
22
 
@@ -49,6 +50,10 @@ npm install @0dep/bpmn-extensions bpmn-elements
49
50
  - **`zeebe:calledElement`** — call activity target process id.
50
51
  - **`zeebe:loopCharacteristics`** — collection-based multi-instance (`inputCollection` / `inputElement`),
51
52
  sequential or parallel, with `outputElement` aggregated into the `outputCollection` array in input order.
53
+ - **Timer start events with cron** — a `TimerEventDefinition` that also parses a **cron** `timeCycle`
54
+ (`0 0 * * *`, as Camunda 8 schedules timer start events) besides ISO 8601 intervals. A top-level
55
+ timer start event's cycle is lifted onto its behaviour as `scheduledStart` by `extendFn` and exposed
56
+ on the start event content, so a scheduler can find the flows to start without running them.
52
57
  - **`zeebe:subscription`** — the referenced message's `correlationKey` is resolved when the catching
53
58
  element (receive task, message event) starts waiting, and exposed on its content as
54
59
  `subscription: { message, correlationKey }` — route an incoming message by matching it against the
@@ -61,7 +66,10 @@ npm install @0dep/bpmn-extensions bpmn-elements
61
66
  at all and run untouched; call activities and processes are always attached, since they propagate
62
67
  io across process boundaries.
63
68
  - `extendFn(behaviour)` — moddle-context-serializer behaviour extender (lifts the extension data
64
- bpmn-elements expects on the behaviour: call activity process id and multi-instance collection).
69
+ bpmn-elements expects on the behaviour: call activity process id, multi-instance collection, and a
70
+ timer start event's cycle as `scheduledStart`).
71
+ - `TimerEventDefinition` — a bpmn-elements timer event definition that accepts cron `timeCycle`s;
72
+ install it through the type resolver: `TypeResolver({ ...elements, TimerEventDefinition })`.
65
73
  - `FeelExpressions()` — a bpmn-elements `IExpressions` implementation backed by FEEL.
66
74
  - `FeelScripts()` — a bpmn-elements `scripts` implementation that runs `zeebe:script` FEEL expressions.
67
75
  - FEEL helpers: `isFeelExpression`, `stripFeel`, `evaluateFeel`, `evaluateFeelUnaryTest`, `resolveValue`,
@@ -130,6 +138,60 @@ A service task's `zeebe:taskDefinition type="charge-card"` is dispatched to the
130
138
  service named `charge-card`. Its callback result is the job's variables, which `zeebe:ioMapping`
131
139
  output parameters map back into the process.
132
140
 
141
+ ## Extract timers
142
+
143
+ List the timers of a definition without running it — e.g. to schedule flows by their timer start
144
+ event. The serializer collects every timer event definition; `extendFn` marks a timer start event's
145
+ cycle as `scheduledStart`, and the cron-capable `TimerEventDefinition` parses each one to its next
146
+ expiry:
147
+
148
+ ```javascript
149
+ import { createRequire } from 'node:module';
150
+ import { strict as assert } from 'node:assert';
151
+ import { BpmnModdle } from 'bpmn-moddle';
152
+ import * as elements from 'bpmn-elements';
153
+ import { Serializer, TypeResolver } from 'moddle-context-serializer';
154
+ import { extendFn, TimerEventDefinition } from '@0dep/bpmn-extensions';
155
+
156
+ const require = createRequire(import.meta.url);
157
+ const moddle = new BpmnModdle({ zeebe: require('zeebe-bpmn-moddle/resources/zeebe.json') });
158
+
159
+ const source = `<?xml version="1.0" encoding="UTF-8"?>
160
+ <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="def">
161
+ <process id="nightly" isExecutable="true">
162
+ <startEvent id="start">
163
+ <timerEventDefinition>
164
+ <timeCycle xsi:type="tFormalExpression">0 1 * * *</timeCycle>
165
+ </timerEventDefinition>
166
+ </startEvent>
167
+ <sequenceFlow id="to-task" sourceRef="start" targetRef="task" />
168
+ <userTask id="task" />
169
+ <boundaryEvent id="reminder" cancelActivity="false" attachedToRef="task">
170
+ <timerEventDefinition>
171
+ <timeDuration xsi:type="tFormalExpression">R3/PT1M</timeDuration>
172
+ </timerEventDefinition>
173
+ </boundaryEvent>
174
+ </process>
175
+ </definitions>`;
176
+
177
+ const moddleContext = await moddle.fromXML(source);
178
+ const serializer = Serializer(moddleContext, TypeResolver({ ...elements, TimerEventDefinition }), extendFn);
179
+
180
+ const dummyActivity = { id: 'dummy', broker: {}, environment: { Logger() {} } };
181
+ const timers = serializer.getTimers().map((t) => ({
182
+ ...t,
183
+ parsed: new TimerEventDefinition(dummyActivity, { type: t.timer.type, behaviour: t.timer }).parse(t.timer.timerType, t.timer.value),
184
+ }));
185
+
186
+ console.log(timers.map((t) => [t.parent.id, t.timer.timerType, t.timer.value, t.parsed.expireAt]));
187
+ assert.equal(timers.length, 2);
188
+ assert.equal(timers[0].parent.id, 'start');
189
+ assert.ok(timers[0].parsed.expireAt instanceof Date);
190
+
191
+ // A timer start event is a schedule: the cycle is lifted onto the behaviour
192
+ assert.equal(serializer.getActivityById('start').behaviour.scheduledStart, '0 1 * * *');
193
+ ```
194
+
133
195
  ## Development
134
196
 
135
197
  ```sh
@@ -147,6 +209,7 @@ the engine's `Logger` to the [`debug`](https://www.npmjs.com/package/debug) pack
147
209
 
148
210
  # Ecosystem
149
211
 
212
+ - [0dep.se/run](https://0dep.se/run) — Run a BPMN diagram in the browser: `bpmn-elements` wired with `@0dep/bpmn-extensions`, drawn with bpmn-js; step through, signal waiting tasks, and drop DMN files for business rule tasks.
150
213
  - [bpmn-engine](https://github.com/paed01/bpmn-engine) — BPMN 2.0 execution engine wrapping `bpmn-elements`; the batteries-included way to run, stop, resume, and recover flows.
151
214
  - [bpmn-middleware](https://github.com/zerodep/bpmn-middleware) — Express middleware exposing the engine over HTTP, with pluggable state storage.
152
215
  - [@onify/flow-extensions](https://github.com/onify/flow-extensions) — Onify Flow extensions for `bpmn-elements`.
package/dist/index.js CHANGED
@@ -1,5 +1,8 @@
1
1
  'use strict';
2
2
 
3
+ var croner = require('croner');
4
+ var bpmnElements = require('bpmn-elements');
5
+
3
6
  // these aren't really private, but nor are they really useful to document
4
7
 
5
8
  /**
@@ -16211,8 +16214,8 @@ function getFeelScope(environment, localVariables) {
16211
16214
  }
16212
16215
 
16213
16216
  /**
16214
- * Format an activity on enter from its behaviour and extensions: documentation and,
16215
- * for user tasks, the `zeebe:assignmentDefinition` (assignee, candidate users/groups),
16217
+ * Format an activity on enter from its behaviour and extensions: documentation, a top-level
16218
+ * timer start event's `scheduledStart` (lifted by `extendFn`) and, for user tasks, the `zeebe:assignmentDefinition` (assignee, candidate users/groups),
16216
16219
  * `zeebe:priorityDefinition` (priority), and `zeebe:taskSchedule` (due/follow-up date).
16217
16220
  */
16218
16221
  class FormatActivity {
@@ -16241,6 +16244,11 @@ class FormatActivity {
16241
16244
  if (text) result.description = /** @type {string} */ (resolveValue(text, scope));
16242
16245
  }
16243
16246
 
16247
+ // A timer start event's cycle is only a schedule when it starts the process itself — a
16248
+ // sub-process start event runs whenever its parent does.
16249
+ const scheduledStart = this.activity.behaviour.scheduledStart;
16250
+ if (scheduledStart && this.activity.parent?.type === 'bpmn:Process') result.scheduledStart = scheduledStart;
16251
+
16244
16252
  const assignment = this.assignmentDefinition;
16245
16253
  if (assignment) {
16246
16254
  const { assignee, candidateUsers, candidateGroups } = assignment;
@@ -16746,12 +16754,18 @@ function getExtensions(element, context) {
16746
16754
  );
16747
16755
  if (loopExtension?.outputCollection) result.loop = new LoopCharacteristics(loopExtension);
16748
16756
 
16749
- // Nothing zeebe-flavoured and nothing to format — the element needs no extension. A call
16757
+ // Nothing zeebe-flavoured and nothing to format (documentation, a process-level timer start
16758
+ // event's `scheduledStart`) — the element needs no extension. A call
16750
16759
  // activity is never inert: its output unwrap/merge is type-driven (the standard BPMN
16751
16760
  // `calledElement` attribute needs no zeebe elements). Ignored for processes — a called
16752
16761
  // process always needs its inbound input promoted, whatever it carries itself.
16753
16762
  result.isEmpty =
16754
- !foundZeebe && !result.subscription && !loopExtension && !element.behaviour.documentation && element.type !== 'bpmn:CallActivity';
16763
+ !foundZeebe &&
16764
+ !result.subscription &&
16765
+ !loopExtension &&
16766
+ !element.behaviour.documentation &&
16767
+ !(element.behaviour.scheduledStart && element.parent?.type === 'bpmn:Process') &&
16768
+ element.type !== 'bpmn:CallActivity';
16755
16769
 
16756
16770
  result.format = isProcess
16757
16771
  ? new FormatProcess(element)
@@ -17123,6 +17137,50 @@ function getScriptExpression(activity) {
17123
17137
  return script?.expression;
17124
17138
  }
17125
17139
 
17140
+ /**
17141
+ * bpmn-elements timer event definition that also accepts a **cron** `timeCycle` (Camunda 8
17142
+ * timer start events schedule with cron, e.g. `0 0 * * *`). An ISO 8601 interval is tried
17143
+ * first; on failure the value is parsed as cron and the next run is the expiry.
17144
+ *
17145
+ * Install it via the type resolver so it replaces the bpmn-elements default:
17146
+ * `TypeResolver({ ...elements, TimerEventDefinition })`.
17147
+ */
17148
+ class TimerEventDefinition extends bpmnElements.TimerEventDefinition {
17149
+ /**
17150
+ * Supported timeCycle formats
17151
+ * @returns {string[]}
17152
+ */
17153
+ get supports() {
17154
+ return ['cron', 'iso8601'];
17155
+ }
17156
+ /**
17157
+ * @param {import('bpmn-elements').TimerType} timerType
17158
+ * @param {string} value
17159
+ * @returns {import('bpmn-elements').parsedTimer}
17160
+ */
17161
+ parse(timerType, value) {
17162
+ if (timerType !== 'timeCycle') return super.parse(timerType, value);
17163
+
17164
+ /** @type {any} */
17165
+ let isoError;
17166
+ try {
17167
+ return super.parse(timerType, value);
17168
+ } catch (err) {
17169
+ isoError = err;
17170
+ }
17171
+
17172
+ try {
17173
+ const expireAt = new croner.Cron(value).nextRun();
17174
+ if (!expireAt) throw new RangeError('cron has no next run');
17175
+ return { expireAt, delay: expireAt.getTime() - Date.now() };
17176
+ } catch (/** @type {any} */ err) {
17177
+ this.logger.error(`<${this.activity?.id}> failed to parse timeCycle: ${isoError.message}`);
17178
+ this.logger.error(`<${this.activity?.id}> failed to parse timeCycle as cron: ${err.message}`);
17179
+ throw new RangeError(`Failed to parse timeCycle <${value?.substring(0, 255)}> as ISO 8601 interval or cron`, { cause: err });
17180
+ }
17181
+ }
17182
+ }
17183
+
17126
17184
  /**
17127
17185
  * A flow extension activated by bpmn-elements around an element's run.
17128
17186
  * @typedef {object} FlowExtension
@@ -17166,10 +17224,17 @@ function extensions(element, context) {
17166
17224
  *
17167
17225
  * Lifts extension data onto the places bpmn-elements expects to find it on the element
17168
17226
  * behaviour: the call activity's called process id (`zeebe:calledElement`) and the multi-instance
17169
- * input collection/element (`zeebe:loopCharacteristics`).
17227
+ * input collection/element (`zeebe:loopCharacteristics`). A timer start event's `timeCycle`
17228
+ * (ISO 8601 or cron) is lifted as `scheduledStart`, so a scheduler can find it without running
17229
+ * the flow.
17170
17230
  * @param {any} behaviour
17171
17231
  */
17172
17232
  function extendFn(behaviour) {
17233
+ if (behaviour.$type === 'bpmn:StartEvent' && Array.isArray(behaviour.eventDefinitions)) {
17234
+ const timer = behaviour.eventDefinitions.find((ed) => ed?.type === 'bpmn:TimerEventDefinition' && ed.behaviour?.timeCycle);
17235
+ if (timer) behaviour.scheduledStart = timer.behaviour.timeCycle;
17236
+ }
17237
+
17173
17238
  const values = behaviour.extensionElements?.values;
17174
17239
  if (Array.isArray(values)) {
17175
17240
  for (const ext of values) {
@@ -17197,6 +17262,7 @@ exports.JobService = JobService;
17197
17262
  exports.ProcessExtensions = ProcessExtensions;
17198
17263
  exports.ServiceError = ServiceError;
17199
17264
  exports.SubProcessExtensions = SubProcessExtensions;
17265
+ exports.TimerEventDefinition = TimerEventDefinition;
17200
17266
  exports.evaluateFeel = evaluateFeel;
17201
17267
  exports.evaluateFeelUnaryTest = evaluateFeelUnaryTest;
17202
17268
  exports.extendFn = extendFn;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@0dep/bpmn-extensions",
3
- "version": "0.0.5",
3
+ "version": "0.0.6",
4
4
  "description": "Flow extensions for bpmn-elements: FEEL expressions and the zeebe-namespace BPMN extension elements",
5
5
  "type": "module",
6
6
  "module": "src/index.js",
@@ -51,7 +51,8 @@
51
51
  "access": "public"
52
52
  },
53
53
  "peerDependencies": {
54
- "bpmn-elements": ">=18.0.12"
54
+ "bpmn-elements": ">=18.0.12",
55
+ "croner": ">=9"
55
56
  },
56
57
  "dependencies": {
57
58
  "feelin": "^7.0.1"
@@ -72,6 +73,7 @@
72
73
  "bpmn-moddle": "^10.1.0",
73
74
  "c8": "^12.0.0",
74
75
  "chai": "^6.2.2",
76
+ "croner": "^10.0.1",
75
77
  "debug": "^4.4.3",
76
78
  "dts-buddy": "^0.8.2",
77
79
  "eslint": "^10.6.0",
@@ -83,7 +85,7 @@
83
85
  "rollup": "^4.62.2",
84
86
  "texample": "^1.0.2",
85
87
  "typescript": "^6.0.3",
86
- "zeebe-bpmn-moddle": "^1.15.0"
88
+ "zeebe-bpmn-moddle": "^2.0.0"
87
89
  },
88
90
  "files": [
89
91
  "src",
@@ -0,0 +1,46 @@
1
+ import { Cron } from 'croner';
2
+ import { TimerEventDefinition as BaseTimerEventDefinition } from 'bpmn-elements';
3
+
4
+ /**
5
+ * bpmn-elements timer event definition that also accepts a **cron** `timeCycle` (Camunda 8
6
+ * timer start events schedule with cron, e.g. `0 0 * * *`). An ISO 8601 interval is tried
7
+ * first; on failure the value is parsed as cron and the next run is the expiry.
8
+ *
9
+ * Install it via the type resolver so it replaces the bpmn-elements default:
10
+ * `TypeResolver({ ...elements, TimerEventDefinition })`.
11
+ */
12
+ export class TimerEventDefinition extends BaseTimerEventDefinition {
13
+ /**
14
+ * Supported timeCycle formats
15
+ * @returns {string[]}
16
+ */
17
+ get supports() {
18
+ return ['cron', 'iso8601'];
19
+ }
20
+ /**
21
+ * @param {import('bpmn-elements').TimerType} timerType
22
+ * @param {string} value
23
+ * @returns {import('bpmn-elements').parsedTimer}
24
+ */
25
+ parse(timerType, value) {
26
+ if (timerType !== 'timeCycle') return super.parse(timerType, value);
27
+
28
+ /** @type {any} */
29
+ let isoError;
30
+ try {
31
+ return super.parse(timerType, value);
32
+ } catch (err) {
33
+ isoError = err;
34
+ }
35
+
36
+ try {
37
+ const expireAt = new Cron(value).nextRun();
38
+ if (!expireAt) throw new RangeError('cron has no next run');
39
+ return { expireAt, delay: expireAt.getTime() - Date.now() };
40
+ } catch (/** @type {any} */ err) {
41
+ this.logger.error(`<${this.activity?.id}> failed to parse timeCycle: ${isoError.message}`);
42
+ this.logger.error(`<${this.activity?.id}> failed to parse timeCycle as cron: ${err.message}`);
43
+ throw new RangeError(`Failed to parse timeCycle <${value?.substring(0, 255)}> as ISO 8601 interval or cron`, { cause: err });
44
+ }
45
+ }
46
+ }
@@ -1,8 +1,8 @@
1
1
  import { resolveValue, getFeelScope } from '../feel.js';
2
2
 
3
3
  /**
4
- * Format an activity on enter from its behaviour and extensions: documentation and,
5
- * for user tasks, the `zeebe:assignmentDefinition` (assignee, candidate users/groups),
4
+ * Format an activity on enter from its behaviour and extensions: documentation, a top-level
5
+ * timer start event's `scheduledStart` (lifted by `extendFn`) and, for user tasks, the `zeebe:assignmentDefinition` (assignee, candidate users/groups),
6
6
  * `zeebe:priorityDefinition` (priority), and `zeebe:taskSchedule` (due/follow-up date).
7
7
  */
8
8
  export class FormatActivity {
@@ -31,6 +31,11 @@ export class FormatActivity {
31
31
  if (text) result.description = /** @type {string} */ (resolveValue(text, scope));
32
32
  }
33
33
 
34
+ // A timer start event's cycle is only a schedule when it starts the process itself — a
35
+ // sub-process start event runs whenever its parent does.
36
+ const scheduledStart = this.activity.behaviour.scheduledStart;
37
+ if (scheduledStart && this.activity.parent?.type === 'bpmn:Process') result.scheduledStart = scheduledStart;
38
+
34
39
  const assignment = this.assignmentDefinition;
35
40
  if (assignment) {
36
41
  const { assignee, candidateUsers, candidateGroups } = assignment;
@@ -104,12 +104,18 @@ export function getExtensions(element, context) {
104
104
  );
105
105
  if (loopExtension?.outputCollection) result.loop = new LoopCharacteristics(loopExtension);
106
106
 
107
- // Nothing zeebe-flavoured and nothing to format — the element needs no extension. A call
107
+ // Nothing zeebe-flavoured and nothing to format (documentation, a process-level timer start
108
+ // event's `scheduledStart`) — the element needs no extension. A call
108
109
  // activity is never inert: its output unwrap/merge is type-driven (the standard BPMN
109
110
  // `calledElement` attribute needs no zeebe elements). Ignored for processes — a called
110
111
  // process always needs its inbound input promoted, whatever it carries itself.
111
112
  result.isEmpty =
112
- !foundZeebe && !result.subscription && !loopExtension && !element.behaviour.documentation && element.type !== 'bpmn:CallActivity';
113
+ !foundZeebe &&
114
+ !result.subscription &&
115
+ !loopExtension &&
116
+ !element.behaviour.documentation &&
117
+ !(element.behaviour.scheduledStart && element.parent?.type === 'bpmn:Process') &&
118
+ element.type !== 'bpmn:CallActivity';
113
119
 
114
120
  result.format = isProcess
115
121
  ? new FormatProcess(element)
package/src/index.js CHANGED
@@ -5,6 +5,7 @@ import { SubProcessExtensions } from './SubProcessExtensions.js';
5
5
  export { ElementExtensions, ProcessExtensions, SubProcessExtensions };
6
6
  export { FeelExpressions } from './Expressions.js';
7
7
  export { FeelScripts } from './extensions/FeelScripts.js';
8
+ export { TimerEventDefinition } from './TimerEventDefinition.js';
8
9
  export { isFeelExpression, stripFeel, evaluateFeel, evaluateFeelUnaryTest, resolveValue, getFeelScope } from './feel.js';
9
10
  export { JobService } from './extensions/TaskDefinition.js';
10
11
  export { ServiceError, FormatError } from './Errors.js';
@@ -52,10 +53,17 @@ export function extensions(element, context) {
52
53
  *
53
54
  * Lifts extension data onto the places bpmn-elements expects to find it on the element
54
55
  * behaviour: the call activity's called process id (`zeebe:calledElement`) and the multi-instance
55
- * input collection/element (`zeebe:loopCharacteristics`).
56
+ * input collection/element (`zeebe:loopCharacteristics`). A timer start event's `timeCycle`
57
+ * (ISO 8601 or cron) is lifted as `scheduledStart`, so a scheduler can find it without running
58
+ * the flow.
56
59
  * @param {any} behaviour
57
60
  */
58
61
  export function extendFn(behaviour) {
62
+ if (behaviour.$type === 'bpmn:StartEvent' && Array.isArray(behaviour.eventDefinitions)) {
63
+ const timer = behaviour.eventDefinitions.find((ed) => ed?.type === 'bpmn:TimerEventDefinition' && ed.behaviour?.timeCycle);
64
+ if (timer) behaviour.scheduledStart = timer.behaviour.timeCycle;
65
+ }
66
+
59
67
  const values = behaviour.extensionElements?.values;
60
68
  if (Array.isArray(values)) {
61
69
  for (const ext of values) {
package/types/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  declare module '@0dep/bpmn-extensions' {
2
+ import type { TimerEventDefinition as BaseTimerEventDefinition } from 'bpmn-elements';
2
3
  /**
3
4
  * A flow extension activated by bpmn-elements around an element's run.
4
5
  * */
@@ -15,7 +16,9 @@ declare module '@0dep/bpmn-extensions' {
15
16
  *
16
17
  * Lifts extension data onto the places bpmn-elements expects to find it on the element
17
18
  * behaviour: the call activity's called process id (`zeebe:calledElement`) and the multi-instance
18
- * input collection/element (`zeebe:loopCharacteristics`).
19
+ * input collection/element (`zeebe:loopCharacteristics`). A timer start event's `timeCycle`
20
+ * (ISO 8601 or cron) is lifted as `scheduledStart`, so a scheduler can find it without running
21
+ * the flow.
19
22
  * */
20
23
  export function extendFn(behaviour: any): void;
21
24
  /**
@@ -48,6 +51,20 @@ declare module '@0dep/bpmn-extensions' {
48
51
  *
49
52
  * */
50
53
  export function FeelScripts(): import("bpmn-elements").IScripts;
54
+ /**
55
+ * bpmn-elements timer event definition that also accepts a **cron** `timeCycle` (Camunda 8
56
+ * timer start events schedule with cron, e.g. `0 0 * * *`). An ISO 8601 interval is tried
57
+ * first; on failure the value is parsed as cron and the next run is the expiry.
58
+ *
59
+ * Install it via the type resolver so it replaces the bpmn-elements default:
60
+ * `TypeResolver({ ...elements, TimerEventDefinition })`.
61
+ */
62
+ export class TimerEventDefinition extends BaseTimerEventDefinition {
63
+ /**
64
+ * Supported timeCycle formats
65
+ * */
66
+ get supports(): string[];
67
+ }
51
68
  /**
52
69
  * `zeebe:taskDefinition`.
53
70
  *
@@ -220,8 +237,8 @@ declare module '@0dep/bpmn-extensions' {
220
237
  isEmpty?: boolean | undefined;
221
238
  };
222
239
  /**
223
- * Format an activity on enter from its behaviour and extensions: documentation and,
224
- * for user tasks, the `zeebe:assignmentDefinition` (assignee, candidate users/groups),
240
+ * Format an activity on enter from its behaviour and extensions: documentation, a top-level
241
+ * timer start event's `scheduledStart` (lifted by `extendFn`) and, for user tasks, the `zeebe:assignmentDefinition` (assignee, candidate users/groups),
225
242
  * `zeebe:priorityDefinition` (priority), and `zeebe:taskSchedule` (due/follow-up date).
226
243
  */
227
244
  class FormatActivity {
@@ -234,6 +251,7 @@ declare module '@0dep/bpmn-extensions' {
234
251
 
235
252
  resolve(elementApi: import("bpmn-elements").IApi<import("bpmn-elements").Activity>): {
236
253
  description: string;
254
+ scheduledStart: any;
237
255
  assignee: any;
238
256
  candidateUsers: string[];
239
257
  candidateGroups: string[];
@@ -6,6 +6,7 @@
6
6
  "extendFn",
7
7
  "FeelExpressions",
8
8
  "FeelScripts",
9
+ "TimerEventDefinition",
9
10
  "JobService",
10
11
  "ElementExtensions",
11
12
  "ProcessExtensions",
@@ -32,6 +33,7 @@
32
33
  "../src/index.js",
33
34
  "../src/Expressions.js",
34
35
  "../src/extensions/FeelScripts.js",
36
+ "../src/TimerEventDefinition.js",
35
37
  "../src/extensions/TaskDefinition.js",
36
38
  "../src/ElementExtensions.js",
37
39
  "../src/ProcessExtensions.js",
@@ -64,8 +66,9 @@
64
66
  null,
65
67
  null,
66
68
  null,
69
+ null,
67
70
  null
68
71
  ],
69
- "mappings": ";;;;;;;;;;;iBA4BgBA,UAAUA;;;;;;;;iBA6BVC,QAAQA;;;;;;;;;;;;;;;;iBC9CRC,eAAeA;;;;;;;;;;;;;;iBCEfC,WAAWA;;;;;;;;;;;;;;;iBCIXC,UAAUA;cAAVA,UAAUA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cCEbC,iBAAiBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cCZjBC,iBAAiBA;;;;;;;;;;;;;;;;;;;cCIjBC,oBAAoBA;;;;;;;iBCEjBC,gBAAgBA;;;;iBAShBC,SAASA;;;;;;iBAUTC,YAAYA;;;;;;;;iBAYZC,qBAAqBA;;;;;;iBAYrBC,YAAYA;;;;;;;;;;iBAgBZC,YAAYA;cCxEfC,YAAYA;;;;;;;cAQZC,WAAWA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OCDXC,cAAcA;;;;;;;;;;;;;;;;;;;;;;OA2DdC,aAAaA;;;;;;;;;;;;;;;;;;;;OCrDbC,SAASA;;;;;;;;;;;;;;;;;;;;;;;OCPTC,WAAWA;;;;;;;;;;;OCEXC,UAAUA;;;;;;;;;;;;;;;OCIVC,kBAAkBA;;;;;;;;;;;;;;;;;;;OCFlBC,IAAIA;;;;;;;;;;;;;;;;;;;;;;OCGJC,mBAAmBA;;;;;;;;;;;;;;;;;;;OCHnBC,YAAYA",
72
+ "mappings": ";;;;;;;;;;;;iBA6BgBA,UAAUA;;;;;;;;;;iBA+BVC,QAAQA;;;;;;;;;;;;;;;;iBCjDRC,eAAeA;;;;;;;;;;;;;;iBCEfC,WAAWA;;;;;;;;;cCFdC,oBAAoBA;;;;;;;;;;;;;;;;;;;;iBCMjBC,UAAUA;cAAVA,UAAUA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cCEbC,iBAAiBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cCZjBC,iBAAiBA;;;;;;;;;;;;;;;;;;;cCIjBC,oBAAoBA;;;;;;;iBCEjBC,gBAAgBA;;;;iBAShBC,SAASA;;;;;;iBAUTC,YAAYA;;;;;;;;iBAYZC,qBAAqBA;;;;;;iBAYrBC,YAAYA;;;;;;;;;;iBAgBZC,YAAYA;cCxEfC,YAAYA;;;;;;;cAQZC,WAAWA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OCDXC,cAAcA;;;;;;;;;;;;;;;;;;;;;;;OAgEdC,aAAaA;;;;;;;;;;;;;;;;;;;;OC1DbC,SAASA;;;;;;;;;;;;;;;;;;;;;;;OCPTC,WAAWA;;;;;;;;;;;OCEXC,UAAUA;;;;;;;;;;;;;;;OCIVC,kBAAkBA;;;;;;;;;;;;;;;;;;;OCFlBC,IAAIA;;;;;;;;;;;;;;;;;;;;;;OCGJC,mBAAmBA;;;;;;;;;;;;;;;;;;;OCHnBC,YAAYA",
70
73
  "ignoreList": []
71
74
  }