From 316e05b8b92fcd3b8359834aae41a52dfddd6df9 Mon Sep 17 00:00:00 2001 From: Christian Byrne Date: Mon, 18 Aug 2025 16:58:45 -0700 Subject: [PATCH] [refactor] Reorganize Vue nodes to domain-driven design architecture (#5085) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor: Reorganize Vue nodes system to domain-driven design architecture Move Vue nodes code from scattered technical layers to domain-focused structure: - Widget system → src/renderer/extensions/vueNodes/widgets/ - LOD optimization → src/renderer/extensions/vueNodes/lod/ - Layout logic → src/renderer/extensions/vueNodes/layout/ - Node components → src/renderer/extensions/vueNodes/components/ - Test structure mirrors source organization Benefits: - Clear domain boundaries instead of technical layers - Everything Vue nodes related in renderer domain (not workbench) - camelCase naming (vueNodes vs vue-nodes) - Tests co-located with source domains - All imports updated to new DDD structure * fix: Skip spatial index performance test on CI to avoid flaky timing Performance tests are inherently flaky on CI due to variable system performance. This test should only run locally like the other performance tests. --- src/composables/graph/useWidgetRenderer.ts | 2 +- .../node/useNodeCanvasImagePreview.ts | 2 +- src/composables/node/useNodeChatHistory.ts | 2 +- src/composables/node/useNodeProgressText.ts | 2 +- .../vueNodes/components}/InputSlot.vue | 0 .../vueNodes/components}/LGraphNode.vue | 6 +- .../vueNodes/components}/NodeContent.vue | 5 +- .../vueNodes/components}/NodeHeader.vue | 5 +- .../vueNodes/components}/NodeSlots.vue | 7 +- .../vueNodes/components}/NodeWidgets.vue | 14 +- .../vueNodes/components}/OutputSlot.vue | 8 +- .../widgets/LOD_IMPLEMENTATION_GUIDE.md | 0 src/renderer/extensions/vueNodes/index.ts | 34 ++ .../layout}/useNodeLayout.ts | 0 .../extensions/vueNodes/lod/useLOD.ts | 186 ++++++++++ .../widgets/components/WidgetButton.vue | 43 +++ .../widgets/components/WidgetChart.vue | 78 +++++ .../widgets/components/WidgetColorPicker.vue | 52 +++ .../widgets/components/WidgetFileUpload.vue | 324 ++++++++++++++++++ .../widgets/components/WidgetGalleria.vue | 123 +++++++ .../widgets/components/WidgetImage.vue | 29 ++ .../widgets/components/WidgetImageCompare.vue | 70 ++++ .../widgets/components/WidgetInputText.vue | 48 +++ .../widgets/components/WidgetMarkdown.vue | 95 +++++ .../widgets/components/WidgetMultiSelect.vue | 58 ++++ .../widgets/components/WidgetSelect.vue | 71 ++++ .../widgets/components/WidgetSelectButton.vue | 63 ++++ .../widgets/components/WidgetSlider.vue | 169 +++++++++ .../widgets/components/WidgetTextarea.vue | 44 +++ .../widgets/components/WidgetToggleSwitch.vue | 56 +++ .../widgets/components/WidgetTreeSelect.vue | 56 +++ .../widgets/composables/useBooleanWidget.ts | 33 ++ .../widgets/composables/useChartWidget.ts | 28 ++ .../composables/useChatHistoryWidget.ts | 52 +++ .../widgets/composables/useColorWidget.ts | 20 ++ .../widgets/composables/useComboWidget.ts | 111 ++++++ .../composables/useFileUploadWidget.ts | 20 ++ .../widgets/composables/useFloatWidget.ts | 81 +++++ .../widgets/composables/useGalleriaWidget.ts | 26 ++ .../composables/useImageCompareWidget.ts | 20 ++ .../composables/useImagePreviewWidget.ts | 317 +++++++++++++++++ .../composables/useImageUploadWidget.ts | 121 +++++++ .../widgets/composables/useImageWidget.ts | 20 ++ .../widgets/composables/useIntWidget.ts | 97 ++++++ .../widgets/composables/useMarkdownWidget.ts | 115 +++++++ .../composables/useMultiSelectWidget.ts | 21 ++ .../composables/useProgressTextWidget.ts | 55 +++ .../widgets/composables/useRemoteWidget.ts | 274 +++++++++++++++ .../composables/useSelectButtonWidget.ts | 28 ++ .../widgets/composables/useStringWidget.ts | 139 ++++++++ .../widgets/composables/useTextareaWidget.ts | 28 ++ .../composables/useTreeSelectWidget.ts | 24 ++ .../widgets/composables/useWidgetRenderer.ts | 114 ++++++ .../widgets/composables/useWidgetValue.ts | 155 +++++++++ .../widgets/registry}/widgetRegistry.ts | 32 +- .../vueNodes/widgets/useNodeWidgets.ts | 182 ++++++++++ src/scripts/errorNodeWidgets.ts | 6 +- src/scripts/widgets.ts | 34 +- .../composables/useNodeChatHistory.test.ts | 31 +- .../spatialIndexPerformance.test.ts | 6 +- .../core/layout}/layoutStore.test.ts | 0 .../extensions/vueNodes/lod}/useLOD.test.ts | 2 +- .../composables}/useComboWidget.test.ts | 2 +- .../composables}/useFloatWidget.test.ts | 2 +- .../widgets/composables}/useIntWidget.test.ts | 2 +- .../composables}/useManagerQueue.test.ts | 0 .../composables}/useRemoteWidget.test.ts | 2 +- .../composables}/useWidgetRenderer.test.ts | 4 +- 68 files changed, 3767 insertions(+), 89 deletions(-) rename src/{components/graph/vueNodes => renderer/extensions/vueNodes/components}/InputSlot.vue (100%) rename src/{components/graph/vueNodes => renderer/extensions/vueNodes/components}/LGraphNode.vue (97%) rename src/{components/graph/vueNodes => renderer/extensions/vueNodes/components}/NodeContent.vue (89%) rename src/{components/graph/vueNodes => renderer/extensions/vueNodes/components}/NodeHeader.vue (96%) rename src/{components/graph/vueNodes => renderer/extensions/vueNodes/components}/NodeSlots.vue (96%) rename src/{components/graph/vueNodes => renderer/extensions/vueNodes/components}/NodeWidgets.vue (90%) rename src/{components/graph/vueNodes => renderer/extensions/vueNodes/components}/OutputSlot.vue (92%) rename src/{components/graph/vueNodes => renderer/extensions/vueNodes/components}/widgets/LOD_IMPLEMENTATION_GUIDE.md (100%) create mode 100644 src/renderer/extensions/vueNodes/index.ts rename src/renderer/extensions/{vue-nodes/composables => vueNodes/layout}/useNodeLayout.ts (100%) create mode 100644 src/renderer/extensions/vueNodes/lod/useLOD.ts create mode 100644 src/renderer/extensions/vueNodes/widgets/components/WidgetButton.vue create mode 100644 src/renderer/extensions/vueNodes/widgets/components/WidgetChart.vue create mode 100644 src/renderer/extensions/vueNodes/widgets/components/WidgetColorPicker.vue create mode 100644 src/renderer/extensions/vueNodes/widgets/components/WidgetFileUpload.vue create mode 100644 src/renderer/extensions/vueNodes/widgets/components/WidgetGalleria.vue create mode 100644 src/renderer/extensions/vueNodes/widgets/components/WidgetImage.vue create mode 100644 src/renderer/extensions/vueNodes/widgets/components/WidgetImageCompare.vue create mode 100644 src/renderer/extensions/vueNodes/widgets/components/WidgetInputText.vue create mode 100644 src/renderer/extensions/vueNodes/widgets/components/WidgetMarkdown.vue create mode 100644 src/renderer/extensions/vueNodes/widgets/components/WidgetMultiSelect.vue create mode 100644 src/renderer/extensions/vueNodes/widgets/components/WidgetSelect.vue create mode 100644 src/renderer/extensions/vueNodes/widgets/components/WidgetSelectButton.vue create mode 100644 src/renderer/extensions/vueNodes/widgets/components/WidgetSlider.vue create mode 100644 src/renderer/extensions/vueNodes/widgets/components/WidgetTextarea.vue create mode 100644 src/renderer/extensions/vueNodes/widgets/components/WidgetToggleSwitch.vue create mode 100644 src/renderer/extensions/vueNodes/widgets/components/WidgetTreeSelect.vue create mode 100644 src/renderer/extensions/vueNodes/widgets/composables/useBooleanWidget.ts create mode 100644 src/renderer/extensions/vueNodes/widgets/composables/useChartWidget.ts create mode 100644 src/renderer/extensions/vueNodes/widgets/composables/useChatHistoryWidget.ts create mode 100644 src/renderer/extensions/vueNodes/widgets/composables/useColorWidget.ts create mode 100644 src/renderer/extensions/vueNodes/widgets/composables/useComboWidget.ts create mode 100644 src/renderer/extensions/vueNodes/widgets/composables/useFileUploadWidget.ts create mode 100644 src/renderer/extensions/vueNodes/widgets/composables/useFloatWidget.ts create mode 100644 src/renderer/extensions/vueNodes/widgets/composables/useGalleriaWidget.ts create mode 100644 src/renderer/extensions/vueNodes/widgets/composables/useImageCompareWidget.ts create mode 100644 src/renderer/extensions/vueNodes/widgets/composables/useImagePreviewWidget.ts create mode 100644 src/renderer/extensions/vueNodes/widgets/composables/useImageUploadWidget.ts create mode 100644 src/renderer/extensions/vueNodes/widgets/composables/useImageWidget.ts create mode 100644 src/renderer/extensions/vueNodes/widgets/composables/useIntWidget.ts create mode 100644 src/renderer/extensions/vueNodes/widgets/composables/useMarkdownWidget.ts create mode 100644 src/renderer/extensions/vueNodes/widgets/composables/useMultiSelectWidget.ts create mode 100644 src/renderer/extensions/vueNodes/widgets/composables/useProgressTextWidget.ts create mode 100644 src/renderer/extensions/vueNodes/widgets/composables/useRemoteWidget.ts create mode 100644 src/renderer/extensions/vueNodes/widgets/composables/useSelectButtonWidget.ts create mode 100644 src/renderer/extensions/vueNodes/widgets/composables/useStringWidget.ts create mode 100644 src/renderer/extensions/vueNodes/widgets/composables/useTextareaWidget.ts create mode 100644 src/renderer/extensions/vueNodes/widgets/composables/useTreeSelectWidget.ts create mode 100644 src/renderer/extensions/vueNodes/widgets/composables/useWidgetRenderer.ts create mode 100644 src/renderer/extensions/vueNodes/widgets/composables/useWidgetValue.ts rename src/{components/graph/vueWidgets => renderer/extensions/vueNodes/widgets/registry}/widgetRegistry.ts (65%) create mode 100644 src/renderer/extensions/vueNodes/widgets/useNodeWidgets.ts rename tests-ui/tests/{stores => renderer/core/layout}/layoutStore.test.ts (100%) rename tests-ui/tests/{composables/graph => renderer/extensions/vueNodes/lod}/useLOD.test.ts (99%) rename tests-ui/tests/{composables/widgets => renderer/extensions/vueNodes/widgets/composables}/useComboWidget.test.ts (90%) rename tests-ui/tests/{composables/widgets => renderer/extensions/vueNodes/widgets/composables}/useFloatWidget.test.ts (95%) rename tests-ui/tests/{composables/widgets => renderer/extensions/vueNodes/widgets/composables}/useIntWidget.test.ts (94%) rename tests-ui/tests/{composables/widgets => renderer/extensions/vueNodes/widgets/composables}/useManagerQueue.test.ts (100%) rename tests-ui/tests/{composables/widgets => renderer/extensions/vueNodes/widgets/composables}/useRemoteWidget.test.ts (99%) rename tests-ui/tests/{composables/graph => renderer/extensions/vueNodes/widgets/composables}/useWidgetRenderer.test.ts (96%) diff --git a/src/composables/graph/useWidgetRenderer.ts b/src/composables/graph/useWidgetRenderer.ts index 762d9affa..ad7e185a9 100644 --- a/src/composables/graph/useWidgetRenderer.ts +++ b/src/composables/graph/useWidgetRenderer.ts @@ -5,7 +5,7 @@ import { WidgetType, widgetTypeToComponent -} from '@/components/graph/vueWidgets/widgetRegistry' +} from '@/renderer/extensions/vueNodes/widgets/registry/widgetRegistry' /** * Static mapping of LiteGraph widget types to Vue widget component names diff --git a/src/composables/node/useNodeCanvasImagePreview.ts b/src/composables/node/useNodeCanvasImagePreview.ts index 98d49b485..008119407 100644 --- a/src/composables/node/useNodeCanvasImagePreview.ts +++ b/src/composables/node/useNodeCanvasImagePreview.ts @@ -1,5 +1,5 @@ -import { useImagePreviewWidget } from '@/composables/widgets/useImagePreviewWidget' import type { LGraphNode } from '@/lib/litegraph/src/litegraph' +import { useImagePreviewWidget } from '@/renderer/extensions/vueNodes/widgets/composables/useImagePreviewWidget' const CANVAS_IMAGE_PREVIEW_WIDGET = '$$canvas-image-preview' diff --git a/src/composables/node/useNodeChatHistory.ts b/src/composables/node/useNodeChatHistory.ts index 8fbe78895..a1fa3ad3a 100644 --- a/src/composables/node/useNodeChatHistory.ts +++ b/src/composables/node/useNodeChatHistory.ts @@ -1,6 +1,6 @@ import type ChatHistoryWidget from '@/components/graph/widgets/ChatHistoryWidget.vue' -import { useChatHistoryWidget } from '@/composables/widgets/useChatHistoryWidget' import { LGraphNode } from '@/lib/litegraph/src/litegraph' +import { useChatHistoryWidget } from '@/renderer/extensions/vueNodes/widgets/composables/useChatHistoryWidget' const CHAT_HISTORY_WIDGET_NAME = '$$node-chat-history' diff --git a/src/composables/node/useNodeProgressText.ts b/src/composables/node/useNodeProgressText.ts index 12e09bd5e..07e7488ea 100644 --- a/src/composables/node/useNodeProgressText.ts +++ b/src/composables/node/useNodeProgressText.ts @@ -1,5 +1,5 @@ -import { useTextPreviewWidget } from '@/composables/widgets/useProgressTextWidget' import { LGraphNode } from '@/lib/litegraph/src/litegraph' +import { useTextPreviewWidget } from '@/renderer/extensions/vueNodes/widgets/composables/useProgressTextWidget' const TEXT_PREVIEW_WIDGET_NAME = '$$node-text-preview' diff --git a/src/components/graph/vueNodes/InputSlot.vue b/src/renderer/extensions/vueNodes/components/InputSlot.vue similarity index 100% rename from src/components/graph/vueNodes/InputSlot.vue rename to src/renderer/extensions/vueNodes/components/InputSlot.vue diff --git a/src/components/graph/vueNodes/LGraphNode.vue b/src/renderer/extensions/vueNodes/components/LGraphNode.vue similarity index 97% rename from src/components/graph/vueNodes/LGraphNode.vue rename to src/renderer/extensions/vueNodes/components/LGraphNode.vue index df97ffa7c..369fe047e 100644 --- a/src/components/graph/vueNodes/LGraphNode.vue +++ b/src/renderer/extensions/vueNodes/components/LGraphNode.vue @@ -91,11 +91,11 @@ import { computed, onErrorCaptured, ref, toRef, watch } from 'vue' // Import the VueNodeData type import type { VueNodeData } from '@/composables/graph/useGraphNodeManager' -import { LODLevel, useLOD } from '@/composables/graph/useLOD' import { useErrorHandling } from '@/composables/useErrorHandling' -import { useNodeLayout } from '@/renderer/extensions/vue-nodes/composables/useNodeLayout' +import { LiteGraph } from '@/lib/litegraph/src/litegraph' +import { useNodeLayout } from '@/renderer/extensions/vueNodes/layout/useNodeLayout' +import { LODLevel, useLOD } from '@/renderer/extensions/vueNodes/lod/useLOD' -import { LiteGraph } from '../../../lib/litegraph/src/litegraph' import NodeContent from './NodeContent.vue' import NodeHeader from './NodeHeader.vue' import NodeSlots from './NodeSlots.vue' diff --git a/src/components/graph/vueNodes/NodeContent.vue b/src/renderer/extensions/vueNodes/components/NodeContent.vue similarity index 89% rename from src/components/graph/vueNodes/NodeContent.vue rename to src/renderer/extensions/vueNodes/components/NodeContent.vue index 41ae8df34..48a03670c 100644 --- a/src/components/graph/vueNodes/NodeContent.vue +++ b/src/renderer/extensions/vueNodes/components/NodeContent.vue @@ -16,10 +16,9 @@ import { onErrorCaptured, ref } from 'vue' import type { VueNodeData } from '@/composables/graph/useGraphNodeManager' -import type { LODLevel } from '@/composables/graph/useLOD' import { useErrorHandling } from '@/composables/useErrorHandling' - -import type { LGraphNode } from '../../../lib/litegraph/src/litegraph' +import type { LGraphNode } from '@/lib/litegraph/src/litegraph' +import type { LODLevel } from '@/renderer/extensions/vueNodes/lod/useLOD' interface NodeContentProps { node?: LGraphNode // For backwards compatibility diff --git a/src/components/graph/vueNodes/NodeHeader.vue b/src/renderer/extensions/vueNodes/components/NodeHeader.vue similarity index 96% rename from src/components/graph/vueNodes/NodeHeader.vue rename to src/renderer/extensions/vueNodes/components/NodeHeader.vue index 3eaaa774a..0a9e15fb1 100644 --- a/src/components/graph/vueNodes/NodeHeader.vue +++ b/src/renderer/extensions/vueNodes/components/NodeHeader.vue @@ -45,10 +45,9 @@ import { computed, onErrorCaptured, ref, watch } from 'vue' import EditableText from '@/components/common/EditableText.vue' import type { VueNodeData } from '@/composables/graph/useGraphNodeManager' -import type { LODLevel } from '@/composables/graph/useLOD' import { useErrorHandling } from '@/composables/useErrorHandling' - -import type { LGraphNode } from '../../../lib/litegraph/src/litegraph' +import type { LGraphNode } from '@/lib/litegraph/src/litegraph' +import type { LODLevel } from '@/renderer/extensions/vueNodes/lod/useLOD' interface NodeHeaderProps { node?: LGraphNode // For backwards compatibility diff --git a/src/components/graph/vueNodes/NodeSlots.vue b/src/renderer/extensions/vueNodes/components/NodeSlots.vue similarity index 96% rename from src/components/graph/vueNodes/NodeSlots.vue rename to src/renderer/extensions/vueNodes/components/NodeSlots.vue index 527c88d8a..8310dcf33 100644 --- a/src/components/graph/vueNodes/NodeSlots.vue +++ b/src/renderer/extensions/vueNodes/components/NodeSlots.vue @@ -35,14 +35,11 @@ import { computed, onErrorCaptured, onUnmounted, ref } from 'vue' import { useEventForwarding } from '@/composables/graph/useEventForwarding' import type { VueNodeData } from '@/composables/graph/useGraphNodeManager' -import type { LODLevel } from '@/composables/graph/useLOD' import { useErrorHandling } from '@/composables/useErrorHandling' +import type { INodeSlot, LGraphNode } from '@/lib/litegraph/src/litegraph' +import type { LODLevel } from '@/renderer/extensions/vueNodes/lod/useLOD' import { isSlotObject } from '@/utils/typeGuardUtil' -import type { - INodeSlot, - LGraphNode -} from '../../../lib/litegraph/src/litegraph' import InputSlot from './InputSlot.vue' import OutputSlot from './OutputSlot.vue' diff --git a/src/components/graph/vueNodes/NodeWidgets.vue b/src/renderer/extensions/vueNodes/components/NodeWidgets.vue similarity index 90% rename from src/components/graph/vueNodes/NodeWidgets.vue rename to src/renderer/extensions/vueNodes/components/NodeWidgets.vue index 10bc978c1..8b077fcca 100644 --- a/src/components/graph/vueNodes/NodeWidgets.vue +++ b/src/renderer/extensions/vueNodes/components/NodeWidgets.vue @@ -41,23 +41,23 @@ diff --git a/src/renderer/extensions/vueNodes/widgets/components/WidgetChart.vue b/src/renderer/extensions/vueNodes/widgets/components/WidgetChart.vue new file mode 100644 index 000000000..1c40d35a7 --- /dev/null +++ b/src/renderer/extensions/vueNodes/widgets/components/WidgetChart.vue @@ -0,0 +1,78 @@ + + + diff --git a/src/renderer/extensions/vueNodes/widgets/components/WidgetColorPicker.vue b/src/renderer/extensions/vueNodes/widgets/components/WidgetColorPicker.vue new file mode 100644 index 000000000..16a3dd374 --- /dev/null +++ b/src/renderer/extensions/vueNodes/widgets/components/WidgetColorPicker.vue @@ -0,0 +1,52 @@ + + + + diff --git a/src/renderer/extensions/vueNodes/widgets/components/WidgetFileUpload.vue b/src/renderer/extensions/vueNodes/widgets/components/WidgetFileUpload.vue new file mode 100644 index 000000000..e918a4302 --- /dev/null +++ b/src/renderer/extensions/vueNodes/widgets/components/WidgetFileUpload.vue @@ -0,0 +1,324 @@ + + + diff --git a/src/renderer/extensions/vueNodes/widgets/components/WidgetGalleria.vue b/src/renderer/extensions/vueNodes/widgets/components/WidgetGalleria.vue new file mode 100644 index 000000000..3603b7ab6 --- /dev/null +++ b/src/renderer/extensions/vueNodes/widgets/components/WidgetGalleria.vue @@ -0,0 +1,123 @@ + + + + + diff --git a/src/renderer/extensions/vueNodes/widgets/components/WidgetImage.vue b/src/renderer/extensions/vueNodes/widgets/components/WidgetImage.vue new file mode 100644 index 000000000..d7af95cf0 --- /dev/null +++ b/src/renderer/extensions/vueNodes/widgets/components/WidgetImage.vue @@ -0,0 +1,29 @@ + + + diff --git a/src/renderer/extensions/vueNodes/widgets/components/WidgetImageCompare.vue b/src/renderer/extensions/vueNodes/widgets/components/WidgetImageCompare.vue new file mode 100644 index 000000000..e51413a30 --- /dev/null +++ b/src/renderer/extensions/vueNodes/widgets/components/WidgetImageCompare.vue @@ -0,0 +1,70 @@ + + + diff --git a/src/renderer/extensions/vueNodes/widgets/components/WidgetInputText.vue b/src/renderer/extensions/vueNodes/widgets/components/WidgetInputText.vue new file mode 100644 index 000000000..8cb41dfa9 --- /dev/null +++ b/src/renderer/extensions/vueNodes/widgets/components/WidgetInputText.vue @@ -0,0 +1,48 @@ + + + diff --git a/src/renderer/extensions/vueNodes/widgets/components/WidgetMarkdown.vue b/src/renderer/extensions/vueNodes/widgets/components/WidgetMarkdown.vue new file mode 100644 index 000000000..4749e561c --- /dev/null +++ b/src/renderer/extensions/vueNodes/widgets/components/WidgetMarkdown.vue @@ -0,0 +1,95 @@ +