Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
"knip": "knip --cache",
"knip:no-cache": "knip",
"locale": "lobe-i18n locale",
"collect-i18n": "npx playwright test --config=playwright.i18n.config.ts",
"collect-i18n": "playwright test --config=playwright.i18n.config.ts",
"json-schema": "tsx scripts/generate-json-schema.ts",
"storybook": "nx storybook -p 6006",
"build-storybook": "storybook build"
Expand Down
11 changes: 7 additions & 4 deletions playwright.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,21 +31,23 @@ export default defineConfig({
name: 'chromium',
use: { ...devices['Desktop Chrome'] },
timeout: 15000,
grepInvert: /@mobile/ // Run all tests except those tagged with @mobile
grepInvert: /@mobile|collect-i18n/ // Run all tests except mobile and i18n collection tests
},

{
name: 'chromium-2x',
use: { ...devices['Desktop Chrome'], deviceScaleFactor: 2 },
timeout: 15000,
grep: /@2x/ // Run all tests tagged with @2x
grep: /@2x/, // Run all tests tagged with @2x
grepInvert: /collect-i18n/ // Exclude i18n collection tests
},

{
name: 'chromium-0.5x',
use: { ...devices['Desktop Chrome'], deviceScaleFactor: 0.5 },
timeout: 15000,
grep: /@0.5x/ // Run all tests tagged with @0.5x
grep: /@0.5x/, // Run all tests tagged with @0.5x
grepInvert: /collect-i18n/ // Exclude i18n collection tests
},

// {
Expand All @@ -62,7 +64,8 @@ export default defineConfig({
{
name: 'mobile-chrome',
use: { ...devices['Pixel 5'], hasTouch: true },
grep: /@mobile/ // Run only tests tagged with @mobile
grep: /@mobile/, // Run only tests tagged with @mobile
grepInvert: /collect-i18n/ // Exclude i18n collection tests
}
// {
// name: 'Mobile Safari',
Expand Down
3 changes: 2 additions & 1 deletion playwright.i18n.config.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import { defineConfig } from '@playwright/test'

export default defineConfig({
testDir: './scripts',
testDir: './scripts/i18n',
use: {
baseURL: 'http://localhost:5173',
headless: true
},
reporter: 'list',
timeout: 60000,
testMatch: /collect-i18n-.*\.ts/
// Don't use globalSetup/globalTeardown to avoid ComfyUI path dependencies
})
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import * as fs from 'fs'

import { comfyPageFixture as test } from '../browser_tests/fixtures/ComfyPage'
import { CORE_MENU_COMMANDS } from '../src/constants/coreMenuCommands'
import { SERVER_CONFIG_ITEMS } from '../src/constants/serverConfig'
import type { ComfyCommandImpl } from '../src/stores/commandStore'
import type { FormItem, SettingParams } from '../src/types/settingTypes'
import { formatCamelCase, normalizeI18nKey } from '../src/utils/formatUtil'
import { comfyPageFixture as test } from '../../browser_tests/fixtures/ComfyPage'
import { CORE_MENU_COMMANDS } from '../../src/constants/coreMenuCommands'
import { SERVER_CONFIG_ITEMS } from '../../src/constants/serverConfig'
import type { ComfyCommandImpl } from '../../src/stores/commandStore'
import type { FormItem, SettingParams } from '../../src/types/settingTypes'
import { formatCamelCase, normalizeI18nKey } from '../../src/utils/formatUtil'

const localePath = './src/locales/en/main.json'
const commandsPath = './src/locales/en/commands.json'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,33 +1,39 @@
import * as fs from 'fs'

import { comfyPageFixture as test } from '../browser_tests/fixtures/ComfyPage'
import type { ComfyNodeDef } from '../src/schemas/nodeDefSchema'
import type { ComfyApi } from '../src/scripts/api'
import { ComfyNodeDefImpl } from '../src/stores/nodeDefStore'
import { normalizeI18nKey } from '../src/utils/formatUtil'
import { comfyPageFixture as test } from '../../browser_tests/fixtures/ComfyPage'
import { normalizeI18nKey } from '../../src/utils/formatUtil'

const localePath = './src/locales/en/main.json'
const nodeDefsPath = './src/locales/en/nodeDefs.json'

test('collect-i18n-node-defs', async ({ comfyPage }) => {
// Mock view route
comfyPage.page.route('**/view**', async (route) => {
await comfyPage.page.route('**/view**', async (route) => {
await route.fulfill({
body: JSON.stringify({})
})
})

const nodeDefs: ComfyNodeDefImpl[] = (
Object.values(
await comfyPage.page.evaluate(async () => {
const api = window['app'].api as ComfyApi
return await api.getNodeDefs()
const nodeDefs = await comfyPage.page.evaluate(async () => {
const api = window['app'].api
const defs = await api.getNodeDefs()
// Process node definitions in the browser context where ComfyNodeDefImpl is available
return Object.values(defs)
.filter((def: any) => !def.name.startsWith('DevTools'))
.map((def: any) => {
// Create ComfyNodeDefImpl in browser context
const impl = new (window as any).ComfyNodeDefImpl(def)
// Return a plain object with the needed properties
return {
name: impl.name,
display_name: impl.display_name,
description: impl.description,
category: impl.category,
inputs: impl.inputs,
outputs: impl.outputs
}
})
) as ComfyNodeDef[]
)
// Ignore DevTools nodes (used for internal testing)
.filter((def) => !def.name.startsWith('DevTools'))
.map((def) => new ComfyNodeDefImpl(def))
})

console.log(`Collected ${nodeDefs.length} node definitions`)

Expand Down Expand Up @@ -100,7 +106,7 @@ test('collect-i18n-node-defs', async ({ comfyPage }) => {

const nodeDefLabels = await extractWidgetLabels()

function extractInputs(nodeDef: ComfyNodeDefImpl) {
function extractInputs(nodeDef: any) {
const inputs = Object.fromEntries(
Object.values(nodeDef.inputs).flatMap((input) => {
const name = input.name
Expand All @@ -124,7 +130,7 @@ test('collect-i18n-node-defs', async ({ comfyPage }) => {
return Object.keys(inputs).length > 0 ? inputs : undefined
}

function extractOutputs(nodeDef: ComfyNodeDefImpl) {
function extractOutputs(nodeDef: any) {
const outputs = Object.fromEntries(
nodeDef.outputs.flatMap((output, i) => {
// Ignore data types if they are already translated in allDataTypesLocale.
Expand Down