diff --git a/src/schemas/nodeDef/migration.test.ts b/src/schemas/nodeDef/migration.test.ts index 7250918f1..b087ae946 100644 --- a/src/schemas/nodeDef/migration.test.ts +++ b/src/schemas/nodeDef/migration.test.ts @@ -221,9 +221,9 @@ describe('NodeDef Migration', () => { } const result = transformNodeDefV1ToV2(nodeDef) + const inputWithHidden = plainObject as { hidden?: Record } - // @ts-expect-error fixme ts strict error - expect(result.hidden).toEqual(plainObject.hidden) + expect(result.hidden).toEqual(inputWithHidden.hidden) expect(result.hidden?.someHiddenValue).toBe(42) expect(result.hidden?.anotherHiddenValue).toEqual({ nested: 'object' }) }) diff --git a/src/schemas/nodeDefSchema.validation.test.ts b/src/schemas/nodeDefSchema.validation.test.ts index 707eabd3e..b313650ff 100644 --- a/src/schemas/nodeDefSchema.validation.test.ts +++ b/src/schemas/nodeDefSchema.validation.test.ts @@ -37,15 +37,13 @@ describe('validateNodeDef', () => { 'validateComfyNodeDef with various input spec formats', (inputSpec, expected) => { it(`should accept input spec format: ${JSON.stringify(inputSpec)}`, async () => { - expect( - // @ts-expect-error fixme ts strict error - validateComfyNodeDef({ - ...EXAMPLE_NODE_DEF, - input: { - required: inputSpec - } - }).input.required.ckpt_name - ).toEqual(expected) + const result = validateComfyNodeDef({ + ...EXAMPLE_NODE_DEF, + input: { + required: inputSpec + } + }) + expect(result?.input?.required?.ckpt_name).toEqual(expected) }) } ) diff --git a/src/stores/imagePreviewStore.test.ts b/src/stores/imagePreviewStore.test.ts index d2bb8d639..b12454746 100644 --- a/src/stores/imagePreviewStore.test.ts +++ b/src/stores/imagePreviewStore.test.ts @@ -37,8 +37,7 @@ describe('imagePreviewStore getPreviewParam', () => { it('should return empty string if node.animatedImages is true', () => { const store = useNodeOutputStore() - // @ts-expect-error `animatedImages` property is not typed - const node = createMockNode({ animatedImages: true }) + const node = Object.assign(createMockNode(), { animatedImages: true }) const outputs = createMockOutputs([{ filename: 'img.png' }]) expect(store.getPreviewParam(node, outputs)).toBe('') expect(vi.mocked(app).getPreviewFormatParam).not.toHaveBeenCalled() diff --git a/src/stores/workspace/searchBoxStore.ts b/src/stores/workspace/searchBoxStore.ts index f5acff936..73ee3238f 100644 --- a/src/stores/workspace/searchBoxStore.ts +++ b/src/stores/workspace/searchBoxStore.ts @@ -31,14 +31,11 @@ export const useSearchBoxStore = defineStore('searchBox', () => { return } if (!popoverRef.value) return - popoverRef.value.showSearchBox( - new MouseEvent('click', { - clientX: x.value, - clientY: y.value, - // @ts-expect-error layerY is a nonstandard property - layerY: y.value - }) as unknown as CanvasPointerEvent + const event = Object.assign( + new MouseEvent('click', { clientX: x.value, clientY: y.value }), + { layerY: y.value } ) + popoverRef.value.showSearchBox(event as unknown as CanvasPointerEvent) } return { diff --git a/src/workbench/extensions/manager/components/manager/infoPanel/InfoTabs.vue b/src/workbench/extensions/manager/components/manager/infoPanel/InfoTabs.vue index 29ae4f986..08df30a84 100644 --- a/src/workbench/extensions/manager/components/manager/infoPanel/InfoTabs.vue +++ b/src/workbench/extensions/manager/components/manager/infoPanel/InfoTabs.vue @@ -67,9 +67,10 @@ const importFailedContext = inject(ImportFailedKey) const importFailed = importFailedContext?.importFailed const nodeNames = computed(() => { - // @ts-expect-error comfy_nodes is an Algolia-specific field - const { comfy_nodes } = nodePack - return comfy_nodes ?? [] + const packWithAlgolia = nodePack as typeof nodePack & { + comfy_nodes?: string[] + } + return packWithAlgolia.comfy_nodes ?? [] }) const activeTab = ref('description') diff --git a/src/workbench/extensions/manager/composables/nodePack/useMissingNodes.test.ts b/src/workbench/extensions/manager/composables/nodePack/useMissingNodes.test.ts index a467bf098..c9ac717bc 100644 --- a/src/workbench/extensions/manager/composables/nodePack/useMissingNodes.test.ts +++ b/src/workbench/extensions/manager/composables/nodePack/useMissingNodes.test.ts @@ -2,12 +2,31 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' import { nextTick, ref } from 'vue' import type { LGraphNode, LGraph } from '@/lib/litegraph/src/litegraph' +import type { ComfyNodeDefImpl } from '@/stores/nodeDefStore' import { useNodeDefStore } from '@/stores/nodeDefStore' import { collectAllNodes } from '@/utils/graphTraversalUtil' import { useMissingNodes } from '@/workbench/extensions/manager/composables/nodePack/useMissingNodes' import { useWorkflowPacks } from '@/workbench/extensions/manager/composables/nodePack/useWorkflowPacks' import { useComfyManagerStore } from '@/workbench/extensions/manager/stores/comfyManagerStore' +type PartialNodeDefStore = Pick< + ReturnType, + 'nodeDefsByName' +> +type PartialManagerStore = Pick< + ReturnType, + 'isPackInstalled' +> + +function createMockNodeDefStore( + names: string[] +): ReturnType { + const nodeDefsByName = Object.fromEntries( + names.map((name) => [name, { name } as ComfyNodeDefImpl]) + ) + return { nodeDefsByName } as ReturnType +} + vi.mock('@vueuse/core', async () => { const actual = await vi.importActual('@vueuse/core') return { @@ -81,11 +100,12 @@ describe('useMissingNodes', () => { // Default setup: pack-3 is installed, others are not mockIsPackInstalled.mockImplementation((id: string) => id === 'pack-3') - // @ts-expect-error - Mocking partial ComfyManagerStore for testing. - // We only need isPackInstalled method for these tests. - mockUseComfyManagerStore.mockReturnValue({ + const partialManagerStore: PartialManagerStore = { isPackInstalled: mockIsPackInstalled - }) + } + mockUseComfyManagerStore.mockReturnValue( + partialManagerStore as ReturnType + ) mockUseWorkflowPacks.mockReturnValue({ workflowPacks: ref([]), @@ -97,11 +117,12 @@ describe('useMissingNodes', () => { }) // Reset node def store mock - // @ts-expect-error - Mocking partial NodeDefStore for testing. - // We only need nodeDefsByName for these tests. - mockUseNodeDefStore.mockReturnValue({ + const partialNodeDefStore: PartialNodeDefStore = { nodeDefsByName: {} - }) + } + mockUseNodeDefStore.mockReturnValue( + partialNodeDefStore as ReturnType + ) // Reset app.rootGraph.nodes mockApp.rootGraph = { nodes: [] } @@ -265,8 +286,7 @@ describe('useMissingNodes', () => { expect(missingNodePacks.value).toEqual([]) // Update workflow packs - // @ts-expect-error - mockWorkflowPacks is a simplified version without full WorkflowPack interface. - workflowPacksRef.value = mockWorkflowPacks + Object.assign(workflowPacksRef, { value: mockWorkflowPacks }) await nextTick() // Should update missing packs (2 missing since pack-3 is installed) @@ -323,13 +343,9 @@ describe('useMissingNodes', () => { // Mock collectAllNodes to return only the filtered nodes (missing core nodes) mockCollectAllNodes.mockReturnValue([coreNode1, coreNode2]) - mockUseNodeDefStore.mockReturnValue({ - nodeDefsByName: { - // @ts-expect-error - Creating minimal mock of ComfyNodeDefImpl for testing. - // Only including required properties for our test assertions. - RegisteredNode: { name: 'RegisteredNode' } - } - }) + mockUseNodeDefStore.mockReturnValue( + createMockNodeDefStore(['RegisteredNode']) + ) const { missingCoreNodes } = useMissingNodes() @@ -347,10 +363,7 @@ describe('useMissingNodes', () => { // Mock collectAllNodes to return these nodes mockCollectAllNodes.mockReturnValue([node120, node130, nodeNoVer]) - // @ts-expect-error - Mocking partial NodeDefStore for testing. - mockUseNodeDefStore.mockReturnValue({ - nodeDefsByName: {} - }) + mockUseNodeDefStore.mockReturnValue(createMockNodeDefStore([])) const { missingCoreNodes } = useMissingNodes() @@ -366,10 +379,7 @@ describe('useMissingNodes', () => { // Mock collectAllNodes to return only the filtered nodes (core nodes only) mockCollectAllNodes.mockReturnValue([coreNode]) - // @ts-expect-error - Mocking partial NodeDefStore for testing. - mockUseNodeDefStore.mockReturnValue({ - nodeDefsByName: {} - }) + mockUseNodeDefStore.mockReturnValue(createMockNodeDefStore([])) const { missingCoreNodes } = useMissingNodes() @@ -382,15 +392,9 @@ describe('useMissingNodes', () => { // Mock collectAllNodes to return empty array (no missing nodes after filtering) mockCollectAllNodes.mockReturnValue([]) - mockUseNodeDefStore.mockReturnValue({ - nodeDefsByName: { - // @ts-expect-error - Creating minimal mock of ComfyNodeDefImpl for testing. - // Only including required properties for our test assertions. - RegisteredNode1: { name: 'RegisteredNode1' }, - // @ts-expect-error - Creating minimal mock of ComfyNodeDefImpl for testing. - RegisteredNode2: { name: 'RegisteredNode2' } - } - }) + mockUseNodeDefStore.mockReturnValue( + createMockNodeDefStore(['RegisteredNode1', 'RegisteredNode2']) + ) const { missingCoreNodes } = useMissingNodes() @@ -404,8 +408,6 @@ describe('useMissingNodes', () => { packId?: string, version?: string ): LGraphNode => - // @ts-expect-error - Creating a partial mock of LGraphNode for testing. - // We only need specific properties for our tests, not the full LGraphNode interface. ({ type, properties: { cnr_id: packId, ver: version }, @@ -418,7 +420,7 @@ describe('useMissingNodes', () => { mode: 0, inputs: [], outputs: [] - }) + }) as unknown as LGraphNode it('detects missing core nodes from subgraphs via collectAllNodes', () => { const mainNode = createMockNode('MainNode', 'comfy-core', '1.0.0') @@ -441,10 +443,7 @@ describe('useMissingNodes', () => { ]) // Mock none of the nodes as registered - // @ts-expect-error - Mocking partial NodeDefStore for testing. - mockUseNodeDefStore.mockReturnValue({ - nodeDefsByName: {} - }) + mockUseNodeDefStore.mockReturnValue(createMockNodeDefStore([])) const { missingCoreNodes } = useMissingNodes() @@ -480,12 +479,9 @@ describe('useMissingNodes', () => { const mockGraph = { nodes: [], subgraphs: new Map() } mockApp.rootGraph = mockGraph - mockUseNodeDefStore.mockReturnValue({ - nodeDefsByName: { - // @ts-expect-error - Creating minimal mock of ComfyNodeDefImpl for testing. - RegisteredCore: { name: 'RegisteredCore' } - } - }) + mockUseNodeDefStore.mockReturnValue( + createMockNodeDefStore(['RegisteredCore']) + ) let capturedFilterFunction: ((node: LGraphNode) => boolean) | undefined @@ -574,12 +570,9 @@ describe('useMissingNodes', () => { mockApp.rootGraph = mockMainGraph - mockUseNodeDefStore.mockReturnValue({ - nodeDefsByName: { - // @ts-expect-error - Creating minimal mock of ComfyNodeDefImpl for testing. - SubgraphRegistered: { name: 'SubgraphRegistered' } - } - }) + mockUseNodeDefStore.mockReturnValue( + createMockNodeDefStore(['SubgraphRegistered']) + ) const { missingCoreNodes } = useMissingNodes()