@zola_do/workflow-engine 0.2.4 → 0.2.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
|
@@ -1,7 +1,20 @@
|
|
|
1
1
|
# @zola_do/workflow-engine
|
|
2
2
|
|
|
3
|
+
[](https://www.npmjs.com/package/@zola_do/workflow-engine)
|
|
4
|
+
[](https://www.npmjs.com/package/@zola_do/workflow-engine)
|
|
5
|
+
[](https://opensource.org/licenses/ISC)
|
|
6
|
+
|
|
3
7
|
State machine workflow converter for NestJS. Converts UI JSON (node/edge graph) to XState-compatible state machine definitions.
|
|
4
8
|
|
|
9
|
+
## Overview
|
|
10
|
+
|
|
11
|
+
`@zola_do/workflow-engine` provides:
|
|
12
|
+
|
|
13
|
+
- **UI JSON Conversion** — Transform React Flow / node-editor JSON to state machines
|
|
14
|
+
- **XState Compatibility** — Output suitable for XState or similar libraries
|
|
15
|
+
- **Node Type Support** — Handles start, parallel, and custom node types
|
|
16
|
+
- **State Transitions** — Automatic edge-to-transition mapping
|
|
17
|
+
|
|
5
18
|
## Installation
|
|
6
19
|
|
|
7
20
|
```bash
|
|
@@ -12,15 +25,13 @@ npm install @zola_do/workflow-engine
|
|
|
12
25
|
npm install @zola_do/nestjs-shared
|
|
13
26
|
```
|
|
14
27
|
|
|
15
|
-
##
|
|
28
|
+
## Quick Start
|
|
16
29
|
|
|
17
|
-
###
|
|
18
|
-
|
|
19
|
-
Register `WorkflowEngineService` in your module:
|
|
30
|
+
### 1. Register Service
|
|
20
31
|
|
|
21
32
|
```typescript
|
|
22
|
-
import { Module } from
|
|
23
|
-
import { WorkflowEngineService } from
|
|
33
|
+
import { Module } from "@nestjs/common";
|
|
34
|
+
import { WorkflowEngineService } from "@zola_do/workflow-engine";
|
|
24
35
|
|
|
25
36
|
@Module({
|
|
26
37
|
providers: [WorkflowEngineService],
|
|
@@ -29,45 +40,467 @@ import { WorkflowEngineService } from '@zola_do/workflow-engine';
|
|
|
29
40
|
export class WorkflowModule {}
|
|
30
41
|
```
|
|
31
42
|
|
|
32
|
-
###
|
|
33
|
-
|
|
34
|
-
The service converts a React Flow / node-editor style JSON (nodes and edges) into a state machine definition:
|
|
43
|
+
### 2. Convert Workflow
|
|
35
44
|
|
|
36
45
|
```typescript
|
|
37
|
-
import { Injectable } from
|
|
38
|
-
import { WorkflowEngineService } from
|
|
46
|
+
import { Injectable } from "@nestjs/common";
|
|
47
|
+
import { WorkflowEngineService } from "@zola_do/workflow-engine";
|
|
39
48
|
|
|
40
49
|
@Injectable()
|
|
41
50
|
export class WorkflowController {
|
|
42
51
|
constructor(private readonly workflowEngine: WorkflowEngineService) {}
|
|
43
52
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
const
|
|
49
|
-
|
|
50
|
-
|
|
53
|
+
@Post("workflows/:id/compile")
|
|
54
|
+
async compileWorkflow(@Param("id") id: string) {
|
|
55
|
+
const uiJson = await this.workflowService.getUiJson(id);
|
|
56
|
+
|
|
57
|
+
const stateMachine = this.workflowEngine.convertToStateMachine(uiJson);
|
|
58
|
+
|
|
59
|
+
return {
|
|
60
|
+
definition: stateMachine,
|
|
61
|
+
xstateReady: true,
|
|
62
|
+
};
|
|
51
63
|
}
|
|
52
64
|
}
|
|
53
65
|
```
|
|
54
66
|
|
|
55
|
-
|
|
67
|
+
## Workflow Architecture
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
┌─────────────────────────────────────────────────────────────────────┐
|
|
71
|
+
│ Workflow Conversion Flow │
|
|
72
|
+
├─────────────────────────────────────────────────────────────────────┤
|
|
73
|
+
│ │
|
|
74
|
+
│ UI Editor (React Flow) │
|
|
75
|
+
│ ┌─────────────────────────────────────────┐ │
|
|
76
|
+
│ │ nodes: [ │ │
|
|
77
|
+
│ │ { id: '1', type: 'start', ... }, │ │
|
|
78
|
+
│ │ { id: '2', type: 'task', ... }, │ │
|
|
79
|
+
│ │ { id: '3', type: 'end', ... } │ │
|
|
80
|
+
│ │ ] │ │
|
|
81
|
+
│ │ edges: [ │ │
|
|
82
|
+
│ │ { source: '1', target: '2' }, │ │
|
|
83
|
+
│ │ { source: '2', target: '3' } │ │
|
|
84
|
+
│ │ ] │ │
|
|
85
|
+
│ └────────────────────┬────────────────────┘ │
|
|
86
|
+
│ │ │
|
|
87
|
+
│ │ convertToStateMachine() │
|
|
88
|
+
│ ▼ │
|
|
89
|
+
│ ┌─────────────────────────────────────────┐ │
|
|
90
|
+
│ │ State Machine Definition │ │
|
|
91
|
+
│ │ │ │
|
|
92
|
+
│ │ { │ │
|
|
93
|
+
│ │ id: 'workflow-uuid', │ │
|
|
94
|
+
│ │ initial: 'Start', │ │
|
|
95
|
+
│ │ states: { │ │
|
|
96
|
+
│ │ Start: { │ │
|
|
97
|
+
│ │ on: { NEXT: 'Task' } │ │
|
|
98
|
+
│ │ }, │ │
|
|
99
|
+
│ │ Task: { │ │
|
|
100
|
+
│ │ on: { DONE: 'End' } │ │
|
|
101
|
+
│ │ }, │ │
|
|
102
|
+
│ │ End: { type: 'final' } │ │
|
|
103
|
+
│ │ } │ │
|
|
104
|
+
│ │ } │ │
|
|
105
|
+
│ └─────────────────────────────────────────┘ │
|
|
106
|
+
│ │
|
|
107
|
+
└─────────────────────────────────────────────────────────────────────┘
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Input Format
|
|
111
|
+
|
|
112
|
+
### Node Types
|
|
113
|
+
|
|
114
|
+
```typescript
|
|
115
|
+
interface WorkflowNode {
|
|
116
|
+
id: string;
|
|
117
|
+
type: "start" | "end" | "task" | "condition" | "parallel" | string;
|
|
118
|
+
data: {
|
|
119
|
+
label?: string;
|
|
120
|
+
[key: string]: any;
|
|
121
|
+
};
|
|
122
|
+
position?: { x: number; y: number };
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### Edge Types
|
|
127
|
+
|
|
128
|
+
```typescript
|
|
129
|
+
interface WorkflowEdge {
|
|
130
|
+
id?: string;
|
|
131
|
+
source: string; // Source node ID
|
|
132
|
+
target: string; // Target node ID
|
|
133
|
+
label?: string; // Event/transition name
|
|
134
|
+
data?: {
|
|
135
|
+
condition?: string; // For conditional edges
|
|
136
|
+
[key: string]: any;
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### Example UI JSON
|
|
142
|
+
|
|
143
|
+
```typescript
|
|
144
|
+
const uiJson = {
|
|
145
|
+
nodes: [
|
|
146
|
+
{
|
|
147
|
+
id: "node-1",
|
|
148
|
+
type: "start",
|
|
149
|
+
data: { label: "Start" },
|
|
150
|
+
position: { x: 100, y: 100 },
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
id: "node-2",
|
|
154
|
+
type: "task",
|
|
155
|
+
data: { label: "Review Application" },
|
|
156
|
+
position: { x: 300, y: 100 },
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
id: "node-3",
|
|
160
|
+
type: "condition",
|
|
161
|
+
data: { label: "Approved?" },
|
|
162
|
+
position: { x: 500, y: 100 },
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
id: "node-4",
|
|
166
|
+
type: "task",
|
|
167
|
+
data: { label: "Send Approval Email" },
|
|
168
|
+
position: { x: 700, y: 50 },
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
id: "node-5",
|
|
172
|
+
type: "task",
|
|
173
|
+
data: { label: "Send Rejection Email" },
|
|
174
|
+
position: { x: 700, y: 150 },
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
id: "node-6",
|
|
178
|
+
type: "end",
|
|
179
|
+
data: { label: "End" },
|
|
180
|
+
position: { x: 900, y: 100 },
|
|
181
|
+
},
|
|
182
|
+
],
|
|
183
|
+
edges: [
|
|
184
|
+
{ source: "node-1", target: "node-2" },
|
|
185
|
+
{ source: "node-2", target: "node-3" },
|
|
186
|
+
{ source: "node-3", target: "node-4", label: "YES" },
|
|
187
|
+
{ source: "node-3", target: "node-5", label: "NO" },
|
|
188
|
+
{ source: "node-4", target: "node-6" },
|
|
189
|
+
{ source: "node-5", target: "node-6" },
|
|
190
|
+
],
|
|
191
|
+
};
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
## Output Format
|
|
195
|
+
|
|
196
|
+
### State Machine Structure
|
|
197
|
+
|
|
198
|
+
```typescript
|
|
199
|
+
interface StateMachine {
|
|
200
|
+
id: string; // UUID
|
|
201
|
+
initial: string; // Initial state name
|
|
202
|
+
states: {
|
|
203
|
+
[stateName: string]: {
|
|
204
|
+
type?: "final" | "atomic";
|
|
205
|
+
on?: {
|
|
206
|
+
[event: string]: string | StateMachine;
|
|
207
|
+
};
|
|
208
|
+
meta?: {
|
|
209
|
+
type?: string;
|
|
210
|
+
[key: string]: any;
|
|
211
|
+
};
|
|
212
|
+
states?: {
|
|
213
|
+
[nestedState: string]: any;
|
|
214
|
+
};
|
|
215
|
+
};
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
### Example Output
|
|
221
|
+
|
|
222
|
+
```typescript
|
|
223
|
+
const stateMachine = {
|
|
224
|
+
id: "550e8400-e29b-41d4-a716-446655440000",
|
|
225
|
+
initial: "Start",
|
|
226
|
+
states: {
|
|
227
|
+
Start: {
|
|
228
|
+
on: { NEXT: "Review Application" },
|
|
229
|
+
meta: { type: "start" },
|
|
230
|
+
},
|
|
231
|
+
"Review Application": {
|
|
232
|
+
on: { NEXT: "Approved?" },
|
|
233
|
+
meta: { type: "task" },
|
|
234
|
+
},
|
|
235
|
+
"Approved?": {
|
|
236
|
+
on: {
|
|
237
|
+
YES: "Send Approval Email",
|
|
238
|
+
NO: "Send Rejection Email",
|
|
239
|
+
},
|
|
240
|
+
meta: { type: "condition" },
|
|
241
|
+
},
|
|
242
|
+
"Send Approval Email": {
|
|
243
|
+
on: { NEXT: "End" },
|
|
244
|
+
meta: { type: "task" },
|
|
245
|
+
},
|
|
246
|
+
"Send Rejection Email": {
|
|
247
|
+
on: { NEXT: "End" },
|
|
248
|
+
meta: { type: "task" },
|
|
249
|
+
},
|
|
250
|
+
End: {
|
|
251
|
+
type: "final",
|
|
252
|
+
meta: { type: "end" },
|
|
253
|
+
},
|
|
254
|
+
},
|
|
255
|
+
};
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
## Node Type Handling
|
|
259
|
+
|
|
260
|
+
### Start Node
|
|
261
|
+
|
|
262
|
+
```typescript
|
|
263
|
+
{
|
|
264
|
+
id: 'node-1',
|
|
265
|
+
type: 'start',
|
|
266
|
+
data: { label: 'Start' },
|
|
267
|
+
}
|
|
268
|
+
// Becomes: initial state in output
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
### End Node
|
|
272
|
+
|
|
273
|
+
```typescript
|
|
274
|
+
{
|
|
275
|
+
id: 'node-2',
|
|
276
|
+
type: 'end',
|
|
277
|
+
data: { label: 'End' },
|
|
278
|
+
}
|
|
279
|
+
// Becomes: { type: 'final' } state
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
### Task Node
|
|
283
|
+
|
|
284
|
+
```typescript
|
|
285
|
+
{
|
|
286
|
+
id: 'node-3',
|
|
287
|
+
type: 'task',
|
|
288
|
+
data: { label: 'Process Order' },
|
|
289
|
+
}
|
|
290
|
+
// Becomes: { on: { NEXT: 'nextState' }, meta: { type: 'task' } }
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
### Condition Node
|
|
294
|
+
|
|
295
|
+
```typescript
|
|
296
|
+
{
|
|
297
|
+
id: 'node-4',
|
|
298
|
+
type: 'condition',
|
|
299
|
+
data: { label: 'Is Valid?' },
|
|
300
|
+
}
|
|
301
|
+
// Becomes: { on: { YES: 'trueState', NO: 'falseState' } }
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
### Parallel Node
|
|
305
|
+
|
|
306
|
+
```typescript
|
|
307
|
+
{
|
|
308
|
+
id: 'node-5',
|
|
309
|
+
type: 'parallel',
|
|
310
|
+
data: { label: 'Parallel Tasks' },
|
|
311
|
+
}
|
|
312
|
+
// Becomes: { type: 'parallel', states: { ... } }
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
## Real-World Examples
|
|
56
316
|
|
|
57
|
-
|
|
58
|
-
- **edges:** Array of `{ source, target, label? }`. Defines transitions between states.
|
|
317
|
+
### Approval Workflow
|
|
59
318
|
|
|
60
|
-
|
|
319
|
+
```typescript
|
|
320
|
+
const approvalWorkflow = {
|
|
321
|
+
nodes: [
|
|
322
|
+
{ id: "1", type: "start", data: { label: "Submit" } },
|
|
323
|
+
{ id: "2", type: "task", data: { label: "Manager Review" } },
|
|
324
|
+
{ id: "3", type: "condition", data: { label: "Approved?" } },
|
|
325
|
+
{ id: "4", type: "task", data: { label: "Send Approval" } },
|
|
326
|
+
{ id: "5", type: "task", data: { label: "Notify Rejection" } },
|
|
327
|
+
{ id: "6", type: "end", data: { label: "Done" } },
|
|
328
|
+
],
|
|
329
|
+
edges: [
|
|
330
|
+
{ source: "1", target: "2" },
|
|
331
|
+
{ source: "2", target: "3" },
|
|
332
|
+
{ source: "3", target: "4", label: "YES" },
|
|
333
|
+
{ source: "3", target: "5", label: "NO" },
|
|
334
|
+
{ source: "4", target: "6" },
|
|
335
|
+
{ source: "5", target: "6" },
|
|
336
|
+
],
|
|
337
|
+
};
|
|
338
|
+
|
|
339
|
+
const stateMachine = workflowEngine.convertToStateMachine(approvalWorkflow);
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
### Multi-Step Form
|
|
343
|
+
|
|
344
|
+
```typescript
|
|
345
|
+
const formWorkflow = {
|
|
346
|
+
nodes: [
|
|
347
|
+
{ id: "s1", type: "start", data: { label: "Step 1" } },
|
|
348
|
+
{ id: "s2", type: "task", data: { label: "Personal Info" } },
|
|
349
|
+
{ id: "s3", type: "task", data: { label: "Address" } },
|
|
350
|
+
{ id: "s4", type: "task", data: { label: "Payment" } },
|
|
351
|
+
{ id: "s5", type: "condition", data: { label: "Valid?" } },
|
|
352
|
+
{ id: "s6", type: "end", data: { label: "Complete" } },
|
|
353
|
+
],
|
|
354
|
+
edges: [
|
|
355
|
+
{ source: "s1", target: "s2" },
|
|
356
|
+
{ source: "s2", target: "s3" },
|
|
357
|
+
{ source: "s3", target: "s4" },
|
|
358
|
+
{ source: "s4", target: "s5" },
|
|
359
|
+
{ source: "s5", target: "s6", label: "YES" },
|
|
360
|
+
{ source: "s5", target: "s2", label: "NO" }, // Go back
|
|
361
|
+
],
|
|
362
|
+
};
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
## XState Integration
|
|
366
|
+
|
|
367
|
+
The output is compatible with XState:
|
|
368
|
+
|
|
369
|
+
```typescript
|
|
370
|
+
import { createMachine } from "xstate";
|
|
371
|
+
import { interpret } from "xstate";
|
|
372
|
+
|
|
373
|
+
const machine = createMachine(stateMachine);
|
|
374
|
+
|
|
375
|
+
const actor = interpret(machine).start();
|
|
376
|
+
|
|
377
|
+
actor.send({ type: "NEXT" }); // Transition to next state
|
|
378
|
+
actor.send({ type: "YES" }); // Transition on condition
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
### Full XState Example
|
|
382
|
+
|
|
383
|
+
```typescript
|
|
384
|
+
import { createMachine, interpret } from "xstate";
|
|
385
|
+
|
|
386
|
+
@Controller("workflows")
|
|
387
|
+
export class WorkflowExecutionController {
|
|
388
|
+
@Post(":id/execute")
|
|
389
|
+
async executeWorkflow(@Param("id") id: string) {
|
|
390
|
+
const definition = await this.workflowService.getCompiledDefinition(id);
|
|
391
|
+
const machine = createMachine(definition);
|
|
392
|
+
|
|
393
|
+
const actor = interpret(machine)
|
|
394
|
+
.onTransition((state) => {
|
|
395
|
+
console.log("Current state:", state.value);
|
|
396
|
+
})
|
|
397
|
+
.start();
|
|
398
|
+
|
|
399
|
+
// Execute workflow steps
|
|
400
|
+
const result = await this.executeSteps(actor, definition);
|
|
401
|
+
|
|
402
|
+
return result;
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
private async executeSteps(actor: any, definition: any) {
|
|
406
|
+
const states = Object.keys(definition.states);
|
|
407
|
+
for (const state of states) {
|
|
408
|
+
if (definition.states[state].type === "final") {
|
|
409
|
+
break;
|
|
410
|
+
}
|
|
411
|
+
await this.performStateAction(state);
|
|
412
|
+
actor.send({ type: "NEXT" });
|
|
413
|
+
}
|
|
414
|
+
return { completed: true };
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
## API Reference
|
|
420
|
+
|
|
421
|
+
### Service
|
|
422
|
+
|
|
423
|
+
```typescript
|
|
424
|
+
class WorkflowEngineService {
|
|
425
|
+
convertToStateMachine(uiJson: UiJson): StateMachine;
|
|
426
|
+
}
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
### Types
|
|
430
|
+
|
|
431
|
+
```typescript
|
|
432
|
+
interface UiJson {
|
|
433
|
+
nodes: WorkflowNode[];
|
|
434
|
+
edges: WorkflowEdge[];
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
interface WorkflowNode {
|
|
438
|
+
id: string;
|
|
439
|
+
type: string;
|
|
440
|
+
data: Record<string, any>;
|
|
441
|
+
position?: { x: number; y: number };
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
interface WorkflowEdge {
|
|
445
|
+
id?: string;
|
|
446
|
+
source: string;
|
|
447
|
+
target: string;
|
|
448
|
+
label?: string;
|
|
449
|
+
data?: Record<string, any>;
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
interface StateMachine {
|
|
453
|
+
id: string;
|
|
454
|
+
initial: string;
|
|
455
|
+
states: Record<string, any>;
|
|
456
|
+
}
|
|
457
|
+
```
|
|
458
|
+
|
|
459
|
+
## Troubleshooting
|
|
460
|
+
|
|
461
|
+
### Q: Node label not used?
|
|
462
|
+
|
|
463
|
+
Ensure nodes have a `data.label` property:
|
|
464
|
+
|
|
465
|
+
```typescript
|
|
466
|
+
// ❌ No label
|
|
467
|
+
{ id: '1', type: 'start' }
|
|
468
|
+
|
|
469
|
+
// ✅ With label
|
|
470
|
+
{ id: '1', type: 'start', data: { label: 'Start' } }
|
|
471
|
+
```
|
|
472
|
+
|
|
473
|
+
### Q: Edge transitions not working?
|
|
474
|
+
|
|
475
|
+
Check edge labels match expected events:
|
|
476
|
+
|
|
477
|
+
```typescript
|
|
478
|
+
// For condition nodes, edge labels become transition events
|
|
479
|
+
{ source: '3', target: '4', label: 'YES' }
|
|
480
|
+
// Triggers: state.on.YES
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
### Q: Parallel nodes not handled?
|
|
484
|
+
|
|
485
|
+
Parallel nodes create nested state configurations:
|
|
486
|
+
|
|
487
|
+
```typescript
|
|
488
|
+
{
|
|
489
|
+
type: 'parallel',
|
|
490
|
+
states: {
|
|
491
|
+
trackA: { initial: 'a1', states: { a1: {}, a2: {} } },
|
|
492
|
+
trackB: { initial: 'b1', states: { b1: {}, b2: {} } },
|
|
493
|
+
},
|
|
494
|
+
}
|
|
495
|
+
```
|
|
61
496
|
|
|
62
|
-
|
|
497
|
+
## Related Packages
|
|
63
498
|
|
|
64
|
-
-
|
|
65
|
-
- `initial` — Initial state label
|
|
66
|
-
- `states` — Map of state labels to `{ on: { EVENT: targetState }, meta: { type } }`
|
|
499
|
+
None - standalone workflow package
|
|
67
500
|
|
|
68
|
-
##
|
|
501
|
+
## License
|
|
69
502
|
|
|
70
|
-
|
|
503
|
+
ISC
|
|
71
504
|
|
|
72
505
|
## Community
|
|
73
506
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-engine.service.js","sourceRoot":"","sources":["../src/workflow-engine.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AAC5C,mCAAoC;AAG7B,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;IAChC,KAAK,CAAC,qBAAqB,CAAC,MAAW;QACrC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC3B,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;QAC9D,MAAM,OAAO,
|
|
1
|
+
{"version":3,"file":"workflow-engine.service.js","sourceRoot":"","sources":["../src/workflow-engine.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AAC5C,mCAAoC;AAG7B,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;IAChC,KAAK,CAAC,qBAAqB,CAAC,MAAW;QACrC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC3B,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;QAC9D,MAAM,OAAO,GAAwB,EAAE,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAA,mBAAU,GAAE,CAAC;QAC7B,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;QAC1C,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;QACvB,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YACxB,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC;YAInE,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAChC,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;YAC9D,CAAC;YACD,MAAM,UAAU,GAAG,EAAE,CAAC;YACtB,MAAM,YAAY,GAAG,EAAE,CAAC;YACxB,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;gBACjC,MAAM,KAAK,GACT,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;oBACjC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;oBAC1B,CAAC,CAAC,QAAQ,CAAC;gBACf,UAAU,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CACjC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,MAAM,CAC5B,CAAC,IAAI,CAAC,KAAK,CAAC;YACf,CAAC;YACD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACzE,YAAY,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;YAC5B,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;YACtC,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG,UAAU,EAAE,CAAC,GAAG;gBACnC,EAAE,EAAE,UAAU;gBACd,IAAI,EAAE,YAAY;aACnB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;IACnD,CAAC;CACF,CAAA;AAvCY,sDAAqB;gCAArB,qBAAqB;IADjC,IAAA,mBAAU,GAAE;GACA,qBAAqB,CAuCjC"}
|