From 4c8c4a1ad4f53354f700a33ea1b95262aeda2719 Mon Sep 17 00:00:00 2001 From: Christian Byrne Date: Mon, 15 Sep 2025 03:53:08 -0700 Subject: [PATCH] [refactor] Improve settings domain organization (#5550) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor: move settingStore to platform/settings Move src/stores/settingStore.ts to src/platform/settings/settingStore.ts to separate platform infrastructure from domain logic following DDD principles. Updates all import references across ~70 files to maintain compatibility. * fix: update remaining settingStore imports after rebase * fix: complete remaining settingStore import updates * fix: update vi.mock paths for settingStore in tests Update all test files to mock the new settingStore location at @/platform/settings/settingStore instead of @/stores/settingStore * fix: resolve remaining settingStore imports and unused imports after rebase * fix: update settingStore mock path in SelectionToolbox test Fix vi.mock path from @/stores/settingStore to @/platform/settings/settingStore to resolve failing Load3D viewer button test. * refactor: complete comprehensive settings migration to platform layer This commit completes the migration of all settings-related code to the platform layer as part of the Domain-Driven Design (DDD) architecture refactoring. - constants/coreSettings.ts → platform/settings/constants/coreSettings.ts - types/settingTypes.ts → platform/settings/types.ts - stores/settingStore.ts → platform/settings/settingStore.ts (already moved) - composables/setting/useSettingUI.ts → platform/settings/composables/useSettingUI.ts - composables/setting/useSettingSearch.ts → platform/settings/composables/useSettingSearch.ts - composables/useLitegraphSettings.ts → platform/settings/composables/useLitegraphSettings.ts - components/dialog/content/SettingDialogContent.vue → platform/settings/components/SettingDialogContent.vue - components/dialog/content/setting/SettingItem.vue → platform/settings/components/SettingItem.vue - components/dialog/content/setting/SettingGroup.vue → platform/settings/components/SettingGroup.vue - components/dialog/content/setting/SettingsPanel.vue → platform/settings/components/SettingsPanel.vue - components/dialog/content/setting/ColorPaletteMessage.vue → platform/settings/components/ColorPaletteMessage.vue - components/dialog/content/setting/ExtensionPanel.vue → platform/settings/components/ExtensionPanel.vue - components/dialog/content/setting/ServerConfigPanel.vue → platform/settings/components/ServerConfigPanel.vue - ~100+ import statements updated across the codebase - Test file imports corrected - Component imports fixed in dialog service and command menubar - Composable imports updated in GraphCanvas.vue ``` src/platform/settings/ ├── components/ # All settings UI components ├── composables/ # Settings-related composables ├── constants/ # Core settings definitions ├── types.ts # Settings type definitions └── settingStore.ts # Central settings state management ``` ✅ TypeScript compilation successful ✅ All tests passing (settings store, search functionality, UI components) ✅ Production build successful ✅ Domain boundaries properly established This migration consolidates all settings functionality into a cohesive platform domain, improving maintainability and following DDD principles for better code organization. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude * fix: format and lint after rebase conflict resolution * fix: update remaining import paths to platform settings - Fix browser test import: extensionAPI.spec.ts - Fix script import: collect-i18n-general.ts - Complete settings migration import path updates 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --------- Co-authored-by: Claude --- browser_tests/tests/extensionAPI.spec.ts | 8 ++++---- scripts/collect-i18n-general.ts | 2 +- .../LiteGraphCanvasSplitterOverlay.vue | 2 +- src/components/MenuHamburger.vue | 2 +- src/components/actionbar/BatchCountEdit.vue | 2 +- src/components/actionbar/ComfyActionbar.vue | 2 +- src/components/common/FormItem.vue | 2 +- src/components/common/FormRadioGroup.spec.ts | 2 +- src/components/common/FormRadioGroup.vue | 2 +- .../dialog/UnloadWindowConfirmDialog.vue | 2 +- .../content/ConfirmationDialogContent.vue | 2 +- .../dialog/content/MissingModelsWarning.vue | 2 +- .../dialog/content/setting/SettingItem.spec.ts | 2 +- .../dialog/footer/ManagerProgressFooter.vue | 2 +- src/components/graph/GraphCanvas.vue | 6 +++--- src/components/graph/GraphCanvasMenu.vue | 2 +- src/components/graph/NodeTooltip.vue | 2 +- src/components/graph/SelectionToolbox.spec.ts | 2 +- src/components/graph/TitleEditor.vue | 2 +- .../graph/modals/ZoomControlsModal.vue | 2 +- src/components/graph/widgets/DomWidget.vue | 2 +- .../helpcenter/HelpCenterMenuContent.vue | 2 +- src/components/load3d/Load3D.vue | 2 +- .../load3d/controls/LightControls.vue | 2 +- .../controls/viewer/ViewerLightControls.vue | 2 +- src/components/searchbox/NodeSearchBox.vue | 2 +- .../searchbox/NodeSearchBoxPopover.vue | 2 +- src/components/searchbox/NodeSearchItem.vue | 2 +- src/components/sidebar/SideToolbar.vue | 2 +- .../sidebar/SidebarHelpCenterIcon.vue | 2 +- .../sidebar/SidebarTemplatesButton.vue | 2 +- .../sidebar/tabs/ModelLibrarySidebarTab.vue | 2 +- src/components/sidebar/tabs/QueueSidebarTab.vue | 2 +- .../sidebar/tabs/WorkflowsSidebarTab.vue | 2 +- .../sidebar/tabs/modelLibrary/ModelTreeLeaf.vue | 2 +- .../sidebar/tabs/nodeLibrary/NodeTreeLeaf.vue | 2 +- .../sidebar/tabs/queue/ResultItem.vue | 2 +- .../sidebar/tabs/queue/ResultVideo.vue | 2 +- src/components/toast/GlobalToast.vue | 2 +- src/components/topbar/CommandMenubar.vue | 4 ++-- src/components/topbar/TopMenubar.vue | 2 +- src/components/topbar/WorkflowTab.vue | 2 +- src/components/topbar/WorkflowTabPopover.vue | 2 +- src/components/topbar/WorkflowTabs.vue | 2 +- src/composables/element/useAbsolutePosition.ts | 2 +- src/composables/graph/useCanvasInteractions.ts | 2 +- src/composables/graph/useFrameNodes.ts | 2 +- src/composables/graph/useGroupMenuOptions.ts | 2 +- src/composables/graph/useSelectionState.ts | 2 +- src/composables/node/useNodeBadge.ts | 2 +- src/composables/useBrowserTabTitle.ts | 2 +- src/composables/useCoreCommands.ts | 2 +- src/composables/useVueFeatureFlags.ts | 2 +- src/constants/serverConfig.ts | 2 +- src/extensions/core/groupOptions.ts | 2 +- .../core/load3d/Load3DConfiguration.ts | 2 +- .../components}/ColorPaletteMessage.vue | 2 +- .../settings/components}/ExtensionPanel.vue | 5 ++--- .../settings/components}/ServerConfigPanel.vue | 7 +++---- .../components}/SettingDialogContent.vue | 17 ++++++++--------- .../settings/components}/SettingGroup.vue | 4 ++-- .../settings/components}/SettingItem.vue | 4 ++-- .../settings/components}/SettingsPanel.vue | 5 ++--- .../composables/useLitegraphSettings.ts | 2 +- .../settings/composables}/useSettingSearch.ts | 4 ++-- .../settings/composables}/useSettingUI.ts | 14 ++++++++------ .../settings}/constants/coreSettings.ts | 2 +- .../settings}/settingStore.ts | 2 +- .../settings/types.ts} | 0 .../workflow/core/services/workflowService.ts | 2 +- .../composables/useWorkflowsSidebarTab.ts | 2 +- .../composables/useWorkflowAutoSave.ts | 2 +- .../composables/useWorkflowPersistence.ts | 2 +- .../minimap/composables/useMinimap.ts | 2 +- .../minimap/composables/useMinimapSettings.ts | 2 +- .../widgets/composables/useComboWidget.ts | 2 +- .../widgets/composables/useFloatWidget.ts | 2 +- .../composables/useImagePreviewWidget.ts | 2 +- .../widgets/composables/useIntWidget.ts | 2 +- .../widgets/composables/useStringWidget.ts | 2 +- src/scripts/app.ts | 2 +- src/scripts/ui.ts | 2 +- src/scripts/ui/settings.ts | 4 ++-- src/scripts/widgets.ts | 2 +- src/services/colorPaletteService.ts | 2 +- src/services/dialogService.ts | 2 +- src/services/extensionService.ts | 2 +- src/services/keybindingService.ts | 2 +- src/services/litegraphService.ts | 2 +- src/services/newUserService.ts | 2 +- src/stores/modelStore.ts | 2 +- src/stores/nodeBookmarkStore.ts | 2 +- src/stores/releaseStore.ts | 2 +- src/stores/subgraphStore.ts | 2 +- src/stores/workspace/searchBoxStore.ts | 2 +- src/stores/workspaceStore.ts | 2 +- src/types/comfy.ts | 2 +- src/views/GraphView.vue | 2 +- .../dialog/footer/ManagerProgressFooter.test.ts | 4 ++-- .../components/graph/ZoomControlsModal.spec.ts | 2 +- .../tests/composables/BrowserTabTitle.spec.ts | 2 +- .../graph/useCanvasInteractions.test.ts | 4 ++-- .../tests/composables/useCoreCommands.test.ts | 4 ++-- tests-ui/tests/composables/useMinimap.test.ts | 2 +- .../tests/composables/useSettingSearch.test.ts | 9 ++++++--- .../composables/useWorkflowAutoSave.test.ts | 2 +- .../composables/useMinimapSettings.test.ts | 4 ++-- .../widgets/composables/useComboWidget.test.ts | 2 +- .../widgets/composables/useFloatWidget.test.ts | 2 +- .../widgets/composables/useIntWidget.test.ts | 2 +- .../widgets/composables/useRemoteWidget.test.ts | 2 +- .../services/keybindingService.escape.test.ts | 2 +- .../keybindingService.forwarding.test.ts | 2 +- tests-ui/tests/store/modelStore.test.ts | 4 ++-- tests-ui/tests/store/releaseStore.test.ts | 4 ++-- tests-ui/tests/store/searchBoxStore.test.ts | 4 ++-- tests-ui/tests/store/serverConfigStore.test.ts | 2 +- tests-ui/tests/store/settingStore.test.ts | 7 +++++-- 118 files changed, 161 insertions(+), 157 deletions(-) rename src/{components/dialog/content/setting => platform/settings/components}/ColorPaletteMessage.vue (96%) rename src/{components/dialog/content/setting => platform/settings/components}/ExtensionPanel.vue (97%) rename src/{components/dialog/content/setting => platform/settings/components}/ServerConfigPanel.vue (94%) rename src/{components/dialog/content => platform/settings/components}/SettingDialogContent.vue (88%) rename src/{components/dialog/content/setting => platform/settings/components}/SettingGroup.vue (82%) rename src/{components/dialog/content/setting => platform/settings/components}/SettingItem.vue (93%) rename src/{components/dialog/content/setting => platform/settings/components}/SettingsPanel.vue (80%) rename src/{ => platform/settings}/composables/useLitegraphSettings.ts (98%) rename src/{composables/setting => platform/settings/composables}/useSettingSearch.ts (96%) rename src/{composables/setting => platform/settings/composables}/useSettingUI.ts (92%) rename src/{ => platform/settings}/constants/coreSettings.ts (99%) rename src/{stores => platform/settings}/settingStore.ts (99%) rename src/{types/settingTypes.ts => platform/settings/types.ts} (100%) diff --git a/browser_tests/tests/extensionAPI.spec.ts b/browser_tests/tests/extensionAPI.spec.ts index 7711ccf3b..09a08384c 100644 --- a/browser_tests/tests/extensionAPI.spec.ts +++ b/browser_tests/tests/extensionAPI.spec.ts @@ -1,6 +1,6 @@ import { expect } from '@playwright/test' -import { SettingParams } from '../../src/types/settingTypes' +import { SettingParams } from '../../src/platform/settings/types' import { comfyPageFixture as test } from '../fixtures/ComfyPage' test.describe('Topbar commands', () => { @@ -247,7 +247,7 @@ test.describe('Topbar commands', () => { test.describe('Dialog', () => { test('Should allow showing a prompt dialog', async ({ comfyPage }) => { await comfyPage.page.evaluate(() => { - window['app'].extensionManager.dialog + void window['app'].extensionManager.dialog .prompt({ title: 'Test Prompt', message: 'Test Prompt Message' @@ -267,7 +267,7 @@ test.describe('Topbar commands', () => { comfyPage }) => { await comfyPage.page.evaluate(() => { - window['app'].extensionManager.dialog + void window['app'].extensionManager.dialog .confirm({ title: 'Test Confirm', message: 'Test Confirm Message' @@ -284,7 +284,7 @@ test.describe('Topbar commands', () => { test('Should allow dismissing a dialog', async ({ comfyPage }) => { await comfyPage.page.evaluate(() => { window['value'] = 'foo' - window['app'].extensionManager.dialog + void window['app'].extensionManager.dialog .confirm({ title: 'Test Confirm', message: 'Test Confirm Message' diff --git a/scripts/collect-i18n-general.ts b/scripts/collect-i18n-general.ts index 63d97d530..f0b6dde0c 100644 --- a/scripts/collect-i18n-general.ts +++ b/scripts/collect-i18n-general.ts @@ -3,8 +3,8 @@ import * as fs from 'fs' import { comfyPageFixture as test } from '../browser_tests/fixtures/ComfyPage' import { CORE_MENU_COMMANDS } from '../src/constants/coreMenuCommands' import { SERVER_CONFIG_ITEMS } from '../src/constants/serverConfig' +import type { FormItem, SettingParams } from '../src/platform/settings/types' import type { ComfyCommandImpl } from '../src/stores/commandStore' -import type { FormItem, SettingParams } from '../src/types/settingTypes' import { formatCamelCase, normalizeI18nKey } from '../src/utils/formatUtil' const localePath = './src/locales/en/main.json' diff --git a/src/components/LiteGraphCanvasSplitterOverlay.vue b/src/components/LiteGraphCanvasSplitterOverlay.vue index bd5070250..6e3cd5842 100644 --- a/src/components/LiteGraphCanvasSplitterOverlay.vue +++ b/src/components/LiteGraphCanvasSplitterOverlay.vue @@ -50,7 +50,7 @@ import Splitter from 'primevue/splitter' import SplitterPanel from 'primevue/splitterpanel' import { computed } from 'vue' -import { useSettingStore } from '@/stores/settingStore' +import { useSettingStore } from '@/platform/settings/settingStore' import { useBottomPanelStore } from '@/stores/workspace/bottomPanelStore' import { useSidebarTabStore } from '@/stores/workspace/sidebarTabStore' diff --git a/src/components/MenuHamburger.vue b/src/components/MenuHamburger.vue index 58c725763..b46c27e27 100644 --- a/src/components/MenuHamburger.vue +++ b/src/components/MenuHamburger.vue @@ -23,8 +23,8 @@ import Button from 'primevue/button' import { CSSProperties, computed, watchEffect } from 'vue' +import { useSettingStore } from '@/platform/settings/settingStore' import { app } from '@/scripts/app' -import { useSettingStore } from '@/stores/settingStore' import { useWorkspaceStore } from '@/stores/workspaceStore' import { showNativeSystemMenu } from '@/utils/envUtil' diff --git a/src/components/actionbar/BatchCountEdit.vue b/src/components/actionbar/BatchCountEdit.vue index 281b886df..603ca6067 100644 --- a/src/components/actionbar/BatchCountEdit.vue +++ b/src/components/actionbar/BatchCountEdit.vue @@ -37,8 +37,8 @@ import { storeToRefs } from 'pinia' import InputNumber from 'primevue/inputnumber' import { computed } from 'vue' +import { useSettingStore } from '@/platform/settings/settingStore' import { useQueueSettingsStore } from '@/stores/queueStore' -import { useSettingStore } from '@/stores/settingStore' const queueSettingsStore = useQueueSettingsStore() const { batchCount } = storeToRefs(queueSettingsStore) diff --git a/src/components/actionbar/ComfyActionbar.vue b/src/components/actionbar/ComfyActionbar.vue index 44bd579a6..589815dc8 100644 --- a/src/components/actionbar/ComfyActionbar.vue +++ b/src/components/actionbar/ComfyActionbar.vue @@ -24,7 +24,7 @@ import { clamp } from 'es-toolkit/compat' import Panel from 'primevue/panel' import { Ref, computed, inject, nextTick, onMounted, ref, watch } from 'vue' -import { useSettingStore } from '@/stores/settingStore' +import { useSettingStore } from '@/platform/settings/settingStore' import ComfyQueueButton from './ComfyQueueButton.vue' diff --git a/src/components/common/FormItem.vue b/src/components/common/FormItem.vue index 935846bcf..6295a37e8 100644 --- a/src/components/common/FormItem.vue +++ b/src/components/common/FormItem.vue @@ -44,7 +44,7 @@ import FormRadioGroup from '@/components/common/FormRadioGroup.vue' import InputKnob from '@/components/common/InputKnob.vue' import InputSlider from '@/components/common/InputSlider.vue' import UrlInput from '@/components/common/UrlInput.vue' -import { FormItem } from '@/types/settingTypes' +import { FormItem } from '@/platform/settings/types' const formValue = defineModel('formValue') const props = defineProps<{ diff --git a/src/components/common/FormRadioGroup.spec.ts b/src/components/common/FormRadioGroup.spec.ts index c1d7a0483..a014b8ecd 100644 --- a/src/components/common/FormRadioGroup.spec.ts +++ b/src/components/common/FormRadioGroup.spec.ts @@ -4,7 +4,7 @@ import RadioButton from 'primevue/radiobutton' import { beforeAll, describe, expect, it } from 'vitest' import { createApp } from 'vue' -import type { SettingOption } from '@/types/settingTypes' +import type { SettingOption } from '@/platform/settings/types' import FormRadioGroup from './FormRadioGroup.vue' diff --git a/src/components/common/FormRadioGroup.vue b/src/components/common/FormRadioGroup.vue index ca18569b8..19889132b 100644 --- a/src/components/common/FormRadioGroup.vue +++ b/src/components/common/FormRadioGroup.vue @@ -24,7 +24,7 @@ import RadioButton from 'primevue/radiobutton' import { computed } from 'vue' -import type { SettingOption } from '@/types/settingTypes' +import type { SettingOption } from '@/platform/settings/types' const props = defineProps<{ modelValue: any diff --git a/src/components/dialog/UnloadWindowConfirmDialog.vue b/src/components/dialog/UnloadWindowConfirmDialog.vue index 9a9c30bd3..32ccedaa9 100644 --- a/src/components/dialog/UnloadWindowConfirmDialog.vue +++ b/src/components/dialog/UnloadWindowConfirmDialog.vue @@ -12,8 +12,8 @@