mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-04-22 23:39:45 +00:00
Backport of #10123, #9967, and #9972 to `core/1.41` Includes three cherry-picks in dependency order: 1. #9972 — `fix: resolve all lint warnings` (clean cherry-pick) 2. #9967 — `test: harden subgraph test coverage and remove low-value tests` (clean after #9972) 3. #10123 — `test: subgraph integration contracts and expanded Playwright coverage` (2 conflicts resolved) **Conflict resolutions:** - `src/core/graph/subgraph/promotionUtils.ts`: Added `refreshPromotedWidgetRendering()` calls from PR; omitted Sentry breadcrumbs (already removed on `core/1.41`); added `PromotedWidgetSource` type import and `hasUnpromotedWidgets` function. - `browser_tests/tests/subgraphPromotion.spec.ts`: Replaced local `exitSubgraphViaBreadcrumb`/`isInSubgraph` helpers with `comfyPage.subgraph.exitViaBreadcrumb()` from SubgraphHelper. ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-10326-backport-core-1-41-test-subgraph-integration-contracts-and-expanded-Playwright-covera-3296d73d3650819ea794f0fcb290a410) by [Unito](https://www.unito.io) --------- Co-authored-by: Amp <amp@ampcode.com> Co-authored-by: bymyself <cbyrne@comfy.org> Co-authored-by: GitHub Action <action@github.com>
112 lines
3.0 KiB
TypeScript
112 lines
3.0 KiB
TypeScript
import type { ComfyPage } from '../fixtures/ComfyPage'
|
|
|
|
export type PromotedWidgetEntry = [string, string]
|
|
|
|
export interface PromotedWidgetSnapshot {
|
|
proxyWidgets: PromotedWidgetEntry[]
|
|
widgetNames: string[]
|
|
}
|
|
|
|
export function isPromotedWidgetEntry(
|
|
entry: unknown
|
|
): entry is PromotedWidgetEntry {
|
|
return (
|
|
Array.isArray(entry) &&
|
|
entry.length === 2 &&
|
|
typeof entry[0] === 'string' &&
|
|
typeof entry[1] === 'string'
|
|
)
|
|
}
|
|
|
|
export function normalizePromotedWidgets(
|
|
value: unknown
|
|
): PromotedWidgetEntry[] {
|
|
if (!Array.isArray(value)) return []
|
|
return value.filter(isPromotedWidgetEntry)
|
|
}
|
|
|
|
export async function getPromotedWidgets(
|
|
comfyPage: ComfyPage,
|
|
nodeId: string
|
|
): Promise<PromotedWidgetEntry[]> {
|
|
const raw = await comfyPage.page.evaluate((id) => {
|
|
const node = window.app!.canvas.graph!.getNodeById(id)
|
|
return node?.properties?.proxyWidgets ?? []
|
|
}, nodeId)
|
|
|
|
return normalizePromotedWidgets(raw)
|
|
}
|
|
|
|
export async function getPromotedWidgetSnapshot(
|
|
comfyPage: ComfyPage,
|
|
nodeId: string
|
|
): Promise<PromotedWidgetSnapshot> {
|
|
const raw = await comfyPage.page.evaluate((id) => {
|
|
const node = window.app!.canvas.graph!.getNodeById(id)
|
|
return {
|
|
proxyWidgets: node?.properties?.proxyWidgets ?? [],
|
|
widgetNames: (node?.widgets ?? []).map((widget) => widget.name)
|
|
}
|
|
}, nodeId)
|
|
|
|
return {
|
|
proxyWidgets: normalizePromotedWidgets(raw.proxyWidgets),
|
|
widgetNames: Array.isArray(raw.widgetNames)
|
|
? raw.widgetNames.filter(
|
|
(name): name is string => typeof name === 'string'
|
|
)
|
|
: []
|
|
}
|
|
}
|
|
|
|
export async function getPromotedWidgetNames(
|
|
comfyPage: ComfyPage,
|
|
nodeId: string
|
|
): Promise<string[]> {
|
|
const promotedWidgets = await getPromotedWidgets(comfyPage, nodeId)
|
|
return promotedWidgets.map(([, widgetName]) => widgetName)
|
|
}
|
|
|
|
export async function getPromotedWidgetCount(
|
|
comfyPage: ComfyPage,
|
|
nodeId: string
|
|
): Promise<number> {
|
|
const promotedWidgets = await getPromotedWidgets(comfyPage, nodeId)
|
|
return promotedWidgets.length
|
|
}
|
|
|
|
export function isPseudoPreviewEntry(entry: PromotedWidgetEntry): boolean {
|
|
return entry[1].startsWith('$$')
|
|
}
|
|
|
|
export async function getPseudoPreviewWidgets(
|
|
comfyPage: ComfyPage,
|
|
nodeId: string
|
|
): Promise<PromotedWidgetEntry[]> {
|
|
const widgets = await getPromotedWidgets(comfyPage, nodeId)
|
|
return widgets.filter(isPseudoPreviewEntry)
|
|
}
|
|
|
|
export async function getNonPreviewPromotedWidgets(
|
|
comfyPage: ComfyPage,
|
|
nodeId: string
|
|
): Promise<PromotedWidgetEntry[]> {
|
|
const widgets = await getPromotedWidgets(comfyPage, nodeId)
|
|
return widgets.filter((entry) => !isPseudoPreviewEntry(entry))
|
|
}
|
|
|
|
export async function getPromotedWidgetCountByName(
|
|
comfyPage: ComfyPage,
|
|
nodeId: string,
|
|
widgetName: string
|
|
): Promise<number> {
|
|
return comfyPage.page.evaluate(
|
|
([id, name]) => {
|
|
const node = window.app!.canvas.graph!.getNodeById(id)
|
|
const widgets = node?.widgets ?? []
|
|
return widgets.filter((widget) => widget.name === name).length
|
|
},
|
|
[nodeId, widgetName] as const
|
|
)
|
|
}
|