windmill-components 1.394.8 → 1.405.5

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 (305) hide show
  1. package/package/assets/app.css +20 -0
  2. package/package/ata/edgeCases.d.ts +0 -1
  3. package/package/ata/edgeCases.js +2 -8
  4. package/package/ata/index.js +4 -3
  5. package/package/common.d.ts +1 -1
  6. package/package/common.js +2 -2
  7. package/package/components/ApiConnectForm.svelte +33 -7
  8. package/package/components/AppConnectLightweightResourcePicker.svelte +66 -0
  9. package/package/components/AppConnectLightweightResourcePicker.svelte.d.ts +21 -0
  10. package/package/components/ArgInput.svelte +10 -4
  11. package/package/components/ArgInput.svelte.d.ts +1 -0
  12. package/package/components/CenteredModal.svelte +4 -1
  13. package/package/components/CenteredModal.svelte.d.ts +1 -0
  14. package/package/components/CustomPopover.svelte +1 -1
  15. package/package/components/DateInput.svelte +2 -0
  16. package/package/components/DateInput.svelte.d.ts +1 -0
  17. package/package/components/DefaultScripts.svelte +8 -3
  18. package/package/components/DefaultScripts.svelte.d.ts +5 -1
  19. package/package/components/DefaultScriptsInner.svelte +16 -7
  20. package/package/components/DefaultScriptsInner.svelte.d.ts +3 -1
  21. package/package/components/Dev.svelte +68 -11
  22. package/package/components/DisplayResult.svelte +1 -1
  23. package/package/components/DropdownV2.svelte.d.ts +3 -3
  24. package/package/components/DropdownV2Inner.svelte.d.ts +3 -3
  25. package/package/components/EditableSchemaForm.svelte +1 -0
  26. package/package/components/Editor.svelte +3 -2
  27. package/package/components/Editor.svelte.d.ts +1 -1
  28. package/package/components/ExecutionDuration.svelte +44 -0
  29. package/package/components/ExecutionDuration.svelte.d.ts +24 -0
  30. package/package/components/FlowBuilder.svelte +22 -12
  31. package/package/components/FlowBuilder.svelte.d.ts +1 -0
  32. package/package/components/FlowGraphViewer.svelte +9 -2
  33. package/package/components/FlowGraphViewerStep.svelte +23 -10
  34. package/package/components/FlowInputViewer.svelte +25 -0
  35. package/package/components/FlowInputViewer.svelte.d.ts +19 -0
  36. package/package/components/FlowJobResult.svelte +8 -2
  37. package/package/components/FlowJobResult.svelte.d.ts +1 -0
  38. package/package/components/FlowMetadata.svelte +2 -2
  39. package/package/components/FlowStatusViewer.svelte +3 -1
  40. package/package/components/FlowStatusViewer.svelte.d.ts +1 -0
  41. package/package/components/FlowStatusViewerInner.svelte +21 -5
  42. package/package/components/FlowTimeline.svelte +3 -3
  43. package/package/components/FlowViewer.svelte +2 -21
  44. package/package/components/HighlightCode.svelte +3 -0
  45. package/package/components/IconedResourceType.svelte +17 -10
  46. package/package/components/IconedResourceType.svelte.d.ts +2 -0
  47. package/package/components/IdEditorInput.svelte +0 -1
  48. package/package/components/InstanceSettings.svelte +247 -129
  49. package/package/components/InstanceSettings.svelte.d.ts +2 -0
  50. package/package/components/JobArgs.svelte +3 -1
  51. package/package/components/LightweightArgInput.svelte +35 -10
  52. package/package/components/LightweightArgInput.svelte.d.ts +1 -0
  53. package/package/components/LightweightObjectResourceInput.svelte +2 -0
  54. package/package/components/LightweightObjectResourceInput.svelte.d.ts +1 -0
  55. package/package/components/LightweightResourcePicker.svelte +34 -30
  56. package/package/components/LightweightSchemaForm.svelte +2 -0
  57. package/package/components/LightweightSchemaForm.svelte.d.ts +1 -0
  58. package/package/components/LogViewer.svelte +4 -3
  59. package/package/components/LogViewer.svelte.d.ts +1 -0
  60. package/package/components/Login.svelte +10 -5
  61. package/package/components/Login.svelte.d.ts +1 -0
  62. package/package/components/ManualPopover.svelte +1 -1
  63. package/package/components/ModulePreview.svelte +21 -2
  64. package/package/components/ModuleStatus.svelte +3 -0
  65. package/package/components/ModuleStatus.svelte.d.ts +1 -0
  66. package/package/components/OAuthSetting.svelte +40 -15
  67. package/package/components/ObjectResourceInput.svelte +5 -2
  68. package/package/components/ObjectResourceInput.svelte.d.ts +2 -0
  69. package/package/components/ObjectStoreConfigSettings.svelte +78 -76
  70. package/package/components/ParqetCsvTableRenderer.svelte +25 -3
  71. package/package/components/Password.svelte.d.ts +1 -1
  72. package/package/components/Path.svelte +74 -54
  73. package/package/components/Path.svelte.d.ts +2 -1
  74. package/package/components/Popover.svelte +1 -1
  75. package/package/components/Portal.svelte +7 -8
  76. package/package/components/Portal.svelte.d.ts +3 -7
  77. package/package/components/QueueMetricsDrawer.svelte +368 -3
  78. package/package/components/QueueMetricsDrawer.svelte.d.ts +2 -0
  79. package/package/components/ResourceEditor.svelte +38 -10
  80. package/package/components/ResourcePicker.svelte +14 -9
  81. package/package/components/ResourcePicker.svelte.d.ts +1 -0
  82. package/package/components/ResultJobLoader.svelte +6 -3
  83. package/package/components/ResultJobLoader.svelte.d.ts +1 -1
  84. package/package/components/RunForm.svelte +1 -1
  85. package/package/components/SavedInputs.svelte +2 -2
  86. package/package/components/ScheduleEditorInner.svelte +2 -2
  87. package/package/components/SchemaForm.svelte +6 -1
  88. package/package/components/ScriptBuilder.svelte +12 -5
  89. package/package/components/ScriptEditor.svelte +33 -3
  90. package/package/components/ScriptEditor.svelte.d.ts +1 -1
  91. package/package/components/ScriptVersionHistory.svelte +54 -59
  92. package/package/components/Scrollable.svelte +47 -0
  93. package/package/components/Scrollable.svelte.d.ts +21 -0
  94. package/package/components/ShareModal.svelte.d.ts +2 -2
  95. package/package/components/SuperadminSettings.svelte +5 -7
  96. package/package/components/TestConnection.svelte +1 -0
  97. package/package/components/TestJobLoader.svelte +46 -5
  98. package/package/components/TestJobLoader.svelte.d.ts +2 -1
  99. package/package/components/TimeAgo.svelte +5 -6
  100. package/package/components/TimeAgo.svelte.d.ts +1 -1
  101. package/package/components/ToggleHubWorkspaceQuick.svelte +14 -0
  102. package/package/components/ToggleHubWorkspaceQuick.svelte.d.ts +16 -0
  103. package/package/components/WorkspaceGroup.svelte +3 -2
  104. package/package/components/apps/components/buttons/AppButton.svelte +1 -1
  105. package/package/components/apps/components/display/dbtable/AppDbExplorer.svelte +1 -1
  106. package/package/components/apps/components/helpers/DebouncedInput.svelte +9 -1
  107. package/package/components/apps/components/inputs/AppMultiSelect.svelte +1 -1
  108. package/package/components/apps/components/inputs/AppMultiSelectV2.svelte +1 -1
  109. package/package/components/apps/components/inputs/AppSelect.svelte +1 -1
  110. package/package/components/apps/components/layout/AppDrawer.svelte +1 -1
  111. package/package/components/apps/components/layout/AppModal.svelte +1 -1
  112. package/package/components/apps/editor/AppEditor.svelte +11 -3
  113. package/package/components/apps/editor/GridEditor.svelte +57 -4
  114. package/package/components/apps/editor/GridEditor.svelte.d.ts +8 -0
  115. package/package/components/apps/editor/GridEditorMenu.svelte +1 -1
  116. package/package/components/apps/editor/SubGridEditor.svelte +82 -3
  117. package/package/components/apps/editor/SubGridEditor.svelte.d.ts +16 -0
  118. package/package/components/apps/editor/appUtils.d.ts +19 -2
  119. package/package/components/apps/editor/appUtils.js +103 -7
  120. package/package/components/apps/editor/component/Component.svelte +36 -8
  121. package/package/components/apps/editor/component/Component.svelte.d.ts +3 -1
  122. package/package/components/apps/editor/component/components.d.ts +79 -79
  123. package/package/components/apps/editor/contextPanel/components/OutputHeader.svelte +1 -1
  124. package/package/components/apps/svelte-grid/Grid.svelte +235 -12
  125. package/package/components/apps/svelte-grid/Grid.svelte.d.ts +7 -7
  126. package/package/components/apps/svelte-grid/MoveResize.svelte +104 -11
  127. package/package/components/apps/svelte-grid/MoveResize.svelte.d.ts +7 -0
  128. package/package/components/apps/svelte-grid/utils/item.d.ts +4 -1
  129. package/package/components/apps/svelte-grid/utils/item.js +2 -3
  130. package/package/components/apps/svelte-select/lib/ConditionalPortal.svelte +1 -1
  131. package/package/components/apps/svelte-select/lib/ConditionalPortalGlobal.svelte +1 -1
  132. package/package/components/apps/svelte-select/lib/Select.svelte +1 -1
  133. package/package/components/common/button/ButtonDropdown.svelte +1 -1
  134. package/package/components/common/drawer/ConditionalPortal.svelte +1 -1
  135. package/package/components/common/fileUpload/FileUpload.svelte +1 -1
  136. package/package/components/common/languageIcons/LanguageIcon.svelte +5 -2
  137. package/package/components/common/menu/Menu.svelte +2 -1
  138. package/package/components/common/menu/MenuV2.svelte +4 -2
  139. package/package/components/common/menu/MenuV2.svelte.d.ts +1 -0
  140. package/package/components/common/modal/AlwaysMountedModal.svelte +1 -1
  141. package/package/components/common/popup/Popup.svelte +22 -12
  142. package/package/components/common/popup/Popup.svelte.d.ts +2 -0
  143. package/package/components/common/popup/PopupV2.svelte +58 -0
  144. package/package/components/common/popup/PopupV2.svelte.d.ts +27 -0
  145. package/package/components/copilot/CronGen.svelte +1 -1
  146. package/package/components/copilot/RegexGen.svelte +4 -4
  147. package/package/components/copilot/StepGen.svelte +6 -6
  148. package/package/components/copilot/StepGenQuick.svelte +58 -0
  149. package/package/components/copilot/StepGenQuick.svelte.d.ts +24 -0
  150. package/package/components/copilot/flow.d.ts +2 -0
  151. package/package/components/copilot/flow.js +55 -0
  152. package/package/components/details/DetailPageDetailPanel.svelte +9 -1
  153. package/package/components/details/DetailPageDetailPanel.svelte.d.ts +2 -1
  154. package/package/components/details/DetailPageLayout.svelte +2 -0
  155. package/package/components/details/DetailPageLayout.svelte.d.ts +3 -0
  156. package/package/components/details/Menu.svelte +1 -1
  157. package/package/components/details/utils.d.ts +0 -1
  158. package/package/components/details/utils.js +1 -12
  159. package/package/components/flows/CreateActionsApp.svelte +1 -1
  160. package/package/components/flows/FlowEditor.svelte +4 -2
  161. package/package/components/flows/FlowEditor.svelte.d.ts +1 -0
  162. package/package/components/flows/FlowHistory.svelte +10 -195
  163. package/package/components/flows/FlowHistory.svelte.d.ts +0 -1
  164. package/package/components/flows/FlowHistoryInner.svelte +200 -0
  165. package/package/components/flows/FlowHistoryInner.svelte.d.ts +19 -0
  166. package/package/components/flows/FlowProgressBar.svelte +16 -1
  167. package/package/components/flows/FlowProgressBar.svelte.d.ts +1 -0
  168. package/package/components/flows/content/FlowBranchesAllWrapper.svelte +8 -0
  169. package/package/components/flows/content/FlowBranchesAllWrapper.svelte.d.ts +1 -0
  170. package/package/components/flows/content/FlowBranchesOneWrapper.svelte +8 -0
  171. package/package/components/flows/content/FlowBranchesOneWrapper.svelte.d.ts +1 -0
  172. package/package/components/flows/content/FlowConstants.svelte +1 -1
  173. package/package/components/flows/content/FlowEditorPanel.svelte +5 -1
  174. package/package/components/flows/content/FlowEditorPanel.svelte.d.ts +1 -0
  175. package/package/components/flows/content/FlowInput.svelte +66 -58
  176. package/package/components/flows/content/FlowInput.svelte.d.ts +1 -0
  177. package/package/components/flows/content/FlowInputs.svelte +7 -6
  178. package/package/components/flows/content/FlowInputs.svelte.d.ts +1 -0
  179. package/package/components/flows/content/FlowInputsFlowQuick.svelte +65 -0
  180. package/package/components/flows/content/FlowInputsFlowQuick.svelte.d.ts +19 -0
  181. package/package/components/flows/content/FlowInputsQuick.svelte +419 -0
  182. package/package/components/flows/content/FlowInputsQuick.svelte.d.ts +33 -0
  183. package/package/components/flows/content/FlowLoop.svelte +7 -1
  184. package/package/components/flows/content/FlowModuleComponent.svelte +12 -3
  185. package/package/components/flows/content/FlowModuleComponent.svelte.d.ts +1 -0
  186. package/package/components/flows/content/FlowModuleScript.svelte +1 -1
  187. package/package/components/flows/content/FlowModuleSkip.svelte +69 -0
  188. package/package/components/flows/content/FlowModuleSkip.svelte.d.ts +20 -0
  189. package/package/components/flows/content/FlowModuleWrapper.svelte +17 -4
  190. package/package/components/flows/content/FlowPreprocessorModule.svelte +16 -0
  191. package/package/components/flows/content/FlowPreprocessorModule.svelte.d.ts +16 -0
  192. package/package/components/flows/content/FlowWhileLoop.svelte +9 -0
  193. package/package/components/flows/content/FlowWhileLoop.svelte.d.ts +1 -0
  194. package/package/components/flows/content/GenAiQuick.svelte +30 -0
  195. package/package/components/flows/content/GenAiQuick.svelte.d.ts +20 -0
  196. package/package/components/flows/content/ScriptEditorDrawer.svelte +3 -2
  197. package/package/components/flows/flowInfers.js +1 -1
  198. package/package/components/flows/header/FlowPreviewButtons.svelte +1 -0
  199. package/package/components/flows/idUtils.js +3 -1
  200. package/package/components/flows/map/FlowCopilotButton.svelte +55 -0
  201. package/package/components/flows/map/FlowCopilotButton.svelte.d.ts +16 -0
  202. package/package/components/flows/map/FlowErrorHandlerItem.svelte +77 -47
  203. package/package/components/flows/map/FlowJobsMenu.svelte +1 -1
  204. package/package/components/flows/map/FlowModuleSchemaItem.svelte +25 -12
  205. package/package/components/flows/map/FlowModuleSchemaItem.svelte.d.ts +1 -0
  206. package/package/components/flows/map/FlowModuleSchemaMap.svelte +64 -20
  207. package/package/components/flows/map/InsertModuleButton.svelte +161 -138
  208. package/package/components/flows/map/InsertModuleButton.svelte.d.ts +7 -4
  209. package/package/components/flows/map/MapItem.svelte +11 -0
  210. package/package/components/flows/map/MapItem.svelte.d.ts +1 -0
  211. package/package/components/flows/pickers/FlowScriptPickerQuick.svelte +48 -0
  212. package/package/components/flows/pickers/FlowScriptPickerQuick.svelte.d.ts +23 -0
  213. package/package/components/flows/pickers/FlowToplevelNode.svelte +19 -0
  214. package/package/components/flows/pickers/FlowToplevelNode.svelte.d.ts +19 -0
  215. package/package/components/flows/pickers/PickHubScriptQuick.svelte +138 -0
  216. package/package/components/flows/pickers/PickHubScriptQuick.svelte.d.ts +33 -0
  217. package/package/components/flows/pickers/TopLevelNode.svelte +58 -0
  218. package/package/components/flows/pickers/TopLevelNode.svelte.d.ts +21 -0
  219. package/package/components/flows/pickers/WorkspaceScriptPickerQuick.svelte +120 -0
  220. package/package/components/flows/pickers/WorkspaceScriptPickerQuick.svelte.d.ts +35 -0
  221. package/package/components/flows/types.d.ts +1 -0
  222. package/package/components/graph/FlowGraphV2.svelte +93 -58
  223. package/package/components/graph/FlowGraphV2.svelte.d.ts +2 -1
  224. package/package/components/graph/graphBuilder.d.ts +2 -1
  225. package/package/components/graph/graphBuilder.js +345 -280
  226. package/package/components/graph/model.d.ts +2 -0
  227. package/package/components/graph/renderers/edges/BaseEdge.svelte +36 -14
  228. package/package/components/graph/renderers/nodes/BranchOneStart.svelte +1 -1
  229. package/package/components/graph/renderers/nodes/InputNode.svelte +31 -51
  230. package/package/components/graph/renderers/nodes/InputNode.svelte.d.ts +6 -1
  231. package/package/components/graph/renderers/nodes/ModuleNode.svelte +2 -1
  232. package/package/components/graph/util.d.ts +1 -1
  233. package/package/components/graph/util.js +7 -2
  234. package/package/components/home/ListFiltersQuick.svelte +51 -0
  235. package/package/components/home/ListFiltersQuick.svelte.d.ts +23 -0
  236. package/package/components/icons/AnsibleIcon.svelte +42 -0
  237. package/package/components/icons/AnsibleIcon.svelte.d.ts +25 -0
  238. package/package/components/icons/WindmillIcon.svelte +119 -105
  239. package/package/components/icons/WindmillIcon2.svelte +141 -0
  240. package/package/components/icons/WindmillIcon2.svelte.d.ts +20 -0
  241. package/package/components/icons/index.d.ts +2 -1
  242. package/package/components/icons/index.js +2 -1
  243. package/package/components/icons/store.d.ts +4 -0
  244. package/package/components/icons/store.js +1 -0
  245. package/package/components/instanceSettings.d.ts +2 -2
  246. package/package/components/instanceSettings.js +25 -58
  247. package/package/components/jobs/JobProgressBar.svelte +52 -0
  248. package/package/components/jobs/JobProgressBar.svelte.d.ts +23 -0
  249. package/package/components/multiselect/MultiSelectWrapper.svelte +1 -1
  250. package/package/components/progressBar/ProgressBar.svelte +18 -1
  251. package/package/components/progressBar/ProgressBar.svelte.d.ts +3 -0
  252. package/package/components/propertyPicker/ObjectViewer.svelte +1 -1
  253. package/package/components/runs/JobPreview.svelte +1 -0
  254. package/package/components/runs/PreprocessedArgsDisplay.svelte +71 -0
  255. package/package/components/runs/PreprocessedArgsDisplay.svelte.d.ts +16 -0
  256. package/package/components/runs/RunRow.svelte +3 -7
  257. package/package/components/schema/AddProperty.svelte +1 -0
  258. package/package/components/schema/EditableSchemaWrapper.svelte +142 -19
  259. package/package/components/schema/EditableSchemaWrapper.svelte.d.ts +1 -0
  260. package/package/components/schema/FlowPropertyEditor.svelte +13 -0
  261. package/package/components/schema/FlowPropertyEditor.svelte.d.ts +1 -0
  262. package/package/components/scriptEditor/LogPanel.svelte +1 -0
  263. package/package/components/scriptEditor/LogPanel.svelte.d.ts +3 -1
  264. package/package/components/search/GlobalSearchModal.svelte +3 -2
  265. package/package/components/sidebar/SidebarContent.svelte +69 -8
  266. package/package/components/sidebar/changelogs.js +10 -0
  267. package/package/components/triggers/RouteEditor.svelte +19 -0
  268. package/package/components/triggers/RouteEditor.svelte.d.ts +21 -0
  269. package/package/components/triggers/RouteEditorInner.svelte +327 -0
  270. package/package/components/triggers/RouteEditorInner.svelte.d.ts +21 -0
  271. package/package/components/triggers/RoutesPanel.svelte +74 -0
  272. package/package/components/triggers/RoutesPanel.svelte.d.ts +17 -0
  273. package/package/editorUtils.js +2 -0
  274. package/package/gen/core/OpenAPI.js +1 -1
  275. package/package/gen/schemas.gen.d.ts +159 -8
  276. package/package/gen/schemas.gen.js +161 -8
  277. package/package/gen/services.gen.d.ts +139 -1
  278. package/package/gen/services.gen.js +282 -1
  279. package/package/gen/types.gen.d.ts +455 -12
  280. package/package/hubPaths.json +6 -8
  281. package/package/infer.d.ts +4 -2
  282. package/package/infer.js +25 -23
  283. package/package/inferArgSig.js +8 -2
  284. package/package/monaco_workers/graphql.worker.bundle.js +45440 -174
  285. package/package/relative_imports.d.ts +3 -0
  286. package/package/relative_imports.js +25 -0
  287. package/package/script_helpers.d.ts +38 -34
  288. package/package/script_helpers.js +245 -35
  289. package/package/scripts.d.ts +1 -1
  290. package/package/scripts.js +5 -1
  291. package/package/stores.d.ts +1 -0
  292. package/package/stores.js +1 -0
  293. package/package/utils.d.ts +1 -0
  294. package/package/utils.js +4 -0
  295. package/package.json +38 -7
  296. package/package/components/flows/map/InsertTriggerButton.svelte +0 -48
  297. package/package/components/flows/map/InsertTriggerButton.svelte.d.ts +0 -24
  298. package/package/init_scripts/python_failure_module.d.ts +0 -2
  299. package/package/init_scripts/python_failure_module.js +0 -8
  300. package/package/init_scripts/python_init_code.d.ts +0 -2
  301. package/package/init_scripts/python_init_code.js +0 -40
  302. package/package/init_scripts/python_init_code_clear.d.ts +0 -2
  303. package/package/init_scripts/python_init_code_clear.js +0 -5
  304. package/package/init_scripts/python_init_code_trigger.d.ts +0 -2
  305. package/package/init_scripts/python_init_code_trigger.js +0 -14
@@ -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
  }