@fsai-flow/workflow 0.0.2 → 0.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.
Files changed (136) hide show
  1. package/dist/README.md +31 -0
  2. package/dist/package.json +42 -0
  3. package/dist/src/index.d.ts +22 -0
  4. package/dist/src/index.d.ts.map +1 -0
  5. package/dist/src/index.js +68 -0
  6. package/dist/src/index.js.map +1 -0
  7. package/dist/src/lib/Constants.d.ts +69 -0
  8. package/dist/src/lib/Constants.d.ts.map +1 -0
  9. package/dist/src/lib/Constants.js +106 -0
  10. package/dist/src/lib/Constants.js.map +1 -0
  11. package/dist/src/lib/DeferredPromise.d.ts +7 -0
  12. package/dist/src/lib/DeferredPromise.d.ts.map +1 -0
  13. package/dist/src/lib/DeferredPromise.js +11 -0
  14. package/dist/src/lib/DeferredPromise.js.map +1 -0
  15. package/dist/src/lib/Expression.d.ts +66 -0
  16. package/dist/src/lib/Expression.d.ts.map +1 -0
  17. package/dist/src/lib/Expression.js +247 -0
  18. package/dist/src/lib/Expression.js.map +1 -0
  19. package/dist/src/lib/Interfaces.d.ts +1623 -0
  20. package/dist/src/lib/Interfaces.d.ts.map +1 -0
  21. package/dist/src/lib/Interfaces.js +44 -0
  22. package/dist/src/lib/Interfaces.js.map +1 -0
  23. package/dist/src/lib/LoggerProxy.d.ts +10 -0
  24. package/dist/src/lib/LoggerProxy.d.ts.map +1 -0
  25. package/dist/src/lib/LoggerProxy.js +40 -0
  26. package/dist/src/lib/LoggerProxy.js.map +1 -0
  27. package/dist/src/lib/MetadataUtils.d.ts +5 -0
  28. package/dist/src/lib/MetadataUtils.d.ts.map +1 -0
  29. package/dist/src/lib/MetadataUtils.js +27 -0
  30. package/dist/src/lib/MetadataUtils.js.map +1 -0
  31. package/dist/src/lib/NodeErrors.d.ts +83 -0
  32. package/dist/src/lib/NodeErrors.d.ts.map +1 -0
  33. package/dist/src/lib/NodeErrors.js +284 -0
  34. package/dist/src/lib/NodeErrors.js.map +1 -0
  35. package/dist/src/lib/NodeHelpers.d.ts +199 -0
  36. package/dist/src/lib/NodeHelpers.d.ts.map +1 -0
  37. package/dist/src/lib/NodeHelpers.js +1335 -0
  38. package/dist/src/lib/NodeHelpers.js.map +1 -0
  39. package/dist/src/lib/ObservableObject.d.ts +6 -0
  40. package/dist/src/lib/ObservableObject.d.ts.map +1 -0
  41. package/dist/src/lib/ObservableObject.js +61 -0
  42. package/dist/src/lib/ObservableObject.js.map +1 -0
  43. package/dist/src/lib/RoutingNode.d.ts +24 -0
  44. package/dist/src/lib/RoutingNode.d.ts.map +1 -0
  45. package/dist/src/lib/RoutingNode.js +528 -0
  46. package/dist/src/lib/RoutingNode.js.map +1 -0
  47. package/dist/src/lib/TelemetryHelpers.d.ts +4 -0
  48. package/dist/src/lib/TelemetryHelpers.d.ts.map +1 -0
  49. package/dist/src/lib/TelemetryHelpers.js +67 -0
  50. package/dist/src/lib/TelemetryHelpers.js.map +1 -0
  51. package/dist/src/lib/TypeValidation.d.ts +22 -0
  52. package/dist/src/lib/TypeValidation.d.ts.map +1 -0
  53. package/dist/src/lib/TypeValidation.js +376 -0
  54. package/dist/src/lib/TypeValidation.js.map +1 -0
  55. package/dist/src/lib/VersionedNodeType.d.ts +10 -0
  56. package/dist/src/lib/VersionedNodeType.d.ts.map +1 -0
  57. package/dist/src/lib/VersionedNodeType.js +24 -0
  58. package/dist/src/lib/VersionedNodeType.js.map +1 -0
  59. package/dist/src/lib/Workflow.d.ts +249 -0
  60. package/dist/src/lib/Workflow.d.ts.map +1 -0
  61. package/dist/src/lib/Workflow.js +899 -0
  62. package/dist/src/lib/Workflow.js.map +1 -0
  63. package/dist/src/lib/WorkflowDataProxy.d.ts +88 -0
  64. package/dist/src/lib/WorkflowDataProxy.d.ts.map +1 -0
  65. package/dist/src/lib/WorkflowDataProxy.js +583 -0
  66. package/dist/src/lib/WorkflowDataProxy.js.map +1 -0
  67. package/dist/src/lib/WorkflowErrors.d.ts +10 -0
  68. package/dist/src/lib/WorkflowErrors.d.ts.map +1 -0
  69. package/dist/src/lib/WorkflowErrors.js +18 -0
  70. package/dist/src/lib/WorkflowErrors.js.map +1 -0
  71. package/dist/src/lib/WorkflowHooks.d.ts +12 -0
  72. package/dist/src/lib/WorkflowHooks.d.ts.map +1 -0
  73. package/dist/src/lib/WorkflowHooks.js +32 -0
  74. package/dist/src/lib/WorkflowHooks.js.map +1 -0
  75. package/dist/src/lib/errors/base/base.error.d.ts +30 -0
  76. package/dist/src/lib/errors/base/base.error.d.ts.map +1 -0
  77. package/dist/src/lib/errors/base/base.error.js +47 -0
  78. package/dist/src/lib/errors/base/base.error.js.map +1 -0
  79. package/dist/src/lib/errors/base/operational.error.d.ts +16 -0
  80. package/dist/src/lib/errors/base/operational.error.d.ts.map +1 -0
  81. package/dist/src/lib/errors/base/operational.error.js +19 -0
  82. package/dist/src/lib/errors/base/operational.error.js.map +1 -0
  83. package/dist/src/lib/errors/error.types.d.ts +14 -0
  84. package/dist/src/lib/errors/error.types.d.ts.map +1 -0
  85. package/dist/src/lib/errors/error.types.js +3 -0
  86. package/dist/src/lib/errors/error.types.js.map +1 -0
  87. package/dist/src/lib/errors/index.d.ts +2 -0
  88. package/dist/src/lib/errors/index.d.ts.map +1 -0
  89. package/dist/src/lib/errors/index.js +6 -0
  90. package/dist/src/lib/errors/index.js.map +1 -0
  91. package/dist/src/lib/result.d.ts +20 -0
  92. package/dist/src/lib/result.d.ts.map +1 -0
  93. package/dist/src/lib/result.js +36 -0
  94. package/dist/src/lib/result.js.map +1 -0
  95. package/dist/src/lib/utils.d.ts +51 -0
  96. package/dist/src/lib/utils.d.ts.map +1 -0
  97. package/dist/src/lib/utils.js +119 -0
  98. package/dist/src/lib/utils.js.map +1 -0
  99. package/package.json +49 -35
  100. package/.eslintrc.json +0 -33
  101. package/eslint.config.js +0 -19
  102. package/jest.config.ts +0 -10
  103. package/project.json +0 -19
  104. package/src/index.ts +0 -33
  105. package/src/lib/Constants.ts +0 -124
  106. package/src/lib/DeferredPromise.ts +0 -14
  107. package/src/lib/Expression.ts +0 -375
  108. package/src/lib/Interfaces.ts +0 -2262
  109. package/src/lib/LoggerProxy.ts +0 -43
  110. package/src/lib/MetadataUtils.ts +0 -34
  111. package/src/lib/NodeErrors.ts +0 -332
  112. package/src/lib/NodeHelpers.ts +0 -1666
  113. package/src/lib/ObservableObject.ts +0 -77
  114. package/src/lib/RoutingNode.ts +0 -862
  115. package/src/lib/TelemetryHelpers.ts +0 -86
  116. package/src/lib/TypeValidation.ts +0 -431
  117. package/src/lib/VersionedNodeType.ts +0 -30
  118. package/src/lib/Workflow.ts +0 -1270
  119. package/src/lib/WorkflowDataProxy.ts +0 -708
  120. package/src/lib/WorkflowErrors.ts +0 -18
  121. package/src/lib/WorkflowHooks.ts +0 -51
  122. package/src/lib/errors/base/base.error.ts +0 -68
  123. package/src/lib/errors/base/operational.error.ts +0 -21
  124. package/src/lib/errors/error.types.ts +0 -14
  125. package/src/lib/errors/index.ts +0 -1
  126. package/src/lib/result.ts +0 -34
  127. package/src/lib/utils.ts +0 -166
  128. package/tests/Helpers.ts +0 -667
  129. package/tests/NodeHelpers.test.ts +0 -3053
  130. package/tests/ObservableObject.test.ts +0 -171
  131. package/tests/RoutingNode.test.ts +0 -1680
  132. package/tests/Workflow.test.ts +0 -1284
  133. package/tests/WorkflowDataProxy.test.ts +0 -199
  134. package/tsconfig.json +0 -27
  135. package/tsconfig.lib.json +0 -11
  136. package/tsconfig.spec.json +0 -14
