windmill-components 1.394.7 → 1.405.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 (227) hide show
  1. package/package/ata/edgeCases.d.ts +0 -1
  2. package/package/ata/edgeCases.js +2 -8
  3. package/package/ata/index.js +4 -3
  4. package/package/common.d.ts +1 -1
  5. package/package/common.js +2 -2
  6. package/package/components/ApiConnectForm.svelte +33 -7
  7. package/package/components/ArgInput.svelte +4 -2
  8. package/package/components/CenteredModal.svelte +4 -1
  9. package/package/components/CenteredModal.svelte.d.ts +1 -0
  10. package/package/components/DateInput.svelte +2 -0
  11. package/package/components/DateInput.svelte.d.ts +1 -0
  12. package/package/components/DefaultScripts.svelte +8 -3
  13. package/package/components/DefaultScripts.svelte.d.ts +5 -1
  14. package/package/components/DefaultScriptsInner.svelte +16 -7
  15. package/package/components/DefaultScriptsInner.svelte.d.ts +3 -1
  16. package/package/components/Dev.svelte +68 -11
  17. package/package/components/DropdownV2.svelte.d.ts +3 -3
  18. package/package/components/DropdownV2Inner.svelte.d.ts +3 -3
  19. package/package/components/EditableSchemaForm.svelte +1 -0
  20. package/package/components/Editor.svelte +3 -2
  21. package/package/components/Editor.svelte.d.ts +1 -1
  22. package/package/components/ExecutionDuration.svelte +44 -0
  23. package/package/components/ExecutionDuration.svelte.d.ts +24 -0
  24. package/package/components/FlowBuilder.svelte +20 -12
  25. package/package/components/FlowGraphViewer.svelte +9 -2
  26. package/package/components/FlowGraphViewerStep.svelte +23 -10
  27. package/package/components/FlowJobResult.svelte +0 -1
  28. package/package/components/FlowStatusViewerInner.svelte +17 -4
  29. package/package/components/FlowTimeline.svelte +3 -3
  30. package/package/components/HighlightCode.svelte +3 -0
  31. package/package/components/IconedResourceType.svelte +17 -10
  32. package/package/components/IconedResourceType.svelte.d.ts +2 -0
  33. package/package/components/IdEditorInput.svelte +0 -1
  34. package/package/components/InstanceSettings.svelte +247 -129
  35. package/package/components/InstanceSettings.svelte.d.ts +2 -0
  36. package/package/components/JobArgs.svelte +3 -1
  37. package/package/components/LightweightArgInput.svelte +35 -10
  38. package/package/components/LightweightArgInput.svelte.d.ts +1 -0
  39. package/package/components/LightweightObjectResourceInput.svelte +2 -0
  40. package/package/components/LightweightObjectResourceInput.svelte.d.ts +1 -0
  41. package/package/components/LightweightSchemaForm.svelte +2 -0
  42. package/package/components/LightweightSchemaForm.svelte.d.ts +1 -0
  43. package/package/components/Login.svelte +10 -5
  44. package/package/components/Login.svelte.d.ts +1 -0
  45. package/package/components/ModulePreview.svelte +21 -2
  46. package/package/components/ModuleStatus.svelte +3 -0
  47. package/package/components/ModuleStatus.svelte.d.ts +1 -0
  48. package/package/components/OAuthSetting.svelte +40 -15
  49. package/package/components/ObjectStoreConfigSettings.svelte +78 -76
  50. package/package/components/ParqetCsvTableRenderer.svelte +25 -3
  51. package/package/components/Password.svelte.d.ts +1 -1
  52. package/package/components/Path.svelte +74 -54
  53. package/package/components/Path.svelte.d.ts +2 -1
  54. package/package/components/ResourceEditor.svelte +38 -9
  55. package/package/components/ResultJobLoader.svelte +6 -3
  56. package/package/components/ResultJobLoader.svelte.d.ts +1 -1
  57. package/package/components/ScheduleEditorInner.svelte +2 -2
  58. package/package/components/SchemaForm.svelte +6 -1
  59. package/package/components/ScriptBuilder.svelte +12 -5
  60. package/package/components/ScriptEditor.svelte +33 -3
  61. package/package/components/ScriptEditor.svelte.d.ts +1 -1
  62. package/package/components/Scrollable.svelte +47 -0
  63. package/package/components/Scrollable.svelte.d.ts +21 -0
  64. package/package/components/ShareModal.svelte.d.ts +2 -2
  65. package/package/components/SuperadminSettings.svelte +5 -7
  66. package/package/components/TestJobLoader.svelte +46 -5
  67. package/package/components/TestJobLoader.svelte.d.ts +2 -1
  68. package/package/components/ToggleHubWorkspaceQuick.svelte +14 -0
  69. package/package/components/ToggleHubWorkspaceQuick.svelte.d.ts +16 -0
  70. package/package/components/WorkspaceGroup.svelte +3 -2
  71. package/package/components/apps/components/helpers/DebouncedInput.svelte +9 -1
  72. package/package/components/apps/components/inputs/AppSelect.svelte +1 -1
  73. package/package/components/apps/editor/component/components.d.ts +79 -79
  74. package/package/components/apps/svelte-select/lib/Select.svelte +1 -1
  75. package/package/components/common/fileUpload/FileUpload.svelte +1 -1
  76. package/package/components/common/languageIcons/LanguageIcon.svelte +5 -2
  77. package/package/components/common/menu/Menu.svelte +2 -1
  78. package/package/components/common/menu/MenuV2.svelte +3 -1
  79. package/package/components/common/menu/MenuV2.svelte.d.ts +1 -0
  80. package/package/components/common/popup/Popup.svelte +22 -12
  81. package/package/components/common/popup/Popup.svelte.d.ts +2 -0
  82. package/package/components/common/popup/PopupV2.svelte +58 -0
  83. package/package/components/common/popup/PopupV2.svelte.d.ts +27 -0
  84. package/package/components/copilot/CronGen.svelte +1 -1
  85. package/package/components/copilot/RegexGen.svelte +4 -4
  86. package/package/components/copilot/StepGen.svelte +6 -6
  87. package/package/components/copilot/StepGenQuick.svelte +57 -0
  88. package/package/components/copilot/StepGenQuick.svelte.d.ts +23 -0
  89. package/package/components/copilot/flow.d.ts +2 -0
  90. package/package/components/copilot/flow.js +55 -0
  91. package/package/components/details/DetailPageDetailPanel.svelte +9 -1
  92. package/package/components/details/DetailPageDetailPanel.svelte.d.ts +2 -1
  93. package/package/components/details/DetailPageLayout.svelte +2 -0
  94. package/package/components/details/DetailPageLayout.svelte.d.ts +3 -0
  95. package/package/components/details/utils.d.ts +0 -1
  96. package/package/components/details/utils.js +1 -12
  97. package/package/components/flows/FlowEditor.svelte +2 -1
  98. package/package/components/flows/FlowProgressBar.svelte +16 -1
  99. package/package/components/flows/FlowProgressBar.svelte.d.ts +1 -0
  100. package/package/components/flows/content/FlowBranchesAllWrapper.svelte +8 -0
  101. package/package/components/flows/content/FlowBranchesAllWrapper.svelte.d.ts +1 -0
  102. package/package/components/flows/content/FlowBranchesOneWrapper.svelte +8 -0
  103. package/package/components/flows/content/FlowBranchesOneWrapper.svelte.d.ts +1 -0
  104. package/package/components/flows/content/FlowConstants.svelte +1 -1
  105. package/package/components/flows/content/FlowEditorPanel.svelte +3 -0
  106. package/package/components/flows/content/FlowInputs.svelte +7 -6
  107. package/package/components/flows/content/FlowInputs.svelte.d.ts +1 -0
  108. package/package/components/flows/content/FlowInputsFlowQuick.svelte +65 -0
  109. package/package/components/flows/content/FlowInputsFlowQuick.svelte.d.ts +19 -0
  110. package/package/components/flows/content/FlowInputsQuick.svelte +419 -0
  111. package/package/components/flows/content/FlowInputsQuick.svelte.d.ts +33 -0
  112. package/package/components/flows/content/FlowLoop.svelte +7 -1
  113. package/package/components/flows/content/FlowModuleComponent.svelte +12 -3
  114. package/package/components/flows/content/FlowModuleComponent.svelte.d.ts +1 -0
  115. package/package/components/flows/content/FlowModuleSkip.svelte +69 -0
  116. package/package/components/flows/content/FlowModuleSkip.svelte.d.ts +20 -0
  117. package/package/components/flows/content/FlowModuleWrapper.svelte +17 -4
  118. package/package/components/flows/content/FlowPreprocessorModule.svelte +16 -0
  119. package/package/components/flows/content/FlowPreprocessorModule.svelte.d.ts +16 -0
  120. package/package/components/flows/content/FlowWhileLoop.svelte +9 -0
  121. package/package/components/flows/content/FlowWhileLoop.svelte.d.ts +1 -0
  122. package/package/components/flows/content/GenAiQuick.svelte +30 -0
  123. package/package/components/flows/content/GenAiQuick.svelte.d.ts +20 -0
  124. package/package/components/flows/content/ScriptEditorDrawer.svelte +3 -2
  125. package/package/components/flows/flowInfers.js +1 -1
  126. package/package/components/flows/header/FlowPreviewButtons.svelte +1 -0
  127. package/package/components/flows/idUtils.js +3 -1
  128. package/package/components/flows/map/FlowCopilotButton.svelte +55 -0
  129. package/package/components/flows/map/FlowCopilotButton.svelte.d.ts +16 -0
  130. package/package/components/flows/map/FlowErrorHandlerItem.svelte +77 -47
  131. package/package/components/flows/map/FlowJobsMenu.svelte +1 -1
  132. package/package/components/flows/map/FlowModuleSchemaItem.svelte +25 -12
  133. package/package/components/flows/map/FlowModuleSchemaItem.svelte.d.ts +1 -0
  134. package/package/components/flows/map/FlowModuleSchemaMap.svelte +61 -18
  135. package/package/components/flows/map/InsertModuleButton.svelte +161 -138
  136. package/package/components/flows/map/InsertModuleButton.svelte.d.ts +7 -4
  137. package/package/components/flows/map/MapItem.svelte +11 -0
  138. package/package/components/flows/map/MapItem.svelte.d.ts +1 -0
  139. package/package/components/flows/pickers/FlowScriptPickerQuick.svelte +48 -0
  140. package/package/components/flows/pickers/FlowScriptPickerQuick.svelte.d.ts +23 -0
  141. package/package/components/flows/pickers/FlowToplevelNode.svelte +19 -0
  142. package/package/components/flows/pickers/FlowToplevelNode.svelte.d.ts +19 -0
  143. package/package/components/flows/pickers/PickHubScriptQuick.svelte +138 -0
  144. package/package/components/flows/pickers/PickHubScriptQuick.svelte.d.ts +33 -0
  145. package/package/components/flows/pickers/TopLevelNode.svelte +58 -0
  146. package/package/components/flows/pickers/TopLevelNode.svelte.d.ts +21 -0
  147. package/package/components/flows/pickers/WorkspaceScriptPickerQuick.svelte +120 -0
  148. package/package/components/flows/pickers/WorkspaceScriptPickerQuick.svelte.d.ts +35 -0
  149. package/package/components/flows/types.d.ts +1 -0
  150. package/package/components/graph/FlowGraphV2.svelte +93 -58
  151. package/package/components/graph/FlowGraphV2.svelte.d.ts +2 -1
  152. package/package/components/graph/graphBuilder.d.ts +2 -1
  153. package/package/components/graph/graphBuilder.js +345 -280
  154. package/package/components/graph/model.d.ts +1 -0
  155. package/package/components/graph/renderers/edges/BaseEdge.svelte +36 -14
  156. package/package/components/graph/renderers/nodes/BranchOneStart.svelte +1 -1
  157. package/package/components/graph/renderers/nodes/InputNode.svelte +31 -51
  158. package/package/components/graph/renderers/nodes/InputNode.svelte.d.ts +6 -1
  159. package/package/components/graph/renderers/nodes/ModuleNode.svelte +2 -1
  160. package/package/components/graph/util.d.ts +1 -1
  161. package/package/components/graph/util.js +7 -2
  162. package/package/components/home/ListFiltersQuick.svelte +51 -0
  163. package/package/components/home/ListFiltersQuick.svelte.d.ts +23 -0
  164. package/package/components/icons/AnsibleIcon.svelte +42 -0
  165. package/package/components/icons/AnsibleIcon.svelte.d.ts +25 -0
  166. package/package/components/icons/WindmillIcon2.svelte +141 -0
  167. package/package/components/icons/WindmillIcon2.svelte.d.ts +20 -0
  168. package/package/components/icons/index.d.ts +2 -1
  169. package/package/components/icons/index.js +2 -1
  170. package/package/components/instanceSettings.d.ts +2 -2
  171. package/package/components/instanceSettings.js +25 -58
  172. package/package/components/jobs/JobProgressBar.svelte +52 -0
  173. package/package/components/jobs/JobProgressBar.svelte.d.ts +23 -0
  174. package/package/components/progressBar/ProgressBar.svelte +18 -1
  175. package/package/components/progressBar/ProgressBar.svelte.d.ts +3 -0
  176. package/package/components/runs/JobPreview.svelte +1 -0
  177. package/package/components/runs/PreprocessedArgsDisplay.svelte +71 -0
  178. package/package/components/runs/PreprocessedArgsDisplay.svelte.d.ts +16 -0
  179. package/package/components/schema/AddProperty.svelte +1 -0
  180. package/package/components/schema/EditableSchemaWrapper.svelte +142 -19
  181. package/package/components/schema/EditableSchemaWrapper.svelte.d.ts +1 -0
  182. package/package/components/schema/FlowPropertyEditor.svelte +12 -0
  183. package/package/components/schema/FlowPropertyEditor.svelte.d.ts +1 -0
  184. package/package/components/scriptEditor/LogPanel.svelte +1 -0
  185. package/package/components/scriptEditor/LogPanel.svelte.d.ts +3 -1
  186. package/package/components/search/GlobalSearchModal.svelte +2 -1
  187. package/package/components/sidebar/SidebarContent.svelte +69 -8
  188. package/package/components/sidebar/changelogs.js +10 -0
  189. package/package/components/triggers/RouteEditor.svelte +19 -0
  190. package/package/components/triggers/RouteEditor.svelte.d.ts +21 -0
  191. package/package/components/triggers/RouteEditorInner.svelte +327 -0
  192. package/package/components/triggers/RouteEditorInner.svelte.d.ts +21 -0
  193. package/package/components/triggers/RoutesPanel.svelte +74 -0
  194. package/package/components/triggers/RoutesPanel.svelte.d.ts +17 -0
  195. package/package/editorUtils.js +2 -0
  196. package/package/gen/core/OpenAPI.js +1 -1
  197. package/package/gen/schemas.gen.d.ts +159 -8
  198. package/package/gen/schemas.gen.js +161 -8
  199. package/package/gen/services.gen.d.ts +139 -1
  200. package/package/gen/services.gen.js +282 -1
  201. package/package/gen/types.gen.d.ts +455 -12
  202. package/package/hubPaths.json +6 -8
  203. package/package/infer.d.ts +4 -2
  204. package/package/infer.js +25 -23
  205. package/package/inferArgSig.js +8 -2
  206. package/package/monaco_workers/build_workers.js +8 -13
  207. package/package/monaco_workers/graphql.worker.bundle.js +45440 -174
  208. package/package/relative_imports.d.ts +3 -0
  209. package/package/relative_imports.js +25 -0
  210. package/package/script_helpers.d.ts +7 -2
  211. package/package/script_helpers.js +151 -3
  212. package/package/scripts.d.ts +1 -1
  213. package/package/scripts.js +5 -1
  214. package/package/stores.d.ts +1 -0
  215. package/package/stores.js +1 -0
  216. package/package/utils.d.ts +1 -0
  217. package/package/utils.js +4 -0
  218. package/package.json +16 -7
  219. package/package/components/flows/map/InsertTriggerButton.svelte +0 -48
  220. package/package/components/flows/map/InsertTriggerButton.svelte.d.ts +0 -24
  221. package/package/monaco_workers/cssWorker-es.js +0 -43763
  222. package/package/monaco_workers/editorWorker-es.d.ts +0 -2
  223. package/package/monaco_workers/editorWorker-es.js +0 -8066
  224. package/package/monaco_workers/htmlWorker-es.js +0 -21551
  225. package/package/monaco_workers/jsonWorker-es.js +0 -13523
  226. package/package/monaco_workers/tsWorker-es.d.ts +0 -103
  227. package/package/monaco_workers/tsWorker-es.js +0 -212193
