From 535f857330c87b8b05d04658ff47f68633308f04 Mon Sep 17 00:00:00 2001 From: Christian Byrne Date: Thu, 6 Nov 2025 18:32:41 -0800 Subject: [PATCH] refactor: move renderer-dependent utils into workbench scope (#6621) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR cleans up the base-layer utilities so they no longer pull renderer or workbench code. The renderer-only `isPrimitiveNode` guard now lives in `src/renderer/utils/nodeTypeGuards.ts`, and the node help/model/ordering helpers have moved into `src/workbench/utils`. All affected services, stores, scripts, and tests were updated to import from the new locations. The idea is to reduce the number of Base→Renderer/Base→Workbench edges (higher scoped base/common utils should not import from renderer/workbench layers). ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-6621-refactor-move-renderer-dependent-utils-into-workbench-scope-2a36d73d36508167aff0fc8a22202d7f) by [Unito](https://www.unito.io) --- src/extensions/core/widgetInputs.ts | 2 +- src/renderer/utils/nodeTypeGuards.ts | 6 ++++++ src/scripts/app.ts | 2 +- src/services/litegraphService.ts | 2 +- src/services/nodeHelpService.ts | 2 +- src/stores/workspace/nodeHelpStore.ts | 2 +- src/utils/typeGuardUtil.ts | 7 ------- src/{ => workbench}/utils/modelMetadataUtil.ts | 0 src/{ => workbench}/utils/nodeDefOrderingUtil.ts | 0 src/{ => workbench}/utils/nodeHelpUtil.ts | 0 .../tests/litegraph/core/LGraphNode.widgetOrder.test.ts | 2 +- tests-ui/tests/utils/nodeDefOrderingUtil.test.ts | 2 +- tests-ui/utils/modelMetadataUtil.test.ts | 2 +- 13 files changed, 14 insertions(+), 15 deletions(-) create mode 100644 src/renderer/utils/nodeTypeGuards.ts rename src/{ => workbench}/utils/modelMetadataUtil.ts (100%) rename src/{ => workbench}/utils/nodeDefOrderingUtil.ts (100%) rename src/{ => workbench}/utils/nodeHelpUtil.ts (100%) diff --git a/src/extensions/core/widgetInputs.ts b/src/extensions/core/widgetInputs.ts index 90fafea95..85054aba5 100644 --- a/src/extensions/core/widgetInputs.ts +++ b/src/extensions/core/widgetInputs.ts @@ -18,7 +18,7 @@ import { ComfyWidgets, addValueControlWidgets } from '@/scripts/widgets' import { CONFIG, GET_CONFIG } from '@/services/litegraphService' import { mergeInputSpec } from '@/utils/nodeDefUtil' import { applyTextReplacements } from '@/utils/searchAndReplace' -import { isPrimitiveNode } from '@/utils/typeGuardUtil' +import { isPrimitiveNode } from '@/renderer/utils/nodeTypeGuards' const replacePropertyName = 'Run widget replace on values' export class PrimitiveNode extends LGraphNode { diff --git a/src/renderer/utils/nodeTypeGuards.ts b/src/renderer/utils/nodeTypeGuards.ts new file mode 100644 index 000000000..9a13edfb5 --- /dev/null +++ b/src/renderer/utils/nodeTypeGuards.ts @@ -0,0 +1,6 @@ +import type { PrimitiveNode } from '@/extensions/core/widgetInputs' +import type { LGraphNode } from '@/lib/litegraph/src/litegraph' + +export const isPrimitiveNode = ( + node: LGraphNode +): node is PrimitiveNode & LGraphNode => node.type === 'PrimitiveNode' diff --git a/src/scripts/app.ts b/src/scripts/app.ts index a0479b5b2..d26698c62 100644 --- a/src/scripts/app.ts +++ b/src/scripts/app.ts @@ -78,7 +78,7 @@ import { findLegacyRerouteNodes, noNativeReroutes } from '@/utils/migration/migrateReroute' -import { getSelectedModelsMetadata } from '@/utils/modelMetadataUtil' +import { getSelectedModelsMetadata } from '@/workbench/utils/modelMetadataUtil' import { deserialiseAndCreate } from '@/utils/vintageClipboard' import { type ComfyApi, PromptExecutionError, api } from './api' diff --git a/src/services/litegraphService.ts b/src/services/litegraphService.ts index 3fe45fcea..35562533b 100644 --- a/src/services/litegraphService.ts +++ b/src/services/litegraphService.ts @@ -55,7 +55,7 @@ import { isVideoNode, migrateWidgetsValues } from '@/utils/litegraphUtil' -import { getOrderedInputSpecs } from '@/utils/nodeDefOrderingUtil' +import { getOrderedInputSpecs } from '@/workbench/utils/nodeDefOrderingUtil' import { useExtensionService } from './extensionService' diff --git a/src/services/nodeHelpService.ts b/src/services/nodeHelpService.ts index 53a0e81ab..88bb48d29 100644 --- a/src/services/nodeHelpService.ts +++ b/src/services/nodeHelpService.ts @@ -1,7 +1,7 @@ import { api } from '@/scripts/api' import type { ComfyNodeDefImpl } from '@/stores/nodeDefStore' import { NodeSourceType, getNodeSource } from '@/types/nodeSource' -import { extractCustomNodeName } from '@/utils/nodeHelpUtil' +import { extractCustomNodeName } from '@/workbench/utils/nodeHelpUtil' class NodeHelpService { async fetchNodeHelp(node: ComfyNodeDefImpl, locale: string): Promise { diff --git a/src/stores/workspace/nodeHelpStore.ts b/src/stores/workspace/nodeHelpStore.ts index 003c8fa48..a04d6d829 100644 --- a/src/stores/workspace/nodeHelpStore.ts +++ b/src/stores/workspace/nodeHelpStore.ts @@ -5,7 +5,7 @@ import { i18n } from '@/i18n' import { nodeHelpService } from '@/services/nodeHelpService' import type { ComfyNodeDefImpl } from '@/stores/nodeDefStore' import { renderMarkdownToHtml } from '@/utils/markdownRendererUtil' -import { getNodeHelpBaseUrl } from '@/utils/nodeHelpUtil' +import { getNodeHelpBaseUrl } from '@/workbench/utils/nodeHelpUtil' export const useNodeHelpStore = defineStore('nodeHelp', () => { const currentHelpNode = ref(null) diff --git a/src/utils/typeGuardUtil.ts b/src/utils/typeGuardUtil.ts index 3cefc0d38..d9e2aeb0b 100644 --- a/src/utils/typeGuardUtil.ts +++ b/src/utils/typeGuardUtil.ts @@ -1,4 +1,3 @@ -import type { PrimitiveNode } from '@/extensions/core/widgetInputs' import type { INodeSlot, LGraph, @@ -6,12 +5,6 @@ import type { Subgraph } from '@/lib/litegraph/src/litegraph' -export function isPrimitiveNode( - node: LGraphNode -): node is PrimitiveNode & LGraphNode { - return node.type === 'PrimitiveNode' -} - /** * Check if an error is an AbortError triggered by `AbortController#abort` * when cancelling a request. diff --git a/src/utils/modelMetadataUtil.ts b/src/workbench/utils/modelMetadataUtil.ts similarity index 100% rename from src/utils/modelMetadataUtil.ts rename to src/workbench/utils/modelMetadataUtil.ts diff --git a/src/utils/nodeDefOrderingUtil.ts b/src/workbench/utils/nodeDefOrderingUtil.ts similarity index 100% rename from src/utils/nodeDefOrderingUtil.ts rename to src/workbench/utils/nodeDefOrderingUtil.ts diff --git a/src/utils/nodeHelpUtil.ts b/src/workbench/utils/nodeHelpUtil.ts similarity index 100% rename from src/utils/nodeHelpUtil.ts rename to src/workbench/utils/nodeHelpUtil.ts diff --git a/tests-ui/tests/litegraph/core/LGraphNode.widgetOrder.test.ts b/tests-ui/tests/litegraph/core/LGraphNode.widgetOrder.test.ts index 264a795a9..21f7a7cd8 100644 --- a/tests-ui/tests/litegraph/core/LGraphNode.widgetOrder.test.ts +++ b/tests-ui/tests/litegraph/core/LGraphNode.widgetOrder.test.ts @@ -2,7 +2,7 @@ import { beforeEach, describe, expect, it } from 'vitest' import { LGraphNode } from '@/lib/litegraph/src/litegraph' import type { ISerialisedNode } from '@/lib/litegraph/src/types/serialisation' -import { sortWidgetValuesByInputOrder } from '@/utils/nodeDefOrderingUtil' +import { sortWidgetValuesByInputOrder } from '@/workbench/utils/nodeDefOrderingUtil' describe('LGraphNode widget ordering', () => { let node: LGraphNode diff --git a/tests-ui/tests/utils/nodeDefOrderingUtil.test.ts b/tests-ui/tests/utils/nodeDefOrderingUtil.test.ts index 142f89637..2572897c9 100644 --- a/tests-ui/tests/utils/nodeDefOrderingUtil.test.ts +++ b/tests-ui/tests/utils/nodeDefOrderingUtil.test.ts @@ -5,7 +5,7 @@ import { ComfyNodeDefImpl } from '@/stores/nodeDefStore' import { getOrderedInputSpecs, sortWidgetValuesByInputOrder -} from '@/utils/nodeDefOrderingUtil' +} from '@/workbench/utils/nodeDefOrderingUtil' describe('nodeDefOrderingUtil', () => { describe('getOrderedInputSpecs', () => { diff --git a/tests-ui/utils/modelMetadataUtil.test.ts b/tests-ui/utils/modelMetadataUtil.test.ts index eb72c4d8e..d17bd9a9e 100644 --- a/tests-ui/utils/modelMetadataUtil.test.ts +++ b/tests-ui/utils/modelMetadataUtil.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest' -import { getSelectedModelsMetadata } from '@/utils/modelMetadataUtil' +import { getSelectedModelsMetadata } from '@/workbench/utils/modelMetadataUtil' describe('modelMetadataUtil', () => { describe('filterModelsByCurrentSelection', () => {