mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-04-20 14:30:41 +00:00
## Summary Complete the @e2e/ path alias migration started in #10735 by converting all 354 remaining relative imports and adding a lint rule to prevent backsliding. ## Changes - **What**: Migrate all relative imports in browser_tests/ to use `@e2e/` (intra-directory) and `@/` (src/ imports) path aliases. Add `no-restricted-imports` ESLint rule banning `./` and `../` imports in `browser_tests/**/*.ts`. Suppress pre-existing oxlint `no-eval` and `no-console` warnings exposed by touching those files. ## Review Focus - ESLint flat-config merging: the `@playwright/test` ban and relative-import ban are in two separate blocks to avoid last-match-wins collision with the `useI18n`/`useVirtualList` blocks higher in the config. - The `['./**', '../**']` glob patterns (not `['./*', '../*']`) are needed to catch multi-level relative paths like `../../../src/foo`. Follows up on #10735 ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-10958-test-migrate-browser_tests-to-e2e-path-alias-and-add-lint-rule-33c6d73d365081649d1be771eac986fd) by [Unito](https://www.unito.io) Co-authored-by: Amp <amp@ampcode.com>
112 lines
3.0 KiB
TypeScript
112 lines
3.0 KiB
TypeScript
import type { ComfyPage } from '@e2e/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
|
|
)
|
|
}
|