diff --git a/package.json b/package.json index 73eea1c80d..e0e08cb208 100644 --- a/package.json +++ b/package.json @@ -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" diff --git a/playwright.config.ts b/playwright.config.ts index b52daad7fe..2e88b96d18 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -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 }, // { @@ -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', diff --git a/playwright.i18n.config.ts b/playwright.i18n.config.ts index 70c3a0c81c..f45629b068 100644 --- a/playwright.i18n.config.ts +++ b/playwright.i18n.config.ts @@ -1,7 +1,7 @@ import { defineConfig } from '@playwright/test' export default defineConfig({ - testDir: './scripts', + testDir: './scripts/i18n', use: { baseURL: 'http://localhost:5173', headless: true @@ -9,4 +9,5 @@ export default defineConfig({ reporter: 'list', timeout: 60000, testMatch: /collect-i18n-.*\.ts/ + // Don't use globalSetup/globalTeardown to avoid ComfyUI path dependencies }) diff --git a/scripts/collect-i18n-general.ts b/scripts/i18n/collect-i18n-general.ts similarity index 91% rename from scripts/collect-i18n-general.ts rename to scripts/i18n/collect-i18n-general.ts index 63d97d5307..b235e8158a 100644 --- a/scripts/collect-i18n-general.ts +++ b/scripts/i18n/collect-i18n-general.ts @@ -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' diff --git a/scripts/collect-i18n-node-defs.ts b/scripts/i18n/collect-i18n-node-defs.ts similarity index 81% rename from scripts/collect-i18n-node-defs.ts rename to scripts/i18n/collect-i18n-node-defs.ts index ed443015ae..006e519b98 100644 --- a/scripts/collect-i18n-node-defs.ts +++ b/scripts/i18n/collect-i18n-node-defs.ts @@ -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`) @@ -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 @@ -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.