@@ -2,335 +2,400 @@ import {} from '@xyflow/svelte';
2
2
  import { getDependeeAndDependentComponents } from '../flows/flowExplorer';
3
3
  import { dfsByModule } from '../flows/previousResults';
4
4
  import { defaultIfEmptyString } from '../../utils';
5
- export default function graphBuilder(modules, extra, failureModule, eventHandlers, success, useDataflow, selectedId, moving) {
5
+ export default function graphBuilder(modules, extra, failureModule, preprocessorModule, eventHandlers, success, useDataflow, selectedId, moving) {
6
6
  const nodes = [];
7
7
  const edges = [];
8
- if (!modules) {
9
- return { nodes, edges };
10
- }
11
- function addNode(module, offset, type, subModules) {
12
- nodes.push({
13
- id: module.id,
8
+ try {
9
+ if (!modules) {
10
+ return { nodes, edges };
11
+ }
12
+ function addNode(module, offset, type, subModules) {
13
+ if (nodes.some((n) => n.id === module.id)) {
14
+ throw new Error(`Duplicated node detected: ${module.id}`);
15
+ }
16
+ nodes.push({
17
+ id: module.id,
18
+ data: {
19
+ value: module.value,
20
+ offset: offset,
21
+ module: module,
22
+ modules: subModules ?? modules,
23
+ parentIds: [],
24
+ eventHandlers: eventHandlers,
25
+ moving: moving,
26
+ ...extra
27
+ },
28
+ position: { x: -1, y: -1 },
29
+ type: type
30
+ });
31
+ return module.id;
32
+ }
33
+ const parents = {};
34
+ //
35
+ function detectCycle(nodeId, visited, currentPath) {
36
+ // If the node hasn't been visited yet
37
+ if (!visited.has(nodeId)) {
38
+ visited.add(nodeId);
39
+ currentPath.add(nodeId);
40
+ // If the current node has parent nodes
41
+ if (parents[nodeId]) {
42
+ // Check each parent node
43
+ // Nodes can have multiple parents: the node that gathers the result for branches or loops for instance
44
+ for (const parentNode of parents[nodeId]) {
45
+ // If the parentNode hasn't been visited and a cycle is detected in its path
46
+ if (!visited.has(parentNode) && detectCycle(parentNode, visited, currentPath)) {
47
+ return true; // Cycle detected
48
+ }
49
+ // If the parentNode is already in the current path, it's a cycle
50
+ else if (currentPath.has(parentNode)) {
51
+ return true; // Cycle detected
52
+ }
53
+ }
54
+ }
55
+ }
56
+ // Remove the node from the current path as we're done processing it
57
+ currentPath.delete(nodeId);
58
+ // No cycle detected for this path
59
+ return false;
60
+ }
61
+ function addEdge(sourceId, targetId, options) {
62
+ parents[targetId] = [...(parents[targetId] ?? []), sourceId];
63
+ const mods = options?.subModules ?? modules;
64
+ let index = mods?.findIndex((m) => m.id === targetId) ?? -1;
65
+ const visited = new Set();
66
+ const recStack = new Set();
67
+ if (detectCycle(sourceId, visited, recStack)) {
68
+ throw new Error(`Cycle detected: adding edge from '${sourceId}' to '${targetId}' would create a cycle.`);
69
+ }
70
+ edges.push({
71
+ id: options?.customId || `edge:${sourceId}->${targetId}`,
72
+ source: sourceId,
73
+ target: targetId,
74
+ type: options?.type ?? 'edge',
75
+ data: {
76
+ insertable: extra.insertable,
77
+ modules: options?.subModules ?? modules,
78
+ sourceId,
79
+ targetId,
80
+ moving,
81
+ eventHandlers,
82
+ disableMoveIds: options?.disableMoveIds,
83
+ enableTrigger: sourceId === 'Input',
84
+ // If the index is -1, it means that the target module is not in the modules array, so we set it to the length of the array
85
+ index: index >= 0 ? index : mods?.length ?? 0,
86
+ ...extra
87
+ }
88
+ });
89
+ }
90
+ const inputNode = {
91
+ id: 'Input',
92
+ position: { x: -1, y: -1 },
93
+ type: 'input2',
14
94
  data: {
15
- value: module.value,
16
- offset: offset,
17
- module: module,
18
- modules: subModules ?? modules,
19
- parentIds: [],
20
95
  eventHandlers: eventHandlers,
21
- moving: moving,
96
+ modules: modules,
97
+ hasPreprocessor: !!preprocessorModule,
22
98
  ...extra
23
- },
24
- position: { x: -1, y: -1 },
25
- type: type
26
- });
27
- return module.id;
28
- }
29
- const parents = {};
30
- function addEdge(sourceId, targetId, options) {
31
- parents[targetId] = [...(parents[targetId] ?? []), sourceId];
32
- // Find the index of the target module in the modules array
33
- const mods = options?.subModules ?? modules;
34
- // Index of the target module in the modules array
35
- let index = mods?.findIndex((m) => m.id === targetId) ?? -1;
36
- edges.push({
37
- id: options?.customId || `edge:${sourceId}->${targetId}`,
38
- source: sourceId,
39
- target: targetId,
40
- type: options?.type ?? 'edge',
99
+ }
100
+ };
101
+ const resultNode = {
102
+ id: 'result',
41
103
  data: {
42
- insertable: extra.insertable,
43
- modules: options?.subModules ?? modules,
44
- sourceId,
45
- targetId,
46
- moving,
47
- eventHandlers,
48
- disableMoveIds: options?.disableMoveIds,
49
- enableTrigger: sourceId === 'Input',
50
- // If the index is -1, it means that the target module is not in the modules array, so we set it to the length of the array
51
- index: index >= 0 ? index : mods?.length ?? 0,
104
+ eventHandlers: eventHandlers,
105
+ modules: modules,
106
+ success: success,
52
107
  ...extra
108
+ },
109
+ position: { x: -1, y: -1 },
110
+ type: 'result'
111
+ };
112
+ nodes.push(inputNode);
113
+ nodes.push(resultNode);
114
+ function processModules(modules, beforeNode, nextNode, currentOffset = 0, disableMoveIds = [], parentIndex) {
115
+ let previousId = undefined;
116
+ if (modules.length === 0) {
117
+ addEdge(beforeNode.id, nextNode.id, {
118
+ subModules: modules,
119
+ disableMoveIds
120
+ });
53
121
  }
54
- });
55
- }
56
- const inputNode = {
57
- id: 'Input',
58
- position: { x: -1, y: -1 },
59
- type: 'input2',
60
- data: {
61
- eventHandlers: eventHandlers,
62
- modules: modules,
63
- ...extra
64
- }
65
- };
66
- const resultNode = {
67
- id: 'result',
68
- data: {
69
- eventHandlers: eventHandlers,
70
- modules: modules,
71
- success: success,
72
- ...extra
73
- },
74
- position: { x: -1, y: -1 },
75
- type: 'result'
76
- };
77
- nodes.push(inputNode);
78
- nodes.push(resultNode);
79
- function processModules(modules, beforeNode, nextNode, currentOffset = 0, disableMoveIds = []) {
80
- let previousId = undefined;
81
- if (modules.length === 0) {
82
- addEdge(beforeNode.id, nextNode.id, {
83
- subModules: modules,
84
- disableMoveIds
85
- });
86
- }
87
- else {
88
- modules.forEach((module, index) => {
89
- const localDisableMoveIds = [...disableMoveIds, module.id];
90
- // Add the edge between the previous node and the current one
91
- if (index > 0 && previousId) {
92
- addEdge(previousId, module.id, {
93
- subModules: modules,
94
- disableMoveIds
95
- });
96
- }
97
- if (module.value.type === 'branchall') {
98
- // Start
99
- addNode(module, currentOffset, 'module', modules);
100
- // "Collect result of each branch" node
101
- const endNode = {
102
- id: `${module.id}-end`,
103
- data: {
104
- offset: currentOffset,
105
- id: module.id,
106
- module: module,
107
- modules: modules,
108
- ...extra
109
- },
110
- position: { x: -1, y: -1 },
111
- type: 'branchAllEnd'
112
- };
113
- nodes.push(endNode);
114
- if (module.value.branches.length === 0) {
115
- // Add a "No branches" node
116
- const startNode = {
117
- id: `${module.id}-branch-0`,
122
+ else {
123
+ modules.forEach((module, index) => {
124
+ const localDisableMoveIds = [...disableMoveIds, module.id];
125
+ // Add the edge between the previous node and the current one
126
+ if (index > 0 && previousId) {
127
+ addEdge(previousId, module.id, {
128
+ subModules: modules,
129
+ disableMoveIds
130
+ });
131
+ }
132
+ if (module.value.type === 'branchall') {
133
+ // Start
134
+ addNode(module, currentOffset, 'module', modules);
135
+ // "Collect result of each branch" node
136
+ const endNode = {
137
+ id: `${module.id}-end`,
118
138
  data: {
119
139
  offset: currentOffset,
120
140
  id: module.id,
121
- branchIndex: -1,
141
+ module: module,
122
142
  modules: modules,
123
- eventHandlers: eventHandlers,
124
143
  ...extra
125
144
  },
126
145
  position: { x: -1, y: -1 },
127
- type: 'noBranch'
146
+ type: 'branchAllEnd'
128
147
  };
129
- nodes.push(startNode);
130
- addEdge(module.id, startNode.id, {
131
- type: 'empty'
132
- });
133
- addEdge(startNode.id, endNode.id, {
134
- type: 'empty'
135
- });
136
- }
137
- else {
138
- module.value.branches.forEach((branch, branchIndex) => {
139
- // Start node by branch
148
+ nodes.push(endNode);
149
+ if (module.value.branches.length === 0) {
150
+ // Add a "No branches" node
140
151
  const startNode = {
141
- id: `${module.id}-branch-${branchIndex}`,
152
+ id: `${module.id}-branch-0`,
142
153
  data: {
143
154
  offset: currentOffset,
144
- label: defaultIfEmptyString(branch.summary, `Branch ${branchIndex + 1}`),
145
155
  id: module.id,
146
- branchIndex: branchIndex,
156
+ branchIndex: -1,
147
157
  modules: modules,
148
158
  eventHandlers: eventHandlers,
149
159
  ...extra
150
160
  },
151
161
  position: { x: -1, y: -1 },
152
- type: 'branchAllStart'
162
+ type: 'noBranch'
153
163
  };
154
164
  nodes.push(startNode);
155
165
  addEdge(module.id, startNode.id, {
156
166
  type: 'empty'
157
167
  });
158
- processModules(branch.modules, startNode, endNode, currentOffset, localDisableMoveIds);
159
- });
168
+ addEdge(startNode.id, endNode.id, {
169
+ type: 'empty'
170
+ });
171
+ }
172
+ else {
173
+ module.value.branches.forEach((branch, branchIndex) => {
174
+ // Start node by branch
175
+ const startNode = {
176
+ id: `${module.id}-branch-${branchIndex}`,
177
+ data: {
178
+ offset: currentOffset,
179
+ label: defaultIfEmptyString(branch.summary, `Branch ${branchIndex + 1}`),
180
+ id: module.id,
181
+ branchIndex: branchIndex,
182
+ modules: modules,
183
+ eventHandlers: eventHandlers,
184
+ ...extra
185
+ },
186
+ position: { x: -1, y: -1 },
187
+ type: 'branchAllStart'
188
+ };
189
+ nodes.push(startNode);
190
+ addEdge(module.id, startNode.id, {
191
+ type: 'empty'
192
+ });
193
+ processModules(branch.modules, startNode, endNode, currentOffset, localDisableMoveIds, parentIndex ? `${parentIndex}-${index}-${branchIndex}` : `${index}-${branchIndex}`);
194
+ });
195
+ }
196
+ previousId = endNode.id;
160
197
  }
161
- previousId = endNode.id;
162
- }
163
- else if (module.value.type === 'forloopflow') {
164
- addNode(module, currentOffset, 'module', modules);
165
- const startNode = {
166
- id: `${module.id}-start`,
167
- data: {
168
- offset: currentOffset + 25,
169
- id: module.id,
170
- module: module,
171
- modules: modules,
172
- eventHandlers: eventHandlers,
173
- ...extra
174
- },
175
- position: { x: -1, y: -1 },
176
- type: 'forLoopStart'
177
- };
178
- addEdge(module.id, startNode.id, {
179
- type: 'empty'
180
- });
181
- const endNode = {
182
- id: `${module.id}-end`,
183
- data: {
184
- offset: currentOffset,
185
- id: module.id,
186
- module: module,
187
- modules: modules,
188
- eventHandlers: eventHandlers,
189
- ...extra
190
- },
191
- position: { x: -1, y: -1 },
192
- type: 'forLoopEnd'
193
- };
194
- nodes.push(startNode);
195
- nodes.push(endNode);
196
- processModules(module.value.modules, startNode, endNode, currentOffset + 25, localDisableMoveIds);
197
- previousId = endNode.id;
198
- }
199
- else if (module.value.type === 'whileloopflow') {
200
- addNode(module, currentOffset, 'module', modules);
201
- const startNode = {
202
- id: `${module.id}-start`,
203
- data: {
204
- offset: currentOffset + 25,
205
- module: module,
206
- modules: modules,
207
- eventHandlers: eventHandlers,
208
- ...extra
209
- },
210
- position: { x: -1, y: -1 },
211
- type: 'whileLoopStart'
212
- };
213
- addEdge(module.id, startNode.id, {
214
- type: 'empty'
215
- });
216
- const endNode = {
217
- id: `${module.id}-end`,
218
- data: { offset: currentOffset, module: module, modules: modules, ...extra },
219
- position: { x: -1, y: -1 },
220
- type: 'whileLoopEnd'
221
- };
222
- nodes.push(startNode);
223
- nodes.push(endNode);
224
- processModules(module.value.modules, startNode, endNode, currentOffset + 25, localDisableMoveIds);
225
- previousId = endNode.id;
226
- }
227
- else if (module.value.type === 'branchone') {
228
- addNode(module, currentOffset, 'module', modules);
229
- const endNode = {
230
- id: `${module.id}-end`,
231
- data: { offset: currentOffset, eventHandlers: eventHandlers },
232
- position: { x: -1, y: -1 },
233
- type: 'branchOneEnd'
234
- };
235
- nodes.push(endNode);
236
- // Add default branch
237
- const defaultBranch = {
238
- id: `${module.id}-default`,
239
- data: {
240
- offset: currentOffset,
241
- label: 'Default',
242
- id: module.id,
243
- branchIndex: -1,
244
- modules: module.value.default,
245
- eventHandlers: eventHandlers,
246
- branchOne: true,
247
- ...extra
248
- },
249
- position: { x: -1, y: -1 },
250
- type: 'noBranch'
251
- };
252
- nodes.push(defaultBranch);
253
- addEdge(module.id, defaultBranch.id, { type: 'empty' });
254
- processModules(module.value.default, defaultBranch, endNode, currentOffset, localDisableMoveIds);
255
- module.value.branches.forEach((branch, branchIndex) => {
256
- // Start node by branch
198
+ else if (module.value.type === 'forloopflow') {
199
+ addNode(module, currentOffset, 'module', modules);
257
200
  const startNode = {
258
- id: `${module.id}-branch-${branchIndex}`,
201
+ id: `${module.id}-start`,
202
+ data: {
203
+ offset: currentOffset + 25,
204
+ id: module.id,
205
+ module: module,
206
+ modules: modules,
207
+ eventHandlers: eventHandlers,
208
+ ...extra
209
+ },
210
+ position: { x: -1, y: -1 },
211
+ type: 'forLoopStart'
212
+ };
213
+ addEdge(module.id, startNode.id, {
214
+ type: 'empty'
215
+ });
216
+ const endNode = {
217
+ id: `${module.id}-end`,
259
218
  data: {
260
219
  offset: currentOffset,
261
- label: defaultIfEmptyString(branch.summary, 'Branch ' + (branchIndex + 1)),
262
- preLabel: branch.summary ? '' : branch.expr,
263
220
  id: module.id,
264
- branchIndex: branchIndex,
221
+ module: module,
265
222
  modules: modules,
266
223
  eventHandlers: eventHandlers,
267
224
  ...extra
268
225
  },
269
226
  position: { x: -1, y: -1 },
270
- type: 'branchOneStart'
227
+ type: 'forLoopEnd'
271
228
  };
272
229
  nodes.push(startNode);
273
- addEdge(module.id, startNode.id, { type: 'empty' });
274
- processModules(branch.modules, startNode, endNode, currentOffset, localDisableMoveIds);
275
- });
276
- previousId = endNode.id;
277
- }
278
- else {
279
- addNode(module, currentOffset, 'module', modules);
280
- previousId = module.id;
281
- }
282
- if (index === 0) {
283
- addEdge(beforeNode.id, module.id, {
284
- subModules: modules,
285
- disableMoveIds
286
- });
287
- }
288
- if (index === modules.length - 1 && previousId) {
289
- addEdge(previousId, nextNode.id, {
290
- subModules: modules,
291
- disableMoveIds
292
- });
230
+ nodes.push(endNode);
231
+ const selectedIterIndex = extra.flowModuleStates?.[module.id]?.selectedForloopIndex;
232
+ processModules(module.value.modules, startNode, endNode, currentOffset + 25, localDisableMoveIds, parentIndex
233
+ ? `${parentIndex}-${index}-${selectedIterIndex ?? '?'}`
234
+ : `${index}-${selectedIterIndex ?? '?'}`);
235
+ previousId = endNode.id;
236
+ }
237
+ else if (module.value.type === 'whileloopflow') {
238
+ addNode(module, currentOffset, 'module', modules);
239
+ const startNode = {
240
+ id: `${module.id}-start`,
241
+ data: {
242
+ offset: currentOffset + 25,
243
+ module: module,
244
+ modules: modules,
245
+ eventHandlers: eventHandlers,
246
+ ...extra
247
+ },
248
+ position: { x: -1, y: -1 },
249
+ type: 'whileLoopStart'
250
+ };
251
+ addEdge(module.id, startNode.id, {
252
+ type: 'empty'
253
+ });
254
+ const endNode = {
255
+ id: `${module.id}-end`,
256
+ data: { offset: currentOffset, module: module, modules: modules, ...extra },
257
+ position: { x: -1, y: -1 },
258
+ type: 'whileLoopEnd'
259
+ };
260
+ nodes.push(startNode);
261
+ nodes.push(endNode);
262
+ const selectedIterIndex = extra.flowModuleStates?.[module.id]?.selectedForloopIndex;
263
+ processModules(module.value.modules, startNode, endNode, currentOffset + 25, localDisableMoveIds, parentIndex
264
+ ? `${parentIndex}-${index}-${selectedIterIndex ?? '?'}`
265
+ : `${index}-${selectedIterIndex ?? '?'}`);
266
+ previousId = endNode.id;
267
+ }
268
+ else if (module.value.type === 'branchone') {
269
+ addNode(module, currentOffset, 'module', modules);
270
+ const endNode = {
271
+ id: `${module.id}-end`,
272
+ data: { offset: currentOffset, eventHandlers: eventHandlers },
273
+ position: { x: -1, y: -1 },
274
+ type: 'branchOneEnd'
275
+ };
276
+ nodes.push(endNode);
277
+ // Add default branch
278
+ const defaultBranch = {
279
+ id: `${module.id}-default`,
280
+ data: {
281
+ offset: currentOffset,
282
+ label: 'Default',
283
+ id: module.id,
284
+ branchIndex: -1,
285
+ modules: module.value.default,
286
+ eventHandlers: eventHandlers,
287
+ branchOne: true,
288
+ ...extra
289
+ },
290
+ position: { x: -1, y: -1 },
291
+ type: 'noBranch'
292
+ };
293
+ nodes.push(defaultBranch);
294
+ addEdge(module.id, defaultBranch.id, { type: 'empty' });
295
+ processModules(module.value.default, defaultBranch, endNode, currentOffset, localDisableMoveIds, parentIndex ? `${parentIndex}-${index}` : index.toString());
296
+ module.value.branches.forEach((branch, branchIndex) => {
297
+ // Start node by branch
298
+ const startNode = {
299
+ id: `${module.id}-branch-${branchIndex}`,
300
+ data: {
301
+ offset: currentOffset,
302
+ label: defaultIfEmptyString(branch.summary, 'Branch ' + (branchIndex + 1)),
303
+ preLabel: branch.summary ? '' : branch.expr,
304
+ id: module.id,
305
+ branchIndex: branchIndex,
306
+ modules: modules,
307
+ eventHandlers: eventHandlers,
308
+ ...extra
309
+ },
310
+ position: { x: -1, y: -1 },
311
+ type: 'branchOneStart'
312
+ };
313
+ nodes.push(startNode);
314
+ addEdge(module.id, startNode.id, { type: 'empty' });
315
+ processModules(branch.modules, startNode, endNode, currentOffset, localDisableMoveIds, parentIndex ? `${parentIndex}-${index}` : index.toString());
316
+ });
317
+ previousId = endNode.id;
318
+ }
319
+ else {
320
+ addNode(module, currentOffset, 'module', modules);
321
+ previousId = module.id;
322
+ }
323
+ if (index === 0) {
324
+ addEdge(beforeNode.id, module.id, {
325
+ subModules: modules,
326
+ disableMoveIds
327
+ });
328
+ }
329
+ if (index === modules.length - 1 && previousId) {
330
+ addEdge(previousId, nextNode.id, {
331
+ subModules: modules,
332
+ disableMoveIds
333
+ });
334
+ }
335
+ });
336
+ if (failureModule) {
337
+ const id = parentIndex ? `failure-${parentIndex}` : 'failure';
338
+ const failureState = extra.flowModuleStates?.[id];
339
+ if (failureState && failureState.parent_module) {
340
+ addNode({
341
+ ...failureModule,
342
+ id: id
343
+ }, 0, 'module');
344
+ addEdge(failureState.parent_module, id, { type: 'empty' });
345
+ }
293
346
  }
294
- });
347
+ }
295
348
  }
296
- }
297
- processModules(modules, inputNode, resultNode);
298
- if (failureModule) {
299
- addNode(failureModule, 0, 'module');
300
- }
301
- Object.keys(parents).forEach((key) => {
302
- const node = nodes.find((n) => n.id === key);
303
- if (node) {
304
- node.data.parentIds = parents[key];
349
+ processModules(modules, inputNode, resultNode);
350
+ if (preprocessorModule) {
351
+ addNode(preprocessorModule, 0, 'module');
352
+ const id = JSON.parse(JSON.stringify(preprocessorModule.id));
353
+ addEdge(id, 'Input', { type: 'empty' });
305
354
  }
306
- });
307
- if (useDataflow && selectedId) {
308
- let deps = getDependeeAndDependentComponents(selectedId, modules ?? [], failureModule);
309
- if (deps) {
310
- Object.entries(deps.dependees).forEach((x, i) => {
311
- const inputs = x[1];
312
- inputs?.forEach((input, index) => {
313
- let pid = x[0];
314
- if (input?.startsWith('flow_input.iter')) {
315
- const parent = dfsByModule(selectedId, modules ?? [])?.pop();
316
- if (parent?.id) {
317
- pid = parent.id;
355
+ if (failureModule && !extra.flowModuleStates) {
356
+ addNode(failureModule, 0, 'module');
357
+ }
358
+ Object.keys(parents).forEach((key) => {
359
+ const node = nodes.find((n) => n.id === key);
360
+ if (node) {
361
+ node.data.parentIds = parents[key];
362
+ }
363
+ });
364
+ if (useDataflow && selectedId) {
365
+ let deps = getDependeeAndDependentComponents(selectedId, modules ?? [], failureModule);
366
+ if (deps) {
367
+ Object.entries(deps.dependees).forEach((x, i) => {
368
+ const inputs = x[1];
369
+ inputs?.forEach((input, index) => {
370
+ let pid = x[0];
371
+ if (input?.startsWith('flow_input.iter')) {
372
+ const parent = dfsByModule(selectedId, modules ?? [])?.pop();
373
+ if (parent?.id) {
374
+ pid = parent.id;
375
+ }
318
376
  }
319
- }
320
- addEdge(pid, selectedId, {
321
- customId: `dep-${pid}-${selectedId}-${input}-${index}`,
322
- type: 'dataflowedge'
377
+ addEdge(pid, selectedId, {
378
+ customId: `dep-${pid}-${selectedId}-${input}-${index}`,
379
+ type: 'dataflowedge'
380
+ });
323
381
  });
324
382
  });
325
- });
326
- Object.entries(deps.dependents).forEach((x, i) => {
327
- let pid = x[0];
328
- addEdge(selectedId, pid, {
329
- customId: `dep-${selectedId}-${pid}-${i}`,
330
- type: 'dataflowedge'
383
+ Object.entries(deps.dependents).forEach((x, i) => {
384
+ let pid = x[0];
385
+ addEdge(selectedId, pid, {
386
+ customId: `dep-${selectedId}-${pid}-${i}`,
387
+ type: 'dataflowedge'
388
+ });
331
389
  });
332
- });
390
+ }
333
391
  }
392
+ return { nodes, edges };
393
+ }
394
+ catch (e) {
395
+ return {
396
+ nodes: [],
397
+ edges: [],
398
+ error: e
399
+ };
334
400
  }
335
- return { nodes, edges };
336
401
  }