@@ -1,1284 +0,0 @@
1
- import {
2
- IConnections,
3
- INode,
4
- INodeExecutionData,
5
- INodeParameters,
6
- IRunExecutionData,
7
- Workflow,
8
- } from '..';
9
-
10
- process.env['TEST_VARIABLE_1'] = 'valueEnvVariable1';
11
-
12
- import * as Helpers from './Helpers';
13
-
14
- interface StubNode {
15
- name: string;
16
- parameters: INodeParameters;
17
- }
18
-
19
- describe('Workflow', () => {
20
- describe('renameNodeInExpressions', () => {
21
- const tests = [
22
- {
23
- description: 'do nothing if there is no expression',
24
- input: {
25
- currentName: 'Node1',
26
- newName: 'Node1New',
27
- parameters: {
28
- value1: 'value1Node1',
29
- value2: 'value2Node1',
30
- },
31
- },
32
- output: {
33
- value1: 'value1Node1',
34
- value2: 'value2Node1',
35
- },
36
- },
37
- {
38
- description: 'should work with dot notation',
39
- input: {
40
- currentName: 'Node1',
41
- newName: 'NewName',
42
- parameters: {
43
- value1: "={{$node.Node1.data.value1 + 'Node1'}}",
44
- value2: "={{$node.Node1.data.value2 + ' - ' + $node.Node1.data.value2}}",
45
- },
46
- },
47
- output: {
48
- value1: "={{$node.NewName.data.value1 + 'Node1'}}",
49
- value2: "={{$node.NewName.data.value2 + ' - ' + $node.NewName.data.value2}}",
50
- },
51
- },
52
- {
53
- description: 'should work with ["nodeName"]',
54
- input: {
55
- currentName: 'Node1',
56
- newName: 'NewName',
57
- parameters: {
58
- value1: '={{$node["Node1"]["data"]["value1"] + \'Node1\'}}',
59
- value2:
60
- '={{$node["Node1"]["data"]["value2"] + \' - \' + $node["Node1"]["data"]["value2"]}}',
61
- },
62
- },
63
- output: {
64
- value1: '={{$node["NewName"]["data"]["value1"] + \'Node1\'}}',
65
- value2:
66
- '={{$node["NewName"]["data"]["value2"] + \' - \' + $node["NewName"]["data"]["value2"]}}',
67
- },
68
- },
69
- {
70
- description: "should work with ['nodeName']",
71
- input: {
72
- currentName: 'Node1',
73
- newName: 'NewName',
74
- parameters: {
75
- value1: "={{$node['Node1']['data']['value1'] + 'Node1'}}",
76
- value2:
77
- "={{$node['Node1']['data']['value2'] + ' - ' + $node['Node1']['data']['value2']}}",
78
- },
79
- },
80
- output: {
81
- value1: "={{$node['NewName']['data']['value1'] + 'Node1'}}",
82
- value2:
83
- "={{$node['NewName']['data']['value2'] + ' - ' + $node['NewName']['data']['value2']}}",
84
- },
85
- },
86
- {
87
- description: 'should work on lower levels',
88
- input: {
89
- currentName: 'Node1',
90
- newName: 'NewName',
91
- parameters: {
92
- level1a: "={{$node.Node1.data.value1 + 'Node1'}}",
93
- level1b: [
94
- {
95
- value2a: "={{$node.Node1.data.value1 + 'Node1'}}",
96
- value2b: "={{$node.Node1.data.value1 + 'Node1'}}",
97
- },
98
- ],
99
- level1c: {
100
- value2a: {
101
- value3a: "={{$node.Node1.data.value1 + 'Node1'}}",
102
- value3b: [
103
- {
104
- value4a: "={{$node.Node1.data.value1 + 'Node1'}}",
105
- value4b: {
106
- value5a: "={{$node.Node1.data.value1 + 'Node1'}}",
107
- value5b: "={{$node.Node1.data.value1 + 'Node1'}}",
108
- },
109
- },
110
- ],
111
- },
112
- },
113
- } as INodeParameters,
114
- },
115
- output: {
116
- level1a: "={{$node.NewName.data.value1 + 'Node1'}}",
117
- level1b: [
118
- {
119
- value2a: "={{$node.NewName.data.value1 + 'Node1'}}",
120
- value2b: "={{$node.NewName.data.value1 + 'Node1'}}",
121
- },
122
- ],
123
- level1c: {
124
- value2a: {
125
- value3a: "={{$node.NewName.data.value1 + 'Node1'}}",
126
- value3b: [
127
- {
128
- value4a: "={{$node.NewName.data.value1 + 'Node1'}}",
129
- value4b: {
130
- value5a: "={{$node.NewName.data.value1 + 'Node1'}}",
131
- value5b: "={{$node.NewName.data.value1 + 'Node1'}}",
132
- },
133
- },
134
- ],
135
- },
136
- },
137
- },
138
- },
139
- ];
140
-
141
- const nodeTypes = Helpers.NodeTypes();
142
- const workflow = new Workflow({ nodes: [], connections: {}, active: false, nodeTypes });
143
-
144
- for (const testData of tests) {
145
- test(testData.description, () => {
146
- const result = workflow.renameNodeInExpressions(
147
- testData.input.parameters,
148
- testData.input.currentName,
149
- testData.input.newName,
150
- );
151
- expect(result).toEqual(testData.output);
152
- });
153
- }
154
- });
155
-
156
- describe('renameNode', () => {
157
- const tests = [
158
- {
159
- description: 'rename node without connections',
160
- input: {
161
- currentName: 'Node1',
162
- newName: 'Node1New',
163
- nodes: [
164
- {
165
- name: 'Node1',
166
- parameters: {
167
- value1: 'value1Node1',
168
- value2: 'value2Node1',
169
- },
170
- },
171
- ],
172
- connections: {},
173
- },
174
- output: {
175
- nodes: [
176
- {
177
- name: 'Node1New',
178
- parameters: {
179
- value1: 'value1Node1',
180
- value2: 'value2Node1',
181
- },
182
- },
183
- ],
184
- connections: {},
185
- },
186
- },
187
- {
188
- description: 'rename node with one output connection',
189
- input: {
190
- currentName: 'Node1',
191
- newName: 'Node1New',
192
- nodes: [
193
- {
194
- name: 'Node1',
195
- parameters: {
196
- value1: 'value1Node1',
197
- value2: 'value2Node1',
198
- },
199
- },
200
- {
201
- name: 'Node2',
202
- parameters: {
203
- value1: 'value1Node2',
204
- value2: 'value2Node2',
205
- },
206
- },
207
- ],
208
- connections: {
209
- Node1: {
210
- main: [
211
- [
212
- {
213
- node: 'Node2',
214
- type: 'main',
215
- index: 0,
216
- },
217
- ],
218
- ],
219
- },
220
- },
221
- },
222
- output: {
223
- nodes: [
224
- {
225
- name: 'Node1New',
226
- parameters: {
227
- value1: 'value1Node1',
228
- value2: 'value2Node1',
229
- },
230
- },
231
- {
232
- name: 'Node2',
233
- parameters: {
234
- value1: 'value1Node2',
235
- value2: 'value2Node2',
236
- },
237
- },
238
- ],
239
- connections: {
240
- Node1New: {
241
- main: [
242
- [
243
- {
244
- node: 'Node2',
245
- type: 'main',
246
- index: 0,
247
- },
248
- ],
249
- ],
250
- },
251
- },
252
- },
253
- },
254
- {
255
- description: 'rename node with one input connection',
256
- input: {
257
- currentName: 'Node2',
258
- newName: 'Node2New',
259
- nodes: [
260
- {
261
- name: 'Node1',
262
- parameters: {
263
- value1: 'value1Node1',
264
- value2: 'value2Node1',
265
- },
266
- },
267
- {
268
- name: 'Node2',
269
- parameters: {
270
- value1: 'value1Node2',
271
- value2: 'value2Node2',
272
- },
273
- },
274
- ],
275
- connections: {
276
- Node1: {
277
- main: [
278
- [
279
- {
280
- node: 'Node2',
281
- type: 'main',
282
- index: 0,
283
- },
284
- ],
285
- ],
286
- },
287
- },
288
- },
289
- output: {
290
- nodes: [
291
- {
292
- name: 'Node1',
293
- parameters: {
294
- value1: 'value1Node1',
295
- value2: 'value2Node1',
296
- },
297
- },
298
- {
299
- name: 'Node2New',
300
- parameters: {
301
- value1: 'value1Node2',
302
- value2: 'value2Node2',
303
- },
304
- },
305
- ],
306
- connections: {
307
- Node1: {
308
- main: [
309
- [
310
- {
311
- node: 'Node2New',
312
- type: 'main',
313
- index: 0,
314
- },
315
- ],
316
- ],
317
- },
318
- },
319
- },
320
- },
321
- {
322
- description: 'rename node with multiple input and output connection',
323
- input: {
324
- currentName: 'Node3',
325
- newName: 'Node3New',
326
- nodes: [
327
- {
328
- name: 'Node1',
329
- parameters: {
330
- value1: 'value1Node1',
331
- value2: 'value2Node1',
332
- },
333
- },
334
- {
335
- name: 'Node2',
336
- parameters: {
337
- value1: 'value1Node2',
338
- value2: 'value2Node2',
339
- },
340
- },
341
- {
342
- name: 'Node3',
343
- parameters: {
344
- value1: 'value1Node3',
345
- value2: 'value2Node3',
346
- },
347
- },
348
- {
349
- name: 'Node4',
350
- parameters: {
351
- value1: 'value1Node4',
352
- value2: 'value2Node4',
353
- },
354
- },
355
- {
356
- name: 'Node5',
357
- parameters: {
358
- value1: 'value1Node5',
359
- value2: 'value2Node5',
360
- },
361
- },
362
- ],
363
- connections: {
364
- Node1: {
365
- main: [
366
- [
367
- {
368
- node: 'Node3',
369
- type: 'main',
370
- index: 0,
371
- },
372
- ],
373
- ],
374
- },
375
- Node2: {
376
- main: [
377
- [
378
- {
379
- node: 'Node3',
380
- type: 'main',
381
- index: 0,
382
- },
383
- {
384
- node: 'Node5',
385
- type: 'main',
386
- index: 0,
387
- },
388
- ],
389
- ],
390
- },
391
- Node3: {
392
- main: [
393
- [
394
- {
395
- node: 'Node4',
396
- type: 'main',
397
- index: 0,
398
- },
399
- {
400
- node: 'Node5',
401
- type: 'main',
402
- index: 0,
403
- },
404
- ],
405
- ],
406
- },
407
- },
408
- },
409
- output: {
410
- nodes: [
411
- {
412
- name: 'Node1',
413
- parameters: {
414
- value1: 'value1Node1',
415
- value2: 'value2Node1',
416
- },
417
- },
418
- {
419
- name: 'Node2',
420
- parameters: {
421
- value1: 'value1Node2',
422
- value2: 'value2Node2',
423
- },
424
- },
425
- {
426
- name: 'Node3New',
427
- parameters: {
428
- value1: 'value1Node3',
429
- value2: 'value2Node3',
430
- },
431
- },
432
- {
433
- name: 'Node4',
434
- parameters: {
435
- value1: 'value1Node4',
436
- value2: 'value2Node4',
437
- },
438
- },
439
- {
440
- name: 'Node5',
441
- parameters: {
442
- value1: 'value1Node5',
443
- value2: 'value2Node5',
444
- },
445
- },
446
- ],
447
- connections: {
448
- Node1: {
449
- main: [
450
- [
451
- {
452
- node: 'Node3New',
453
- type: 'main',
454
- index: 0,
455
- },
456
- ],
457
- ],
458
- },
459
- Node2: {
460
- main: [
461
- [
462
- {
463
- node: 'Node3New',
464
- type: 'main',
465
- index: 0,
466
- },
467
- {
468
- node: 'Node5',
469
- type: 'main',
470
- index: 0,
471
- },
472
- ],
473
- ],
474
- },
475
- Node3New: {
476
- main: [
477
- [
478
- {
479
- node: 'Node4',
480
- type: 'main',
481
- index: 0,
482
- },
483
- {
484
- node: 'Node5',
485
- type: 'main',
486
- index: 0,
487
- },
488
- ],
489
- ],
490
- },
491
- },
492
- },
493
- },
494
- // This does just a basic test if "renameNodeInExpressions" gets used. More complex
495
- // tests with different formats and levels are in the separate tests for the function
496
- // "renameNodeInExpressions"
497
- {
498
- description: 'change name also in expressions which use node-name (dot notation)',
499
- input: {
500
- currentName: 'Node1',
501
- newName: 'Node1New',
502
- nodes: [
503
- {
504
- name: 'Node1',
505
- parameters: {
506
- value1: 'value1Node1',
507
- value2: 'value2Node1',
508
- },
509
- },
510
- {
511
- name: 'Node2',
512
- parameters: {
513
- value1: "={{$node.Node1.data.value1 + 'Node1'}}",
514
- value2: "={{$node.Node1.data.value2 + ' - ' + $node.Node1.data.value2}}",
515
- },
516
- },
517
- ],
518
- connections: {},
519
- },
520
- output: {
521
- nodes: [
522
- {
523
- name: 'Node1New',
524
- parameters: {
525
- value1: 'value1Node1',
526
- value2: 'value2Node1',
527
- },
528
- },
529
- {
530
- name: 'Node2',
531
- parameters: {
532
- value1: "={{$node.Node1New.data.value1 + 'Node1'}}",
533
- value2: "={{$node.Node1New.data.value2 + ' - ' + $node.Node1New.data.value2}}",
534
- },
535
- },
536
- ],
537
- connections: {},
538
- },
539
- },
540
- ];
541
-
542
- const nodeTypes = Helpers.NodeTypes();
543
- let workflow: Workflow;
544
-
545
- function createNodeData(stubData: StubNode): INode {
546
- return {
547
- name: stubData.name,
548
- parameters: stubData.parameters,
549
- type: 'test.set',
550
- typeVersion: 1,
551
- position: [100, 100],
552
- };
553
- }
554
-
555
- let executeNodes: INode[];
556
- let resultNodes: {
557
- [key: string]: INode;
558
- };
559
-
560
- for (const testData of tests) {
561
- test(testData.description, () => {
562
- executeNodes = [];
563
- for (const node of testData.input.nodes) {
564
- executeNodes.push(createNodeData(node));
565
- }
566
-
567
- workflow = new Workflow({
568
- nodes: executeNodes,
569
- connections: testData.input.connections as IConnections,
570
- active: false,
571
- nodeTypes,
572
- });
573
- workflow.renameNode(testData.input.currentName, testData.input.newName);
574
-
575
- resultNodes = {};
576
- for (const node of testData.output.nodes) {
577
- resultNodes[node.name] = createNodeData(node);
578
- }
579
-
580
- expect(workflow.nodes).toEqual(resultNodes);
581
- expect(workflow.connectionsBySourceNode).toEqual(testData.output.connections);
582
- });
583
- }
584
- });
585
-
586
- describe('getParameterValue', () => {
587
- const tests = [
588
- {
589
- description: 'read simple not expression value',
590
- input: {
591
- Node1: {
592
- parameters: {
593
- value1: 'valueNode1',
594
- },
595
- },
596
- Node2: {
597
- parameters: {
598
- value1: 'valueNode2',
599
- },
600
- },
601
- },
602
- output: {
603
- value1: 'valueNode2',
604
- },
605
- },
606
- {
607
- description: 'read simple math expression',
608
- input: {
609
- Node1: {
610
- parameters: {
611
- value1: '',
612
- },
613
- },
614
- Node2: {
615
- parameters: {
616
- value1: '={{1+2}}',
617
- },
618
- },
619
- },
620
- output: {
621
- value1: 3,
622
- },
623
- },
624
- {
625
- description: 'read data from node-output-data with with long "$node.{NODE}.data" syntax',
626
- input: {
627
- Node1: {
628
- parameters: {
629
- value1: 'valueNode1',
630
- },
631
- },
632
- Node2: {
633
- parameters: {
634
- value1: '={{$node.Node1.data.value1}}',
635
- },
636
- },
637
- },
638
- output: {
639
- value1: 'valueNode1',
640
- },
641
- },
642
- {
643
- description:
644
- 'read data from node-output-data with with long "$node.{NODE}.data" syntax add value and append text',
645
- input: {
646
- Node1: {
647
- parameters: {
648
- value1: 1,
649
- },
650
- },
651
- Node2: {
652
- parameters: {
653
- value1: '={{$node.Node1.data.value1 + 2}} asdf',
654
- },
655
- },
656
- },
657
- output: {
658
- value1: '3 asdf',
659
- },
660
- },
661
- {
662
- description:
663
- 'read deep-data from node-output-data with with long "$node.{NODE}.data" syntax with JavaScript Code',
664
- input: {
665
- Node1: {
666
- parameters: {
667
- value1: 'whatever',
668
- },
669
- // Overwrite the output data
670
- outputJson: {
671
- value1: {
672
- a: 1,
673
- b: 2,
674
- c: 3,
675
- },
676
- },
677
- },
678
- Node2: {
679
- parameters: {
680
- value1: '={{Object.keys($node.Node1.data.value1).join(", ")}}',
681
- },
682
- },
683
- },
684
- output: {
685
- value1: 'a, b, c',
686
- },
687
- },
688
- {
689
- description: 'read data from incoming-node-data with with short "data" syntax',
690
- input: {
691
- Node1: {
692
- parameters: {
693
- value1: 'valueNode1',
694
- },
695
- },
696
- Node2: {
697
- parameters: {
698
- value1: '={{$data.value1}}',
699
- },
700
- },
701
- },
702
- output: {
703
- value1: 'valueNode1',
704
- },
705
- },
706
- {
707
- description: 'read deep-data from incoming-node-data with with short "data" syntax',
708
- input: {
709
- Node1: {
710
- parameters: {
711
- value1: 'whatever',
712
- },
713
- // Overwrite the output data
714
- outputJson: {
715
- value1: {
716
- a: {
717
- b: 'deepDataNode1',
718
- },
719
- },
720
- },
721
- },
722
- Node2: {
723
- parameters: {
724
- value1: '={{$data.value1.a.b}}',
725
- },
726
- },
727
- },
728
- output: {
729
- value1: 'deepDataNode1',
730
- },
731
- },
732
- {
733
- description:
734
- 'read deep-data from node-output-data with with long "$node.{NODE}.data" syntax',
735
- input: {
736
- Node1: {
737
- parameters: {
738
- value1: 'whatever',
739
- },
740
- // Overwrite the output data
741
- outputJson: {
742
- value1: {
743
- a: {
744
- b: 'deepDataNode1',
745
- },
746
- },
747
- },
748
- },
749
- Node2: {
750
- parameters: {
751
- value1: '={{$node.Node1.data.value1.a.b}}',
752
- },
753
- },
754
- },
755
- output: {
756
- value1: 'deepDataNode1',
757
- },
758
- },
759
- {
760
- description:
761
- 'read binary-string-data from incoming-node-data with with short "$binary" syntax',
762
- input: {
763
- Node1: {
764
- parameters: {
765
- value1: 'whatever',
766
- },
767
- // Overwrite the output data
768
- outputBinary: {
769
- binaryKey: {
770
- data: '',
771
- type: '',
772
- fileName: 'test-file1.jpg',
773
- },
774
- },
775
- },
776
- Node2: {
777
- parameters: {
778
- value1: '={{$binary.binaryKey.fileName}}',
779
- },
780
- },
781
- },
782
- output: {
783
- value1: 'test-file1.jpg',
784
- },
785
- },
786
- {
787
- description:
788
- 'read binary-string-data from node-output-data with with long "$node.{NODE}.binary" syntax',
789
- input: {
790
- Node1: {
791
- parameters: {
792
- value1: 'whatever',
793
- },
794
- // Overwrite the output data
795
- outputBinary: {
796
- binaryKey: {
797
- data: '',
798
- type: '',
799
- fileName: 'test-file1.jpg',
800
- },
801
- },
802
- },
803
- Node2: {
804
- parameters: {
805
- value1: '={{$node.Node1.binary.binaryKey.fileName}}',
806
- },
807
- },
808
- },
809
- output: {
810
- value1: 'test-file1.jpg',
811
- },
812
- },
813
- {
814
- description: 'read parameter from other node with with long "$node.parameter" syntax',
815
- input: {
816
- Node1: {
817
- parameters: {
818
- value1: 'valueNode1',
819
- },
820
- },
821
- Node2: {
822
- parameters: {
823
- value1: '={{$node.Node1.parameter.value1}}',
824
- },
825
- },
826
- },
827
- output: {
828
- value1: 'valueNode1',
829
- },
830
- },
831
- {
832
- description: 'read environment data "$env" syntax which exists',
833
- input: {
834
- Node1: {
835
- parameters: {
836
- value1: 'valueNode1',
837
- },
838
- },
839
- Node2: {
840
- parameters: {
841
- value1: '={{$env.TEST_VARIABLE_1}}',
842
- },
843
- },
844
- },
845
- output: {
846
- value1: 'valueEnvVariable1',
847
- },
848
- },
849
- {
850
- description: 'read environment data "$env" syntax which does not exists',
851
- input: {
852
- Node1: {
853
- parameters: {
854
- value1: 'valueNode1',
855
- },
856
- },
857
- Node2: {
858
- parameters: {
859
- value1: '={{$env.DOES_NOT_EXIST}}',
860
- },
861
- },
862
- },
863
- output: {
864
- value1: undefined,
865
- },
866
- },
867
- {
868
- description: 'read parameter from current node with short "$parameter" syntax',
869
- input: {
870
- Node1: {
871
- parameters: {
872
- value1: 'valueNode1',
873
- },
874
- },
875
- Node2: {
876
- parameters: {
877
- value1: 'valueNode2',
878
- value2: '={{$parameter.value1}}',
879
- },
880
- },
881
- },
882
- output: {
883
- value1: 'valueNode2',
884
- value2: 'valueNode2',
885
- },
886
- },
887
- {
888
- description:
889
- 'return resolved value when referencing another property with expression (long "$node.{NODE}.data" syntax)',
890
- input: {
891
- Node1: {
892
- parameters: {
893
- value1: 'valueNode1',
894
- },
895
- },
896
- Node2: {
897
- parameters: {
898
- value1: '={{$node.Node1.data.value1}}',
899
- value2: '={{$parameter.value1}}',
900
- },
901
- },
902
- },
903
- output: {
904
- value1: 'valueNode1',
905
- value2: 'valueNode1',
906
- },
907
- },
908
- {
909
- description:
910
- 'return resolved value when referencing another property with expression (short "data" syntax)',
911
- input: {
912
- Node1: {
913
- parameters: {
914
- value1: 'valueNode1',
915
- },
916
- },
917
- Node2: {
918
- parameters: {
919
- value1: '={{$data.value1}}',
920
- value2: '={{$parameter.value1}}',
921
- },
922
- },
923
- },
924
- output: {
925
- value1: 'valueNode1',
926
- value2: 'valueNode1',
927
- },
928
- },
929
- {
930
- description:
931
- 'return resolved value when referencing another property with expression when a node has spaces (long "$node["{NODE}"].parameter" syntax)',
932
- input: {
933
- Node1: {
934
- parameters: {
935
- value1: 'valueNode1',
936
- },
937
- },
938
- Node2: {
939
- parameters: {
940
- value1: '={{$node["Node 4 with spaces"].parameter.value1}}',
941
- },
942
- },
943
- },
944
- output: {
945
- value1: 'default-value1',
946
- },
947
- },
948
- {
949
- description:
950
- 'return resolved value when referencing another property with expression on another node (long "$node["{NODE}"].parameter" syntax)',
951
- input: {
952
- Node1: {
953
- parameters: {
954
- value1: 'valueNode1',
955
- },
956
- },
957
- Node2: {
958
- parameters: {
959
- value1: '={{$node["Node1"].parameter.value1}}a',
960
- },
961
- },
962
- Node3: {
963
- parameters: {
964
- value1: '={{$node["Node2"].parameter.value1}}b',
965
- },
966
- },
967
- },
968
- output: {
969
- value1: 'valueNode1ab',
970
- },
971
- },
972
- // TODO: Make that this test does not fail!
973
- // {
974
- // description: 'return resolved value when short "data" syntax got used in expression on paramter of not active node which got referenced by active one',
975
- // input: {
976
- // Node1: {
977
- // parameters: {
978
- // value1: 'valueNode1',
979
- // }
980
- // },
981
- // Node2: {
982
- // parameters: {
983
- // value1: '={{$data.value1}}-Node2',
984
- // },
985
- // },
986
- // Node3: {
987
- // parameters: {
988
- // value1: '={{$data.value1}}-Node3+1',
989
- // value2: '={{node.Node2.data.value1}}-Node3+2',
990
- // },
991
- // }
992
- // },
993
- // output: {
994
- // value1: 'valueNode1-Node2-Node3+1',
995
- // value2: 'valueNode1-Node2-Node3+2',
996
- // },
997
- // },
998
- ];
999
-
1000
- const nodeTypes = Helpers.NodeTypes();
1001
-
1002
- for (const testData of tests) {
1003
- test(testData.description, () => {
1004
- const nodes: INode[] = [
1005
- {
1006
- name: 'Node1',
1007
- parameters: testData.input.Node1.parameters,
1008
- type: 'test.set',
1009
- typeVersion: 1,
1010
- position: [100, 100],
1011
- },
1012
- {
1013
- name: 'Node2',
1014
- parameters: testData.input.Node2.parameters,
1015
- type: 'test.set',
1016
- typeVersion: 1,
1017
- position: [100, 200],
1018
- },
1019
- {
1020
- name: 'Node3',
1021
- // @ts-ignore
1022
- parameters: testData.input.hasOwnProperty('Node3')
1023
- ? // @ts-ignore
1024
- testData.input.Node3.parameters
1025
- : {},
1026
- type: 'test.set',
1027
- typeVersion: 1,
1028
- position: [100, 300],
1029
- },
1030
- {
1031
- name: 'Node 4 with spaces',
1032
- // @ts-ignore
1033
- parameters: testData.input.hasOwnProperty('Node4')
1034
- ? // @ts-ignore
1035
- testData.input.Node4.parameters
1036
- : {},
1037
- type: 'test.set',
1038
- typeVersion: 1,
1039
- position: [100, 400],
1040
- },
1041
- ];
1042
- const connections: IConnections = {
1043
- Node1: {
1044
- main: [
1045
- [
1046
- {
1047
- node: 'Node2',
1048
- type: 'main',
1049
- index: 0,
1050
- },
1051
- ],
1052
- ],
1053
- },
1054
- Node2: {
1055
- main: [
1056
- [
1057
- {
1058
- node: 'Node3',
1059
- type: 'main',
1060
- index: 0,
1061
- },
1062
- ],
1063
- ],
1064
- },
1065
- };
1066
-
1067
- const workflow = new Workflow({ nodes, connections, active: false, nodeTypes });
1068
- const activeNodeName = testData.input.hasOwnProperty('Node3') ? 'Node3' : 'Node2';
1069
-
1070
- const runExecutionData: IRunExecutionData = {
1071
- resultData: {
1072
- runData: {
1073
- Node1: [
1074
- {
1075
- startTime: 1,
1076
- executionTime: 1,
1077
- // @ts-ignore
1078
- data: {
1079
- main: [
1080
- [
1081
- {
1082
- // @ts-ignore
1083
- json: testData.input.Node1.outputJson || testData.input.Node1.parameters,
1084
- // @ts-ignore
1085
- binary: testData.input.Node1.outputBinary,
1086
- },
1087
- ],
1088
- ],
1089
- },
1090
- },
1091
- ],
1092
- },
1093
- },
1094
- };
1095
-
1096
- const itemIndex = 0;
1097
- const runIndex = 0;
1098
- const connectionInputData: INodeExecutionData[] =
1099
- runExecutionData.resultData.runData!['Node1']![0]!.data!['main'][0]!;
1100
-
1101
- for (const parameterName of Object.keys(testData.output)) {
1102
- const parameterValue = nodes.find((node) => node.name === activeNodeName)!.parameters[
1103
- parameterName
1104
- ];
1105
- const result = workflow.expression.getParameterValue(
1106
- parameterValue,
1107
- runExecutionData,
1108
- runIndex,
1109
- itemIndex,
1110
- activeNodeName,
1111
- connectionInputData,
1112
- 'manual',
1113
- {},
1114
- );
1115
- // @ts-ignore
1116
- expect(result).toEqual(testData.output[parameterName]);
1117
- }
1118
- });
1119
- }
1120
-
1121
- // test('should be able to set and read key data without initial data set', () => {
1122
-
1123
- // const nodes: Node[] = [
1124
- // {
1125
- // "name": "Node1",
1126
- // "parameters": {
1127
- // "value": "outputSet1"
1128
- // },
1129
- // "type": "test.set",
1130
- // "typeVersion": 1,
1131
- // "position": [
1132
- // 100,
1133
- // 200
1134
- // ]
1135
- // },
1136
- // {
1137
- // "name": "Node2",
1138
- // "parameters": {
1139
- // "name": "=[data.propertyName]"
1140
- // },
1141
- // "type": "test.set",
1142
- // "typeVersion": 1,
1143
- // "position": [
1144
- // 100,
1145
- // 300
1146
- // ]
1147
- // }
1148
- // ];
1149
- // const connections: Connections = {
1150
- // "Node1": {
1151
- // "main": [
1152
- // [
1153
- // {
1154
- // "node": "Node2",
1155
- // "type": "main",
1156
- // "index": 0
1157
- // }
1158
- // ]
1159
- // ]
1160
- // }
1161
- // };
1162
-
1163
- // const nodeTypes = Helpers.NodeTypes();
1164
- // const workflow = new Workflow({ nodes, connections, active: false, nodeTypes });
1165
- // const activeNodeName = 'Node2';
1166
-
1167
- // // @ts-ignore
1168
- // const parameterValue = nodes.find((node) => node.name === activeNodeName).parameters.name;
1169
- // // const parameterValue = '=[data.propertyName]'; // TODO: Make this dynamic from node-data via "activeNodeName"!
1170
- // const runData: RunData = {
1171
- // Node1: [
1172
- // {
1173
- // startTime: 1,
1174
- // executionTime: 1,
1175
- // data: {
1176
- // main: [
1177
- // [
1178
- // {
1179
- // json: {
1180
- // propertyName: 'outputSet1'
1181
- // }
1182
- // }
1183
- // ]
1184
- // ]
1185
- // }
1186
- // }
1187
- // ]
1188
- // };
1189
-
1190
- // const itemIndex = 0;
1191
- // const connectionInputData: NodeExecutionData[] = runData!['Node1']![0]!.data!.main[0]!;
1192
-
1193
- // const result = workflow.getParameterValue(parameterValue, runData, itemIndex, activeNodeName, connectionInputData);
1194
-
1195
- // expect(result).toEqual('outputSet1');
1196
- // });
1197
-
1198
- test('should also resolve all child parameters when the parent get requested', () => {
1199
- const nodeTypes = Helpers.NodeTypes();
1200
-
1201
- const nodes: INode[] = [
1202
- {
1203
- name: 'Node1',
1204
- parameters: {
1205
- values: {
1206
- string: [
1207
- {
1208
- name: 'name1',
1209
- value: 'value1',
1210
- },
1211
- {
1212
- name: 'name2',
1213
- value: '={{$parameter.values.string[0].value}}A',
1214
- },
1215
- ],
1216
- },
1217
- },
1218
- type: 'test.setMulti',
1219
- typeVersion: 1,
1220
- position: [100, 100],
1221
- },
1222
- ];
1223
- const connections: IConnections = {};
1224
-
1225
- const workflow = new Workflow({ nodes, connections, active: false, nodeTypes });
1226
- const activeNodeName = 'Node1';
1227
-
1228
- const runExecutionData: IRunExecutionData = {
1229
- resultData: {
1230
- runData: {
1231
- Node1: [
1232
- {
1233
- startTime: 1,
1234
- executionTime: 1,
1235
- data: {
1236
- main: [
1237
- [
1238
- {
1239
- json: {},
1240
- },
1241
- ],
1242
- ],
1243
- },
1244
- },
1245
- ],
1246
- },
1247
- },
1248
- };
1249
-
1250
- const itemIndex = 0;
1251
- const runIndex = 0;
1252
- const connectionInputData: INodeExecutionData[] =
1253
- runExecutionData.resultData.runData!['Node1']![0]!.data!['main'][0]!;
1254
- const parameterName = 'values';
1255
-
1256
- const parameterValue = nodes.find((node) => node.name === activeNodeName)!.parameters[
1257
- parameterName
1258
- ];
1259
- const result = workflow.expression.getParameterValue(
1260
- parameterValue,
1261
- runExecutionData,
1262
- runIndex,
1263
- itemIndex,
1264
- activeNodeName,
1265
- connectionInputData,
1266
- 'manual',
1267
- {},
1268
- );
1269
-
1270
- expect(result).toEqual({
1271
- string: [
1272
- {
1273
- name: 'name1',
1274
- value: 'value1',
1275
- },
1276
- {
1277
- name: 'name2',
1278
- value: 'value1A',
1279
- },
1280
- ],
1281
- });
1282
- });
1283
- });
1284
- });