[refactor] Improve updates/notifications domain organization (#5590)

* [refactor] Move update-related functionality to platform/updates domain

Reorganizes release management, version compatibility, and notification functionality
following Domain-Driven Design principles, mirroring VSCode's architecture pattern.

- Move releaseService.ts to platform/updates/common/
- Move releaseStore.ts to platform/updates/common/
- Move versionCompatibilityStore.ts to platform/updates/common/
- Move useFrontendVersionMismatchWarning.ts to platform/updates/common/
- Move toastStore.ts to platform/updates/common/
- Move ReleaseNotificationToast.vue to platform/updates/components/
- Move WhatsNewPopup.vue to platform/updates/components/
- Update 25+ import paths across codebase and tests

This creates a cohesive "updates" domain containing all functionality related to
software updates, version checking, release notifications, and user communication
about application state changes.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix imports

---------

Co-authored-by: Claude <noreply@anthropic.com>
This commit is contained in:
Christian Byrne
2025-09-15 04:34:37 -07:00
committed by GitHub
parent 4c8c4a1ad4
commit 27ab355f9c
49 changed files with 70 additions and 61 deletions

View File

@@ -36,8 +36,8 @@ import Button from 'primevue/button'
import InputText from 'primevue/inputtext' import InputText from 'primevue/inputtext'
import { ref } from 'vue' import { ref } from 'vue'
import { useToastStore } from '@/platform/updates/common/toastStore'
import { api } from '@/scripts/api' import { api } from '@/scripts/api'
import { useToastStore } from '@/stores/toastStore'
const modelValue = defineModel<string>() const modelValue = defineModel<string>()

View File

@@ -60,9 +60,9 @@ import NoResultsPlaceholder from '@/components/common/NoResultsPlaceholder.vue'
import MissingCoreNodesMessage from '@/components/dialog/content/MissingCoreNodesMessage.vue' import MissingCoreNodesMessage from '@/components/dialog/content/MissingCoreNodesMessage.vue'
import { useMissingNodes } from '@/composables/nodePack/useMissingNodes' import { useMissingNodes } from '@/composables/nodePack/useMissingNodes'
import { useManagerState } from '@/composables/useManagerState' import { useManagerState } from '@/composables/useManagerState'
import { useToastStore } from '@/platform/updates/common/toastStore'
import { useComfyManagerStore } from '@/stores/comfyManagerStore' import { useComfyManagerStore } from '@/stores/comfyManagerStore'
import { useDialogStore } from '@/stores/dialogStore' import { useDialogStore } from '@/stores/dialogStore'
import { useToastStore } from '@/stores/toastStore'
import type { MissingNodeType } from '@/types/comfy' import type { MissingNodeType } from '@/types/comfy'
import { ManagerTab } from '@/types/comfyManagerTypes' import { ManagerTab } from '@/types/comfyManagerTypes'

View File

@@ -111,6 +111,7 @@ import type { LGraphNode } from '@/lib/litegraph/src/litegraph'
import { useLitegraphSettings } from '@/platform/settings/composables/useLitegraphSettings' import { useLitegraphSettings } from '@/platform/settings/composables/useLitegraphSettings'
import { CORE_SETTINGS } from '@/platform/settings/constants/coreSettings' import { CORE_SETTINGS } from '@/platform/settings/constants/coreSettings'
import { useSettingStore } from '@/platform/settings/settingStore' import { useSettingStore } from '@/platform/settings/settingStore'
import { useToastStore } from '@/platform/updates/common/toastStore'
import { useWorkflowService } from '@/platform/workflow/core/services/workflowService' import { useWorkflowService } from '@/platform/workflow/core/services/workflowService'
import { useWorkflowStore } from '@/platform/workflow/management/stores/workflowStore' import { useWorkflowStore } from '@/platform/workflow/management/stores/workflowStore'
import { useWorkflowAutoSave } from '@/platform/workflow/persistence/composables/useWorkflowAutoSave' import { useWorkflowAutoSave } from '@/platform/workflow/persistence/composables/useWorkflowAutoSave'
@@ -131,7 +132,6 @@ import { newUserService } from '@/services/newUserService'
import { useCommandStore } from '@/stores/commandStore' import { useCommandStore } from '@/stores/commandStore'
import { useExecutionStore } from '@/stores/executionStore' import { useExecutionStore } from '@/stores/executionStore'
import { useNodeDefStore } from '@/stores/nodeDefStore' import { useNodeDefStore } from '@/stores/nodeDefStore'
import { useToastStore } from '@/stores/toastStore'
import { useColorPaletteStore } from '@/stores/workspace/colorPaletteStore' import { useColorPaletteStore } from '@/stores/workspace/colorPaletteStore'
import { useSearchBoxStore } from '@/stores/workspace/searchBoxStore' import { useSearchBoxStore } from '@/stores/workspace/searchBoxStore'
import { useWorkspaceStore } from '@/stores/workspaceStore' import { useWorkspaceStore } from '@/stores/workspaceStore'
@@ -431,7 +431,9 @@ onMounted(async () => {
workflowPersistence.restoreWorkflowTabsState() workflowPersistence.restoreWorkflowTabsState()
// Initialize release store to fetch releases from comfy-api (fire-and-forget) // Initialize release store to fetch releases from comfy-api (fire-and-forget)
const { useReleaseStore } = await import('@/stores/releaseStore') const { useReleaseStore } = await import(
'@/platform/updates/common/releaseStore'
)
const releaseStore = useReleaseStore() const releaseStore = useReleaseStore()
void releaseStore.initialize() void releaseStore.initialize()

View File

@@ -144,9 +144,9 @@ import PuzzleIcon from '@/components/icons/PuzzleIcon.vue'
import { useConflictAcknowledgment } from '@/composables/useConflictAcknowledgment' import { useConflictAcknowledgment } from '@/composables/useConflictAcknowledgment'
import { useManagerState } from '@/composables/useManagerState' import { useManagerState } from '@/composables/useManagerState'
import { useSettingStore } from '@/platform/settings/settingStore' import { useSettingStore } from '@/platform/settings/settingStore'
import { type ReleaseNote } from '@/services/releaseService' import { type ReleaseNote } from '@/platform/updates/common/releaseService'
import { useReleaseStore } from '@/platform/updates/common/releaseStore'
import { useCommandStore } from '@/stores/commandStore' import { useCommandStore } from '@/stores/commandStore'
import { useReleaseStore } from '@/stores/releaseStore'
import { ManagerTab } from '@/types/comfyManagerTypes' import { ManagerTab } from '@/types/comfyManagerTypes'
import { electronAPI, isElectron } from '@/utils/envUtil' import { electronAPI, isElectron } from '@/utils/envUtil'
import { formatVersionAnchor } from '@/utils/formatUtil' import { formatVersionAnchor } from '@/utils/formatUtil'

View File

@@ -102,9 +102,9 @@ import {
UpDirection UpDirection
} from '@/extensions/core/load3d/interfaces' } from '@/extensions/core/load3d/interfaces'
import { useSettingStore } from '@/platform/settings/settingStore' import { useSettingStore } from '@/platform/settings/settingStore'
import { useToastStore } from '@/platform/updates/common/toastStore'
import type { CustomInputSpec } from '@/schemas/nodeDef/nodeDefSchemaV2' import type { CustomInputSpec } from '@/schemas/nodeDef/nodeDefSchemaV2'
import type { ComponentWidget } from '@/scripts/domWidget' import type { ComponentWidget } from '@/scripts/domWidget'
import { useToastStore } from '@/stores/toastStore'
const { t } = useI18n() const { t } = useI18n()
const { widget } = defineProps<{ const { widget } = defineProps<{

View File

@@ -62,14 +62,14 @@ import { storeToRefs } from 'pinia'
import { computed, onMounted } from 'vue' import { computed, onMounted } from 'vue'
import HelpCenterMenuContent from '@/components/helpcenter/HelpCenterMenuContent.vue' import HelpCenterMenuContent from '@/components/helpcenter/HelpCenterMenuContent.vue'
import ReleaseNotificationToast from '@/components/helpcenter/ReleaseNotificationToast.vue'
import WhatsNewPopup from '@/components/helpcenter/WhatsNewPopup.vue'
import { useConflictAcknowledgment } from '@/composables/useConflictAcknowledgment' import { useConflictAcknowledgment } from '@/composables/useConflictAcknowledgment'
import { useConflictDetection } from '@/composables/useConflictDetection' import { useConflictDetection } from '@/composables/useConflictDetection'
import { useSettingStore } from '@/platform/settings/settingStore' import { useSettingStore } from '@/platform/settings/settingStore'
import { useReleaseStore } from '@/platform/updates/common/releaseStore'
import ReleaseNotificationToast from '@/platform/updates/components/ReleaseNotificationToast.vue'
import WhatsNewPopup from '@/platform/updates/components/WhatsNewPopup.vue'
import { useDialogService } from '@/services/dialogService' import { useDialogService } from '@/services/dialogService'
import { useHelpCenterStore } from '@/stores/helpCenterStore' import { useHelpCenterStore } from '@/stores/helpCenterStore'
import { useReleaseStore } from '@/stores/releaseStore'
import SidebarIcon from './SidebarIcon.vue' import SidebarIcon from './SidebarIcon.vue'

View File

@@ -8,7 +8,7 @@ import { useToast } from 'primevue/usetoast'
import { nextTick, watch } from 'vue' import { nextTick, watch } from 'vue'
import { useSettingStore } from '@/platform/settings/settingStore' import { useSettingStore } from '@/platform/settings/settingStore'
import { useToastStore } from '@/stores/toastStore' import { useToastStore } from '@/platform/updates/common/toastStore'
const toast = useToast() const toast = useToast()
const toastStore = useToastStore() const toastStore = useToastStore()

View File

@@ -3,8 +3,8 @@ import { ref } from 'vue'
import { useErrorHandling } from '@/composables/useErrorHandling' import { useErrorHandling } from '@/composables/useErrorHandling'
import { t } from '@/i18n' import { t } from '@/i18n'
import { useToastStore } from '@/platform/updates/common/toastStore'
import { useFirebaseAuthStore } from '@/stores/firebaseAuthStore' import { useFirebaseAuthStore } from '@/stores/firebaseAuthStore'
import { useToastStore } from '@/stores/toastStore'
import { usdToMicros } from '@/utils/formatUtil' import { usdToMicros } from '@/utils/formatUtil'
/** /**

View File

@@ -1,6 +1,7 @@
// import { useSelectedLiteGraphItems } from '@/composables/canvas/useSelectedLiteGraphItems' // Unused for now // import { useSelectedLiteGraphItems } from '@/composables/canvas/useSelectedLiteGraphItems' // Unused for now
import { t } from '@/i18n' import { t } from '@/i18n'
import { LGraphNode } from '@/lib/litegraph/src/litegraph' import { LGraphNode } from '@/lib/litegraph/src/litegraph'
import { useToastStore } from '@/platform/updates/common/toastStore'
import { useWorkflowStore } from '@/platform/workflow/management/stores/workflowStore' import { useWorkflowStore } from '@/platform/workflow/management/stores/workflowStore'
import { import {
useCanvasStore, useCanvasStore,
@@ -8,7 +9,6 @@ import {
} from '@/renderer/core/canvas/canvasStore' } from '@/renderer/core/canvas/canvasStore'
import { app } from '@/scripts/app' import { app } from '@/scripts/app'
import { useDialogService } from '@/services/dialogService' import { useDialogService } from '@/services/dialogService'
import { useToastStore } from '@/stores/toastStore'
/** /**
* Composable for handling basic selection operations like copy, paste, duplicate, delete, rename * Composable for handling basic selection operations like copy, paste, duplicate, delete, rename

View File

@@ -2,9 +2,9 @@ import { useNodeDragAndDrop } from '@/composables/node/useNodeDragAndDrop'
import { useNodeFileInput } from '@/composables/node/useNodeFileInput' import { useNodeFileInput } from '@/composables/node/useNodeFileInput'
import { useNodePaste } from '@/composables/node/useNodePaste' import { useNodePaste } from '@/composables/node/useNodePaste'
import type { LGraphNode } from '@/lib/litegraph/src/litegraph' import type { LGraphNode } from '@/lib/litegraph/src/litegraph'
import { useToastStore } from '@/platform/updates/common/toastStore'
import type { ResultItemType } from '@/schemas/apiSchema' import type { ResultItemType } from '@/schemas/apiSchema'
import { api } from '@/scripts/api' import { api } from '@/scripts/api'
import { useToastStore } from '@/stores/toastStore'
const PASTED_IMAGE_EXPIRY_MS = 2000 const PASTED_IMAGE_EXPIRY_MS = 2000

View File

@@ -16,6 +16,7 @@ import {
} from '@/lib/litegraph/src/litegraph' } from '@/lib/litegraph/src/litegraph'
import { Point } from '@/lib/litegraph/src/litegraph' import { Point } from '@/lib/litegraph/src/litegraph'
import { useSettingStore } from '@/platform/settings/settingStore' import { useSettingStore } from '@/platform/settings/settingStore'
import { useToastStore } from '@/platform/updates/common/toastStore'
import { useWorkflowService } from '@/platform/workflow/core/services/workflowService' import { useWorkflowService } from '@/platform/workflow/core/services/workflowService'
import { import {
type ComfyWorkflow, type ComfyWorkflow,
@@ -36,7 +37,6 @@ import { useNodeOutputStore } from '@/stores/imagePreviewStore'
import { useQueueSettingsStore, useQueueStore } from '@/stores/queueStore' import { useQueueSettingsStore, useQueueStore } from '@/stores/queueStore'
import { useSubgraphNavigationStore } from '@/stores/subgraphNavigationStore' import { useSubgraphNavigationStore } from '@/stores/subgraphNavigationStore'
import { useSubgraphStore } from '@/stores/subgraphStore' import { useSubgraphStore } from '@/stores/subgraphStore'
import { useToastStore } from '@/stores/toastStore'
import { useBottomPanelStore } from '@/stores/workspace/bottomPanelStore' import { useBottomPanelStore } from '@/stores/workspace/bottomPanelStore'
import { useColorPaletteStore } from '@/stores/workspace/colorPaletteStore' import { useColorPaletteStore } from '@/stores/workspace/colorPaletteStore'
import { useSearchBoxStore } from '@/stores/workspace/searchBoxStore' import { useSearchBoxStore } from '@/stores/workspace/searchBoxStore'

View File

@@ -1,5 +1,5 @@
import { t } from '@/i18n' import { t } from '@/i18n'
import { useToastStore } from '@/stores/toastStore' import { useToastStore } from '@/platform/updates/common/toastStore'
export function useErrorHandling() { export function useErrorHandling() {
const toast = useToastStore() const toast = useToastStore()

View File

@@ -9,8 +9,8 @@ import {
} from '@/extensions/core/load3d/interfaces' } from '@/extensions/core/load3d/interfaces'
import { t } from '@/i18n' import { t } from '@/i18n'
import { LGraphNode } from '@/lib/litegraph/src/LGraphNode' import { LGraphNode } from '@/lib/litegraph/src/LGraphNode'
import { useToastStore } from '@/platform/updates/common/toastStore'
import { useLoad3dService } from '@/services/load3dService' import { useLoad3dService } from '@/services/load3dService'
import { useToastStore } from '@/stores/toastStore'
interface Load3dViewerState { interface Load3dViewerState {
backgroundColor: string backgroundColor: string

View File

@@ -2,11 +2,11 @@ import { storeToRefs } from 'pinia'
import { computed, readonly } from 'vue' import { computed, readonly } from 'vue'
import { t } from '@/i18n' import { t } from '@/i18n'
import { useToastStore } from '@/platform/updates/common/toastStore'
import { api } from '@/scripts/api' import { api } from '@/scripts/api'
import { useDialogService } from '@/services/dialogService' import { useDialogService } from '@/services/dialogService'
import { useCommandStore } from '@/stores/commandStore' import { useCommandStore } from '@/stores/commandStore'
import { useSystemStatsStore } from '@/stores/systemStatsStore' import { useSystemStatsStore } from '@/stores/systemStatsStore'
import { useToastStore } from '@/stores/toastStore'
import { ManagerTab } from '@/types/comfyManagerTypes' import { ManagerTab } from '@/types/comfyManagerTypes'
export enum ManagerUIState { export enum ManagerUIState {

View File

@@ -2,10 +2,10 @@ import log from 'loglevel'
import { PYTHON_MIRROR } from '@/constants/uvMirrors' import { PYTHON_MIRROR } from '@/constants/uvMirrors'
import { t } from '@/i18n' import { t } from '@/i18n'
import { useToastStore } from '@/platform/updates/common/toastStore'
import { useWorkflowStore } from '@/platform/workflow/management/stores/workflowStore' import { useWorkflowStore } from '@/platform/workflow/management/stores/workflowStore'
import { app } from '@/scripts/app' import { app } from '@/scripts/app'
import { useDialogService } from '@/services/dialogService' import { useDialogService } from '@/services/dialogService'
import { useToastStore } from '@/stores/toastStore'
import { electronAPI as getElectronAPI, isElectron } from '@/utils/envUtil' import { electronAPI as getElectronAPI, isElectron } from '@/utils/envUtil'
import { checkMirrorReachable } from '@/utils/networkUtil' import { checkMirrorReachable } from '@/utils/networkUtil'

View File

@@ -9,6 +9,7 @@ import {
LiteGraph, LiteGraph,
SubgraphNode SubgraphNode
} from '@/lib/litegraph/src/litegraph' } from '@/lib/litegraph/src/litegraph'
import { useToastStore } from '@/platform/updates/common/toastStore'
import { import {
ComfyLink, ComfyLink,
ComfyNode, ComfyNode,
@@ -18,7 +19,6 @@ import type { ComfyNodeDef } from '@/schemas/nodeDefSchema'
import { useDialogService } from '@/services/dialogService' import { useDialogService } from '@/services/dialogService'
import { useExecutionStore } from '@/stores/executionStore' import { useExecutionStore } from '@/stores/executionStore'
import { useNodeDefStore } from '@/stores/nodeDefStore' import { useNodeDefStore } from '@/stores/nodeDefStore'
import { useToastStore } from '@/stores/toastStore'
import { useWidgetStore } from '@/stores/widgetStore' import { useWidgetStore } from '@/stores/widgetStore'
import { ComfyExtension } from '@/types/comfy' import { ComfyExtension } from '@/types/comfy'
import { ExecutableGroupNodeChildDTO } from '@/utils/executableGroupNodeChildDTO' import { ExecutableGroupNodeChildDTO } from '@/utils/executableGroupNodeChildDTO'

View File

@@ -4,7 +4,7 @@ import {
type LGraphNodeConstructor, type LGraphNodeConstructor,
LiteGraph LiteGraph
} from '@/lib/litegraph/src/litegraph' } from '@/lib/litegraph/src/litegraph'
import { useToastStore } from '@/stores/toastStore' import { useToastStore } from '@/platform/updates/common/toastStore'
import { type ComfyApp, app } from '../../scripts/app' import { type ComfyApp, app } from '../../scripts/app'
import { $el } from '../../scripts/ui' import { $el } from '../../scripts/ui'

View File

@@ -8,6 +8,7 @@ import Load3dAnimation from '@/extensions/core/load3d/Load3dAnimation'
import Load3dUtils from '@/extensions/core/load3d/Load3dUtils' import Load3dUtils from '@/extensions/core/load3d/Load3dUtils'
import { t } from '@/i18n' import { t } from '@/i18n'
import type { IStringWidget } from '@/lib/litegraph/src/types/widgets' import type { IStringWidget } from '@/lib/litegraph/src/types/widgets'
import { useToastStore } from '@/platform/updates/common/toastStore'
import { CustomInputSpec } from '@/schemas/nodeDef/nodeDefSchemaV2' import { CustomInputSpec } from '@/schemas/nodeDef/nodeDefSchemaV2'
import { api } from '@/scripts/api' import { api } from '@/scripts/api'
import { ComfyApp, app } from '@/scripts/app' import { ComfyApp, app } from '@/scripts/app'
@@ -15,7 +16,6 @@ import { ComponentWidgetImpl, addWidget } from '@/scripts/domWidget'
import { useExtensionService } from '@/services/extensionService' import { useExtensionService } from '@/services/extensionService'
import { useLoad3dService } from '@/services/load3dService' import { useLoad3dService } from '@/services/load3dService'
import { useDialogStore } from '@/stores/dialogStore' import { useDialogStore } from '@/stores/dialogStore'
import { useToastStore } from '@/stores/toastStore'
import { isLoad3dNode } from '@/utils/litegraphUtil' import { isLoad3dNode } from '@/utils/litegraphUtil'
async function handleModelUpload(files: FileList, node: any) { async function handleModelUpload(files: FileList, node: any) {

View File

@@ -1,7 +1,7 @@
import { t } from '@/i18n' import { t } from '@/i18n'
import { useToastStore } from '@/platform/updates/common/toastStore'
import { api } from '@/scripts/api' import { api } from '@/scripts/api'
import { app } from '@/scripts/app' import { app } from '@/scripts/app'
import { useToastStore } from '@/stores/toastStore'
class Load3dUtils { class Load3dUtils {
static async uploadTempImage( static async uploadTempImage(

View File

@@ -6,7 +6,7 @@ import { OBJLoader } from 'three/examples/jsm/loaders/OBJLoader'
import { STLLoader } from 'three/examples/jsm/loaders/STLLoader' import { STLLoader } from 'three/examples/jsm/loaders/STLLoader'
import { t } from '@/i18n' import { t } from '@/i18n'
import { useToastStore } from '@/stores/toastStore' import { useToastStore } from '@/platform/updates/common/toastStore'
import { import {
EventManagerInterface, EventManagerInterface,

View File

@@ -4,7 +4,7 @@ import { OBJExporter } from 'three/examples/jsm/exporters/OBJExporter'
import { STLExporter } from 'three/examples/jsm/exporters/STLExporter' import { STLExporter } from 'three/examples/jsm/exporters/STLExporter'
import { t } from '@/i18n' import { t } from '@/i18n'
import { useToastStore } from '@/stores/toastStore' import { useToastStore } from '@/platform/updates/common/toastStore'
export class ModelExporter { export class ModelExporter {
static detectFormatFromURL(url: string): string | null { static detectFormatFromURL(url: string): string | null {

View File

@@ -1,7 +1,7 @@
import { t } from '@/i18n' import { t } from '@/i18n'
import { LGraphCanvas } from '@/lib/litegraph/src/litegraph' import { LGraphCanvas } from '@/lib/litegraph/src/litegraph'
import { useToastStore } from '@/platform/updates/common/toastStore'
import { useDialogService } from '@/services/dialogService' import { useDialogService } from '@/services/dialogService'
import { useToastStore } from '@/stores/toastStore'
import { deserialiseAndCreate } from '@/utils/vintageClipboard' import { deserialiseAndCreate } from '@/utils/vintageClipboard'
import { api } from '../../scripts/api' import { api } from '../../scripts/api'

View File

@@ -10,11 +10,11 @@ import type {
IBaseWidget, IBaseWidget,
IStringWidget IStringWidget
} from '@/lib/litegraph/src/types/widgets' } from '@/lib/litegraph/src/types/widgets'
import { useToastStore } from '@/platform/updates/common/toastStore'
import type { ResultItemType } from '@/schemas/apiSchema' import type { ResultItemType } from '@/schemas/apiSchema'
import type { ComfyNodeDef } from '@/schemas/nodeDefSchema' import type { ComfyNodeDef } from '@/schemas/nodeDefSchema'
import type { DOMWidget } from '@/scripts/domWidget' import type { DOMWidget } from '@/scripts/domWidget'
import { useAudioService } from '@/services/audioService' import { useAudioService } from '@/services/audioService'
import { useToastStore } from '@/stores/toastStore'
import { NodeLocatorId } from '@/types' import { NodeLocatorId } from '@/types'
import { getNodeByLocatorId } from '@/utils/graphTraversalUtil' import { getNodeByLocatorId } from '@/utils/graphTraversalUtil'

View File

@@ -1,5 +1,5 @@
import { t } from '@/i18n' import { t } from '@/i18n'
import { useToastStore } from '@/stores/toastStore' import { useToastStore } from '@/platform/updates/common/toastStore'
import { api } from '../../scripts/api' import { api } from '../../scripts/api'
import { app } from '../../scripts/app' import { app } from '../../scripts/app'

View File

@@ -3,11 +3,12 @@ import { defineStore } from 'pinia'
import { computed, ref } from 'vue' import { computed, ref } from 'vue'
import { useSettingStore } from '@/platform/settings/settingStore' import { useSettingStore } from '@/platform/settings/settingStore'
import { type ReleaseNote, useReleaseService } from '@/services/releaseService'
import { useSystemStatsStore } from '@/stores/systemStatsStore' import { useSystemStatsStore } from '@/stores/systemStatsStore'
import { isElectron } from '@/utils/envUtil' import { isElectron } from '@/utils/envUtil'
import { compareVersions, stringToLocale } from '@/utils/formatUtil' import { compareVersions, stringToLocale } from '@/utils/formatUtil'
import { type ReleaseNote, useReleaseService } from './releaseService'
// Store for managing release notes // Store for managing release notes
export const useReleaseStore = defineStore('release', () => { export const useReleaseStore = defineStore('release', () => {
// State // State

View File

@@ -2,8 +2,8 @@ import { whenever } from '@vueuse/core'
import { computed, onMounted } from 'vue' import { computed, onMounted } from 'vue'
import { useI18n } from 'vue-i18n' import { useI18n } from 'vue-i18n'
import { useToastStore } from '@/stores/toastStore' import { useToastStore } from './toastStore'
import { useVersionCompatibilityStore } from '@/stores/versionCompatibilityStore' import { useVersionCompatibilityStore } from './versionCompatibilityStore'
interface UseFrontendVersionMismatchWarningOptions { interface UseFrontendVersionMismatchWarningOptions {
immediate?: boolean immediate?: boolean

View File

@@ -48,10 +48,11 @@
import { computed, onMounted, ref, watch } from 'vue' import { computed, onMounted, ref, watch } from 'vue'
import { useI18n } from 'vue-i18n' import { useI18n } from 'vue-i18n'
import type { ReleaseNote } from '@/services/releaseService'
import { useReleaseStore } from '@/stores/releaseStore'
import { formatVersionAnchor } from '@/utils/formatUtil' import { formatVersionAnchor } from '@/utils/formatUtil'
import type { ReleaseNote } from '../common/releaseService'
import { useReleaseStore } from '../common/releaseStore'
const { locale } = useI18n() const { locale } = useI18n()
const releaseStore = useReleaseStore() const releaseStore = useReleaseStore()

View File

@@ -68,10 +68,11 @@ import { marked } from 'marked'
import { computed, onMounted, ref } from 'vue' import { computed, onMounted, ref } from 'vue'
import { useI18n } from 'vue-i18n' import { useI18n } from 'vue-i18n'
import type { ReleaseNote } from '@/services/releaseService'
import { useReleaseStore } from '@/stores/releaseStore'
import { formatVersionAnchor } from '@/utils/formatUtil' import { formatVersionAnchor } from '@/utils/formatUtil'
import type { ReleaseNote } from '../common/releaseService'
import { useReleaseStore } from '../common/releaseStore'
const { locale, t } = useI18n() const { locale, t } = useI18n()
const releaseStore = useReleaseStore() const releaseStore = useReleaseStore()

View File

@@ -4,6 +4,7 @@ import { t } from '@/i18n'
import { LGraph, LGraphCanvas } from '@/lib/litegraph/src/litegraph' import { LGraph, LGraphCanvas } from '@/lib/litegraph/src/litegraph'
import type { SerialisableGraph, Vector2 } from '@/lib/litegraph/src/litegraph' import type { SerialisableGraph, Vector2 } from '@/lib/litegraph/src/litegraph'
import { useSettingStore } from '@/platform/settings/settingStore' import { useSettingStore } from '@/platform/settings/settingStore'
import { useToastStore } from '@/platform/updates/common/toastStore'
import { import {
ComfyWorkflow, ComfyWorkflow,
useWorkflowStore useWorkflowStore
@@ -15,7 +16,6 @@ import { blankGraph, defaultGraph } from '@/scripts/defaultGraph'
import { downloadBlob } from '@/scripts/utils' import { downloadBlob } from '@/scripts/utils'
import { useDialogService } from '@/services/dialogService' import { useDialogService } from '@/services/dialogService'
import { useDomWidgetStore } from '@/stores/domWidgetStore' import { useDomWidgetStore } from '@/stores/domWidgetStore'
import { useToastStore } from '@/stores/toastStore'
import { useWorkspaceStore } from '@/stores/workspaceStore' import { useWorkspaceStore } from '@/stores/workspaceStore'
import { appendJsonExt, generateUUID } from '@/utils/formatUtil' import { appendJsonExt, generateUUID } from '@/utils/formatUtil'

View File

@@ -1,7 +1,7 @@
import type { ISerialisedGraph } from '@/lib/litegraph/src/types/serialisation' import type { ISerialisedGraph } from '@/lib/litegraph/src/types/serialisation'
import { useToastStore } from '@/platform/updates/common/toastStore'
import type { ComfyWorkflowJSON } from '@/platform/workflow/validation/schemas/workflowSchema' import type { ComfyWorkflowJSON } from '@/platform/workflow/validation/schemas/workflowSchema'
import { validateComfyWorkflow } from '@/platform/workflow/validation/schemas/workflowSchema' import { validateComfyWorkflow } from '@/platform/workflow/validation/schemas/workflowSchema'
import { useToastStore } from '@/stores/toastStore'
import { fixBadLinks } from '@/utils/linkFixer' import { fixBadLinks } from '@/utils/linkFixer'
interface ValidationResult { interface ValidationResult {

View File

@@ -2,6 +2,7 @@ import axios from 'axios'
import { get } from 'es-toolkit/compat' import { get } from 'es-toolkit/compat'
import defaultClientFeatureFlags from '@/config/clientFeatureFlags.json' with { type: 'json' } import defaultClientFeatureFlags from '@/config/clientFeatureFlags.json' with { type: 'json' }
import { useToastStore } from '@/platform/updates/common/toastStore'
import { WorkflowTemplates } from '@/platform/workflow/templates/types/template' import { WorkflowTemplates } from '@/platform/workflow/templates/types/template'
import type { import type {
ComfyApiWorkflow, ComfyApiWorkflow,
@@ -38,7 +39,6 @@ import type {
} from '@/schemas/apiSchema' } from '@/schemas/apiSchema'
import type { ModelFile, ModelFolderInfo } from '@/schemas/assetSchema' import type { ModelFile, ModelFolderInfo } from '@/schemas/assetSchema'
import type { ComfyNodeDef } from '@/schemas/nodeDefSchema' import type { ComfyNodeDef } from '@/schemas/nodeDefSchema'
import { useToastStore } from '@/stores/toastStore'
import type { NodeExecutionId } from '@/types/nodeIdentification' import type { NodeExecutionId } from '@/types/nodeIdentification'
interface QueuePromptRequestBody { interface QueuePromptRequestBody {

View File

@@ -14,6 +14,7 @@ import {
import type { Vector2 } from '@/lib/litegraph/src/litegraph' import type { Vector2 } from '@/lib/litegraph/src/litegraph'
import type { IBaseWidget } from '@/lib/litegraph/src/types/widgets' import type { IBaseWidget } from '@/lib/litegraph/src/types/widgets'
import { useSettingStore } from '@/platform/settings/settingStore' import { useSettingStore } from '@/platform/settings/settingStore'
import { useToastStore } from '@/platform/updates/common/toastStore'
import { useWorkflowService } from '@/platform/workflow/core/services/workflowService' import { useWorkflowService } from '@/platform/workflow/core/services/workflowService'
import { ComfyWorkflow } from '@/platform/workflow/management/stores/workflowStore' import { ComfyWorkflow } from '@/platform/workflow/management/stores/workflowStore'
import { useWorkflowValidation } from '@/platform/workflow/validation/composables/useWorkflowValidation' import { useWorkflowValidation } from '@/platform/workflow/validation/composables/useWorkflowValidation'
@@ -55,7 +56,6 @@ import { KeyComboImpl, useKeybindingStore } from '@/stores/keybindingStore'
import { useModelStore } from '@/stores/modelStore' import { useModelStore } from '@/stores/modelStore'
import { SYSTEM_NODE_DEFS, useNodeDefStore } from '@/stores/nodeDefStore' import { SYSTEM_NODE_DEFS, useNodeDefStore } from '@/stores/nodeDefStore'
import { useSubgraphStore } from '@/stores/subgraphStore' import { useSubgraphStore } from '@/stores/subgraphStore'
import { useToastStore } from '@/stores/toastStore'
import { useWidgetStore } from '@/stores/widgetStore' import { useWidgetStore } from '@/stores/widgetStore'
import { useColorPaletteStore } from '@/stores/workspace/colorPaletteStore' import { useColorPaletteStore } from '@/stores/workspace/colorPaletteStore'
import { useWorkspaceStore } from '@/stores/workspaceStore' import { useWorkspaceStore } from '@/stores/workspaceStore'

View File

@@ -1,9 +1,9 @@
import { t } from '@/i18n' import { t } from '@/i18n'
import { useSettingStore } from '@/platform/settings/settingStore' import { useSettingStore } from '@/platform/settings/settingStore'
import type { SettingParams } from '@/platform/settings/types' import type { SettingParams } from '@/platform/settings/types'
import { useToastStore } from '@/platform/updates/common/toastStore'
import type { Settings } from '@/schemas/apiSchema' import type { Settings } from '@/schemas/apiSchema'
import type { ComfyApp } from '@/scripts/app' import type { ComfyApp } from '@/scripts/app'
import { useToastStore } from '@/stores/toastStore'
import { ComfyDialog } from './dialog' import { ComfyDialog } from './dialog'

View File

@@ -1,8 +1,8 @@
import { register } from 'extendable-media-recorder' import { register } from 'extendable-media-recorder'
import { connect } from 'extendable-media-recorder-wav-encoder' import { connect } from 'extendable-media-recorder-wav-encoder'
import { useToastStore } from '@/platform/updates/common/toastStore'
import { api } from '@/scripts/api' import { api } from '@/scripts/api'
import { useToastStore } from '@/stores/toastStore'
export interface AudioRecordingError { export interface AudioRecordingError {
type: 'permission' | 'not_supported' | 'encoder' | 'recording' | 'unknown' type: 'permission' | 'not_supported' | 'encoder' | 'recording' | 'unknown'

View File

@@ -25,6 +25,7 @@ import type {
ISerialisedNode ISerialisedNode
} from '@/lib/litegraph/src/types/serialisation' } from '@/lib/litegraph/src/types/serialisation'
import { useSettingStore } from '@/platform/settings/settingStore' import { useSettingStore } from '@/platform/settings/settingStore'
import { useToastStore } from '@/platform/updates/common/toastStore'
import { useWorkflowStore } from '@/platform/workflow/management/stores/workflowStore' import { useWorkflowStore } from '@/platform/workflow/management/stores/workflowStore'
import type { NodeId } from '@/platform/workflow/validation/schemas/workflowSchema' import type { NodeId } from '@/platform/workflow/validation/schemas/workflowSchema'
import { useCanvasStore } from '@/renderer/core/canvas/canvasStore' import { useCanvasStore } from '@/renderer/core/canvas/canvasStore'
@@ -43,7 +44,6 @@ import { useExecutionStore } from '@/stores/executionStore'
import { useNodeOutputStore } from '@/stores/imagePreviewStore' import { useNodeOutputStore } from '@/stores/imagePreviewStore'
import { ComfyNodeDefImpl } from '@/stores/nodeDefStore' import { ComfyNodeDefImpl } from '@/stores/nodeDefStore'
import { useSubgraphStore } from '@/stores/subgraphStore' import { useSubgraphStore } from '@/stores/subgraphStore'
import { useToastStore } from '@/stores/toastStore'
import { useWidgetStore } from '@/stores/widgetStore' import { useWidgetStore } from '@/stores/widgetStore'
import { normalizeI18nKey } from '@/utils/formatUtil' import { normalizeI18nKey } from '@/utils/formatUtil'
import { import {

View File

@@ -4,8 +4,8 @@ import { computed, ref, watch } from 'vue'
import { useErrorHandling } from '@/composables/useErrorHandling' import { useErrorHandling } from '@/composables/useErrorHandling'
import { t } from '@/i18n' import { t } from '@/i18n'
import { useToastStore } from '@/platform/updates/common/toastStore'
import { useFirebaseAuthStore } from '@/stores/firebaseAuthStore' import { useFirebaseAuthStore } from '@/stores/firebaseAuthStore'
import { useToastStore } from '@/stores/toastStore'
import { ApiKeyAuthHeader } from '@/types/authTypes' import { ApiKeyAuthHeader } from '@/types/authTypes'
import { operations } from '@/types/comfyRegistryTypes' import { operations } from '@/types/comfyRegistryTypes'

View File

@@ -4,6 +4,7 @@ import { computed, ref } from 'vue'
import { t } from '@/i18n' import { t } from '@/i18n'
import { SubgraphNode } from '@/lib/litegraph/src/litegraph' import { SubgraphNode } from '@/lib/litegraph/src/litegraph'
import { useSettingStore } from '@/platform/settings/settingStore' import { useSettingStore } from '@/platform/settings/settingStore'
import { useToastStore } from '@/platform/updates/common/toastStore'
import { useWorkflowService } from '@/platform/workflow/core/services/workflowService' import { useWorkflowService } from '@/platform/workflow/core/services/workflowService'
import { import {
ComfyWorkflow, ComfyWorkflow,
@@ -25,7 +26,6 @@ import { api } from '@/scripts/api'
import { useDialogService } from '@/services/dialogService' import { useDialogService } from '@/services/dialogService'
import { useExecutionStore } from '@/stores/executionStore' import { useExecutionStore } from '@/stores/executionStore'
import { ComfyNodeDefImpl } from '@/stores/nodeDefStore' import { ComfyNodeDefImpl } from '@/stores/nodeDefStore'
import { useToastStore } from '@/stores/toastStore'
import { UserFile } from '@/stores/userFileStore' import { UserFile } from '@/stores/userFileStore'
async function confirmOverwrite(name: string): Promise<boolean | null> { async function confirmOverwrite(name: string): Promise<boolean | null> {

View File

@@ -2,6 +2,7 @@ import { defineStore } from 'pinia'
import { computed, ref } from 'vue' import { computed, ref } from 'vue'
import { useSettingStore } from '@/platform/settings/settingStore' import { useSettingStore } from '@/platform/settings/settingStore'
import { useToastStore } from '@/platform/updates/common/toastStore'
import { useWorkflowStore } from '@/platform/workflow/management/stores/workflowStore' import { useWorkflowStore } from '@/platform/workflow/management/stores/workflowStore'
import type { Settings } from '@/schemas/apiSchema' import type { Settings } from '@/schemas/apiSchema'
import { useColorPaletteService } from '@/services/colorPaletteService' import { useColorPaletteService } from '@/services/colorPaletteService'
@@ -12,7 +13,6 @@ import { useApiKeyAuthStore } from './apiKeyAuthStore'
import { useCommandStore } from './commandStore' import { useCommandStore } from './commandStore'
import { useFirebaseAuthStore } from './firebaseAuthStore' import { useFirebaseAuthStore } from './firebaseAuthStore'
import { useQueueSettingsStore } from './queueStore' import { useQueueSettingsStore } from './queueStore'
import { useToastStore } from './toastStore'
import { useBottomPanelStore } from './workspace/bottomPanelStore' import { useBottomPanelStore } from './workspace/bottomPanelStore'
import { useSidebarTabStore } from './workspace/sidebarTabStore' import { useSidebarTabStore } from './workspace/sidebarTabStore'

View File

@@ -42,11 +42,12 @@ import TopMenubar from '@/components/topbar/TopMenubar.vue'
import { useBrowserTabTitle } from '@/composables/useBrowserTabTitle' import { useBrowserTabTitle } from '@/composables/useBrowserTabTitle'
import { useCoreCommands } from '@/composables/useCoreCommands' import { useCoreCommands } from '@/composables/useCoreCommands'
import { useErrorHandling } from '@/composables/useErrorHandling' import { useErrorHandling } from '@/composables/useErrorHandling'
import { useFrontendVersionMismatchWarning } from '@/composables/useFrontendVersionMismatchWarning'
import { useProgressFavicon } from '@/composables/useProgressFavicon' import { useProgressFavicon } from '@/composables/useProgressFavicon'
import { SERVER_CONFIG_ITEMS } from '@/constants/serverConfig' import { SERVER_CONFIG_ITEMS } from '@/constants/serverConfig'
import { i18n } from '@/i18n' import { i18n } from '@/i18n'
import { useSettingStore } from '@/platform/settings/settingStore' import { useSettingStore } from '@/platform/settings/settingStore'
import { useFrontendVersionMismatchWarning } from '@/platform/updates/common/useFrontendVersionMismatchWarning'
import { useVersionCompatibilityStore } from '@/platform/updates/common/versionCompatibilityStore'
import { StatusWsMessageStatus } from '@/schemas/apiSchema' import { StatusWsMessageStatus } from '@/schemas/apiSchema'
import { api } from '@/scripts/api' import { api } from '@/scripts/api'
import { app } from '@/scripts/app' import { app } from '@/scripts/app'
@@ -62,7 +63,6 @@ import {
useQueueStore useQueueStore
} from '@/stores/queueStore' } from '@/stores/queueStore'
import { useServerConfigStore } from '@/stores/serverConfigStore' import { useServerConfigStore } from '@/stores/serverConfigStore'
import { useVersionCompatibilityStore } from '@/stores/versionCompatibilityStore'
import { useBottomPanelStore } from '@/stores/workspace/bottomPanelStore' import { useBottomPanelStore } from '@/stores/workspace/bottomPanelStore'
import { useColorPaletteStore } from '@/stores/workspace/colorPaletteStore' import { useColorPaletteStore } from '@/stores/workspace/colorPaletteStore'
import { useSidebarTabStore } from '@/stores/workspace/sidebarTabStore' import { useSidebarTabStore } from '@/stores/workspace/sidebarTabStore'

View File

@@ -28,7 +28,7 @@ vi.mock('@/scripts/api', () => ({
api: mockApi api: mockApi
})) }))
vi.mock('@/stores/toastStore', () => ({ vi.mock('@/platform/updates/common/toastStore', () => ({
useToastStore: vi.fn(() => mockToastStore) useToastStore: vi.fn(() => mockToastStore)
})) }))

View File

@@ -2,7 +2,7 @@ import { mount } from '@vue/test-utils'
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
import { nextTick } from 'vue' import { nextTick } from 'vue'
import WhatsNewPopup from '@/components/helpcenter/WhatsNewPopup.vue' import WhatsNewPopup from '@/platform/updates/components/WhatsNewPopup.vue'
import type { components } from '@/types/comfyRegistryTypes' import type { components } from '@/types/comfyRegistryTypes'
type ReleaseNote = components['schemas']['ReleaseNote'] type ReleaseNote = components['schemas']['ReleaseNote']
@@ -19,7 +19,7 @@ vi.mock('marked', () => ({
marked: vi.fn((content) => `<p>${content}</p>`) marked: vi.fn((content) => `<p>${content}</p>`)
})) }))
vi.mock('@/stores/releaseStore', () => ({ vi.mock('@/platform/updates/common/releaseStore', () => ({
useReleaseStore: vi.fn() useReleaseStore: vi.fn()
})) }))
@@ -58,7 +58,9 @@ describe('WhatsNewPopup', () => {
mockReleaseStore.releases = [] mockReleaseStore.releases = []
// Mock release store // Mock release store
const { useReleaseStore } = await import('@/stores/releaseStore') const { useReleaseStore } = await import(
'@/platform/updates/common/releaseStore'
)
vi.mocked(useReleaseStore).mockReturnValue(mockReleaseStore as any) vi.mocked(useReleaseStore).mockReturnValue(mockReleaseStore as any)
}) })

View File

@@ -3,9 +3,9 @@ import { vi } from 'vitest'
import { afterEach, beforeEach, describe, expect, it } from 'vitest' import { afterEach, beforeEach, describe, expect, it } from 'vitest'
import { nextTick } from 'vue' import { nextTick } from 'vue'
import { useFrontendVersionMismatchWarning } from '@/composables/useFrontendVersionMismatchWarning' import { useToastStore } from '@/platform/updates/common/toastStore'
import { useToastStore } from '@/stores/toastStore' import { useFrontendVersionMismatchWarning } from '@/platform/updates/common/useFrontendVersionMismatchWarning'
import { useVersionCompatibilityStore } from '@/stores/versionCompatibilityStore' import { useVersionCompatibilityStore } from '@/platform/updates/common/versionCompatibilityStore'
// Mock globals // Mock globals
//@ts-expect-error Define global for the test //@ts-expect-error Define global for the test

View File

@@ -4,14 +4,14 @@ import { nextTick } from 'vue'
import { useLoad3dViewer } from '@/composables/useLoad3dViewer' import { useLoad3dViewer } from '@/composables/useLoad3dViewer'
import Load3d from '@/extensions/core/load3d/Load3d' import Load3d from '@/extensions/core/load3d/Load3d'
import Load3dUtils from '@/extensions/core/load3d/Load3dUtils' import Load3dUtils from '@/extensions/core/load3d/Load3dUtils'
import { useToastStore } from '@/platform/updates/common/toastStore'
import { useLoad3dService } from '@/services/load3dService' import { useLoad3dService } from '@/services/load3dService'
import { useToastStore } from '@/stores/toastStore'
vi.mock('@/services/load3dService', () => ({ vi.mock('@/services/load3dService', () => ({
useLoad3dService: vi.fn() useLoad3dService: vi.fn()
})) }))
vi.mock('@/stores/toastStore', () => ({ vi.mock('@/platform/updates/common/toastStore', () => ({
useToastStore: vi.fn() useToastStore: vi.fn()
})) }))

View File

@@ -1,7 +1,7 @@
import axios from 'axios' import axios from 'axios'
import { beforeEach, describe, expect, it, vi } from 'vitest' import { beforeEach, describe, expect, it, vi } from 'vitest'
import { useReleaseService } from '@/services/releaseService' import { useReleaseService } from '@/platform/updates/common/releaseService'
// Hoist the mock to avoid hoisting issues // Hoist the mock to avoid hoisting issues
const mockAxiosInstance = vi.hoisted(() => ({ const mockAxiosInstance = vi.hoisted(() => ({

View File

@@ -1,12 +1,12 @@
import { createPinia, setActivePinia } from 'pinia' import { createPinia, setActivePinia } from 'pinia'
import { beforeEach, describe, expect, it, vi } from 'vitest' import { beforeEach, describe, expect, it, vi } from 'vitest'
import { useReleaseStore } from '@/stores/releaseStore' import { useReleaseStore } from '@/platform/updates/common/releaseStore'
// Mock the dependencies // Mock the dependencies
vi.mock('@/utils/formatUtil') vi.mock('@/utils/formatUtil')
vi.mock('@/utils/envUtil') vi.mock('@/utils/envUtil')
vi.mock('@/services/releaseService') vi.mock('@/platform/updates/common/releaseService')
vi.mock('@/platform/settings/settingStore') vi.mock('@/platform/settings/settingStore')
vi.mock('@/stores/systemStatsStore') vi.mock('@/stores/systemStatsStore')
vi.mock('@vueuse/core', () => ({ vi.mock('@vueuse/core', () => ({
@@ -59,7 +59,9 @@ describe('useReleaseStore', () => {
} }
// Setup mock implementations // Setup mock implementations
const { useReleaseService } = await import('@/services/releaseService') const { useReleaseService } = await import(
'@/platform/updates/common/releaseService'
)
const { useSettingStore } = await import('@/platform/settings/settingStore') const { useSettingStore } = await import('@/platform/settings/settingStore')
const { useSystemStatsStore } = await import('@/stores/systemStatsStore') const { useSystemStatsStore } = await import('@/stores/systemStatsStore')
const { isElectron } = await import('@/utils/envUtil') const { isElectron } = await import('@/utils/envUtil')

View File

@@ -2,8 +2,8 @@ import { createPinia, setActivePinia } from 'pinia'
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
import { ref } from 'vue' import { ref } from 'vue'
import { useVersionCompatibilityStore } from '@/platform/updates/common/versionCompatibilityStore'
import { useSystemStatsStore } from '@/stores/systemStatsStore' import { useSystemStatsStore } from '@/stores/systemStatsStore'
import { useVersionCompatibilityStore } from '@/stores/versionCompatibilityStore'
vi.mock('@/config', () => ({ vi.mock('@/config', () => ({
default: { default: {