mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-02-04 23:20:07 +00:00
fix: restore ExtensionManager API contract
- Revert extensionManager type from WorkspaceStore to ExtensionManager - Remove WorkspaceStore export from workspaceStore.ts - Add WorkspaceStore type to browser_tests/types/globals.d.ts - Update browser tests to use specific 'as WorkspaceStore' casts - Consolidate Window augmentation into single globals.d.ts file Amp-Thread-ID: https://ampcode.com/threads/T-019c1854-3c3c-723d-8ce6-183ce06fcf1b Co-authored-by: Amp <amp@ampcode.com>
This commit is contained in:
@@ -34,6 +34,7 @@ import { SubgraphHelper } from './helpers/SubgraphHelper'
|
||||
import { ToastHelper } from './helpers/ToastHelper'
|
||||
import { WorkflowHelper } from './helpers/WorkflowHelper'
|
||||
import type { NodeReference } from './utils/litegraphUtils'
|
||||
import type { WorkspaceStore } from '../types/globals'
|
||||
|
||||
dotenv.config()
|
||||
|
||||
@@ -139,7 +140,9 @@ class ConfirmDialog {
|
||||
|
||||
// Wait for workflow service to finish if it's busy
|
||||
await this.page.waitForFunction(
|
||||
() => window.app?.extensionManager?.workflow?.isBusy === false,
|
||||
() =>
|
||||
(window.app?.extensionManager as WorkspaceStore | undefined)?.workflow
|
||||
?.isBusy === false,
|
||||
undefined,
|
||||
{ timeout: 3000 }
|
||||
)
|
||||
@@ -387,7 +390,7 @@ export class ComfyPage {
|
||||
|
||||
async setFocusMode(focusMode: boolean) {
|
||||
await this.page.evaluate((focusMode) => {
|
||||
window.app!.extensionManager.focusMode = focusMode
|
||||
;(window.app!.extensionManager as WorkspaceStore).focusMode = focusMode
|
||||
}, focusMode)
|
||||
await this.nextFrame()
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import type { Locator, Page } from '@playwright/test'
|
||||
|
||||
import type { WorkspaceStore } from '../../types/globals'
|
||||
import { TestIds } from '../selectors'
|
||||
|
||||
class SidebarTab {
|
||||
@@ -154,7 +155,9 @@ export class WorkflowsSidebarTab extends SidebarTab {
|
||||
|
||||
// Wait for workflow service to finish renaming
|
||||
await this.page.waitForFunction(
|
||||
() => !window.app?.extensionManager?.workflow?.isBusy,
|
||||
() =>
|
||||
!(window.app?.extensionManager as WorkspaceStore | undefined)?.workflow
|
||||
?.isBusy,
|
||||
undefined,
|
||||
{ timeout: 3000 }
|
||||
)
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
import type { Locator, Page } from '@playwright/test'
|
||||
|
||||
import type { WorkspaceStore } from '../../types/globals'
|
||||
|
||||
export class Topbar {
|
||||
private readonly menuLocator: Locator
|
||||
private readonly menuTrigger: Locator
|
||||
@@ -85,7 +87,7 @@ export class Topbar {
|
||||
|
||||
// Wait for workflow service to finish saving
|
||||
await this.page.waitForFunction(
|
||||
() => !window.app!.extensionManager.workflow.isBusy,
|
||||
() => !(window.app!.extensionManager as WorkspaceStore).workflow.isBusy,
|
||||
undefined,
|
||||
{ timeout: 3000 }
|
||||
)
|
||||
|
||||
@@ -1,10 +1,8 @@
|
||||
import { readFileSync } from 'fs'
|
||||
|
||||
import type { useWorkspaceStore } from '../../../src/stores/workspaceStore'
|
||||
import type { WorkspaceStore } from '../../types/globals'
|
||||
import type { ComfyPage } from '../ComfyPage'
|
||||
|
||||
type WorkspaceStore = ReturnType<typeof useWorkspaceStore>
|
||||
|
||||
export type FolderStructure = {
|
||||
[key: string]: FolderStructure | string
|
||||
}
|
||||
@@ -45,7 +43,9 @@ export class WorkflowHelper {
|
||||
}
|
||||
|
||||
await this.comfyPage.page.evaluate(async () => {
|
||||
await window.app!.extensionManager.workflow.syncWorkflows()
|
||||
await (
|
||||
window.app!.extensionManager as WorkspaceStore
|
||||
).workflow.syncWorkflows()
|
||||
})
|
||||
|
||||
// Wait for Vue to re-render the workflow list
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import type { Locator, Page } from '@playwright/test'
|
||||
|
||||
import type { AutoQueueMode } from '../../src/stores/queueStore'
|
||||
import type { WorkspaceStore } from '../types/globals'
|
||||
|
||||
export class ComfyActionbar {
|
||||
public readonly root: Locator
|
||||
@@ -42,13 +43,14 @@ class ComfyQueueButtonOptions {
|
||||
|
||||
public async setMode(mode: AutoQueueMode) {
|
||||
await this.page.evaluate((mode) => {
|
||||
window.app!.extensionManager.queueSettings.mode = mode
|
||||
;(window.app!.extensionManager as WorkspaceStore).queueSettings.mode =
|
||||
mode
|
||||
}, mode)
|
||||
}
|
||||
|
||||
public async getMode() {
|
||||
return await this.page.evaluate(() => {
|
||||
return window.app!.extensionManager.queueSettings.mode
|
||||
return (window.app!.extensionManager as WorkspaceStore).queueSettings.mode
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ import { expect, mergeTests } from '@playwright/test'
|
||||
import type { StatusWsMessage } from '../../src/schemas/apiSchema'
|
||||
import { comfyPageFixture } from '../fixtures/ComfyPage'
|
||||
import { webSocketFixture } from '../fixtures/ws'
|
||||
import type { WorkspaceStore } from '../types/globals'
|
||||
|
||||
const test = mergeTests(comfyPageFixture, webSocketFixture)
|
||||
|
||||
@@ -54,7 +55,9 @@ test.describe('Actionbar', { tag: '@ui' }, () => {
|
||||
)
|
||||
node!.widgets![0].value = value
|
||||
|
||||
window.app!.extensionManager.workflow.activeWorkflow?.changeTracker.checkState()
|
||||
;(
|
||||
window.app!.extensionManager as WorkspaceStore
|
||||
).workflow.activeWorkflow?.changeTracker.checkState()
|
||||
}, value)
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@ import { expect } from '@playwright/test'
|
||||
|
||||
import { comfyPageFixture as test } from '../fixtures/ComfyPage'
|
||||
import { DefaultGraphPositions } from '../fixtures/constants/defaultGraphPositions'
|
||||
import type { WorkspaceStore } from '../types/globals'
|
||||
|
||||
test.describe('Browser tab title', { tag: '@smoke' }, () => {
|
||||
test.describe('Beta Menu', () => {
|
||||
@@ -11,7 +12,8 @@ test.describe('Browser tab title', { tag: '@smoke' }, () => {
|
||||
|
||||
test('Can display workflow name', async ({ comfyPage }) => {
|
||||
const workflowName = await comfyPage.page.evaluate(async () => {
|
||||
return window.app!.extensionManager.workflow.activeWorkflow?.filename
|
||||
return (window.app!.extensionManager as WorkspaceStore).workflow
|
||||
.activeWorkflow?.filename
|
||||
})
|
||||
expect(await comfyPage.page.title()).toBe(`*${workflowName} - ComfyUI`)
|
||||
})
|
||||
@@ -22,7 +24,8 @@ test.describe('Browser tab title', { tag: '@smoke' }, () => {
|
||||
comfyPage
|
||||
}) => {
|
||||
const workflowName = await comfyPage.page.evaluate(async () => {
|
||||
return window.app!.extensionManager.workflow.activeWorkflow?.filename
|
||||
return (window.app!.extensionManager as WorkspaceStore).workflow
|
||||
.activeWorkflow?.filename
|
||||
})
|
||||
expect(await comfyPage.page.title()).toBe(`${workflowName} - ComfyUI`)
|
||||
|
||||
@@ -38,7 +41,9 @@ test.describe('Browser tab title', { tag: '@smoke' }, () => {
|
||||
|
||||
// Delete the saved workflow for cleanup.
|
||||
await comfyPage.page.evaluate(async () => {
|
||||
return window.app!.extensionManager.workflow.activeWorkflow?.delete()
|
||||
return (
|
||||
window.app!.extensionManager as WorkspaceStore
|
||||
).workflow.activeWorkflow?.delete()
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { expect } from '@playwright/test'
|
||||
|
||||
import { comfyPageFixture as test } from '../fixtures/ComfyPage'
|
||||
import type { WorkspaceStore } from '../types/globals'
|
||||
|
||||
test.beforeEach(async ({ comfyPage }) => {
|
||||
await comfyPage.settings.setSetting('Comfy.UseNewMenu', 'Disabled')
|
||||
@@ -178,7 +179,9 @@ test.describe('Color Palette', { tag: ['@screenshot', '@settings'] }, () => {
|
||||
|
||||
test('Can add custom color palette', async ({ comfyPage }) => {
|
||||
await comfyPage.page.evaluate((p) => {
|
||||
window.app!.extensionManager.colorPalette.addCustomColorPalette(p)
|
||||
;(
|
||||
window.app!.extensionManager as WorkspaceStore
|
||||
).colorPalette.addCustomColorPalette(p)
|
||||
}, customColorPalettes.obsidian_dark)
|
||||
expect(await comfyPage.toast.getToastErrorCount()).toBe(0)
|
||||
|
||||
|
||||
16
browser_tests/types.d.ts
vendored
16
browser_tests/types.d.ts
vendored
@@ -1,16 +0,0 @@
|
||||
/**
|
||||
* Type declarations for browser tests.
|
||||
* Augments global types with test-specific properties.
|
||||
*/
|
||||
|
||||
declare global {
|
||||
interface Window {
|
||||
/**
|
||||
* WebSocket store used by test fixtures for mocking WebSocket connections.
|
||||
* @see browser_tests/fixtures/ws.ts
|
||||
*/
|
||||
__ws__?: Record<string, WebSocket>
|
||||
}
|
||||
}
|
||||
|
||||
export {}
|
||||
22
browser_tests/types/globals.d.ts
vendored
22
browser_tests/types/globals.d.ts
vendored
@@ -1,6 +1,7 @@
|
||||
import type { ComfyApp } from '@/scripts/app'
|
||||
import type { LGraph } from '@/lib/litegraph/src/LGraph'
|
||||
import type { LiteGraphGlobal } from '@/lib/litegraph/src/LiteGraphGlobal'
|
||||
import type { ComfyApp } from '@/scripts/app'
|
||||
import type { useWorkspaceStore } from '@/stores/workspaceStore'
|
||||
|
||||
interface AppReadiness {
|
||||
featureFlagsReceived: boolean
|
||||
@@ -29,6 +30,12 @@ declare global {
|
||||
// Feature flags test globals
|
||||
__capturedMessages?: CapturedMessages
|
||||
__appReadiness?: AppReadiness
|
||||
|
||||
/**
|
||||
* WebSocket store used by test fixtures for mocking WebSocket connections.
|
||||
* @see browser_tests/fixtures/ws.ts
|
||||
*/
|
||||
__ws__?: Record<string, WebSocket>
|
||||
}
|
||||
|
||||
const app: ComfyApp | undefined
|
||||
@@ -37,4 +44,15 @@ declare global {
|
||||
const LGraphBadge: typeof LGraphBadge | undefined
|
||||
}
|
||||
|
||||
export {}
|
||||
/**
|
||||
* Internal store type for browser test access.
|
||||
* Used to access properties not exposed via the public ExtensionManager interface.
|
||||
*
|
||||
* @example
|
||||
* ```ts
|
||||
* await page.evaluate(() => {
|
||||
* ;(window.app!.extensionManager as WorkspaceStore).workflow.syncWorkflows()
|
||||
* })
|
||||
* ```
|
||||
*/
|
||||
export type WorkspaceStore = ReturnType<typeof useWorkspaceStore>
|
||||
|
||||
@@ -65,8 +65,9 @@ import { useModelStore } from '@/stores/modelStore'
|
||||
import { SYSTEM_NODE_DEFS, useNodeDefStore } from '@/stores/nodeDefStore'
|
||||
import { useSubgraphStore } from '@/stores/subgraphStore'
|
||||
import { useWidgetStore } from '@/stores/widgetStore'
|
||||
import { useWorkspaceStore, type WorkspaceStore } from '@/stores/workspaceStore'
|
||||
import { useWorkspaceStore } from '@/stores/workspaceStore'
|
||||
import type { ComfyExtension, MissingNodeType } from '@/types/comfy'
|
||||
import type { ExtensionManager } from '@/types/extensionTypes'
|
||||
import type { NodeExecutionId } from '@/types/nodeIdentification'
|
||||
import { graphToPrompt } from '@/utils/executionUtil'
|
||||
import { anyItemOverlapsRect } from '@/utils/mathUtil'
|
||||
@@ -154,7 +155,7 @@ export class ComfyApp {
|
||||
vueAppReady: boolean
|
||||
api: ComfyApi
|
||||
ui: ComfyUI
|
||||
extensionManager!: WorkspaceStore
|
||||
extensionManager!: ExtensionManager
|
||||
private _nodeOutputs!: Record<string, NodeExecutionOutput>
|
||||
nodePreviewImages: Record<string, string[]>
|
||||
|
||||
|
||||
@@ -111,5 +111,3 @@ const workspaceStoreSetup = () => {
|
||||
}
|
||||
|
||||
export const useWorkspaceStore = defineStore('workspace', workspaceStoreSetup)
|
||||
|
||||
export type WorkspaceStore = ReturnType<typeof useWorkspaceStore>
|
||||
|
||||
Reference in New Issue
Block a user