mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-04-20 14:30:41 +00:00
Backport of #10123, #9967, and #9972 to `core/1.42` Includes three cherry-picks in dependency order: 1. #9972 — `fix: resolve all lint warnings` (clean) 2. #9967 — `test: harden subgraph test coverage and remove low-value tests` (clean) 3. #10123 — `test: subgraph integration contracts and expanded Playwright coverage` (1 conflict, auto-resolved by rerere from #10326) See #10326 for core/1.41 backport with detailed conflict resolution notes. --------- 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
|
|
)
|
|
}
|