feat: use object info display_name as fallback before node name (#7622)

## Description
Implements fallback to object info display_name before using internal
node name when display_name is unavailable.

## Related Issue
Related to backend PR: comfyanonymous/ComfyUI#11340

## Changes
- Modified `getNodeDefs()` to use object info `display_name` before
falling back to `name`
- Added unit tests for display name fallback behavior

## Testing
- All existing tests pass
- Added 4 new unit tests covering various display_name scenarios

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-7622-W-I-P-feat-use-object-info-display_name-as-fallback-before-node-name-2cd6d73d365081deb22fe5ed00e6dc2e)
by [Unito](https://www.unito.io)
This commit is contained in:
Csongor Czezar
2026-02-10 19:18:48 -08:00
committed by GitHub
parent d873c8048f
commit d044bed9b2
2 changed files with 113 additions and 14 deletions

View File

@@ -953,20 +953,25 @@ export class ComfyApp {
}
async getNodeDefs(): Promise<Record<string, ComfyNodeDefV1>> {
const translateNodeDef = (def: ComfyNodeDefV1): ComfyNodeDefV1 => ({
...def,
display_name: st(
`nodeDefs.${def.name}.display_name`,
def.display_name ?? def.name
),
description: def.description
? st(`nodeDefs.${def.name}.description`, def.description)
: '',
category: def.category
.split('/')
.map((category: string) => st(`nodeCategories.${category}`, category))
.join('/')
})
const translateNodeDef = (def: ComfyNodeDefV1): ComfyNodeDefV1 => {
// Use object info display_name as fallback before using name
const objectInfoDisplayName = def.display_name || def.name
return {
...def,
display_name: st(
`nodeDefs.${def.name}.display_name`,
objectInfoDisplayName
),
description: def.description
? st(`nodeDefs.${def.name}.description`, def.description)
: '',
category: def.category
.split('/')
.map((category: string) => st(`nodeCategories.${category}`, category))
.join('/')
}
}
return _.mapValues(await api.getNodeDefs(), (def) => translateNodeDef(def))
}

View File

@@ -0,0 +1,94 @@
import { beforeEach, describe, expect, test, vi } from 'vitest'
import { st } from '@/i18n'
import type { ComfyNodeDef as ComfyNodeDefV1 } from '@/schemas/nodeDefSchema'
import { api } from '@/scripts/api'
import { app as comfyApp } from '@/scripts/app'
vi.mock('@/scripts/api', () => ({
api: {
getNodeDefs: vi.fn(),
apiURL: vi.fn((path: string) => path),
addEventListener: vi.fn(),
getUserData: vi.fn(),
storeUserData: vi.fn()
}
}))
vi.mock('@/i18n', () => ({
st: vi.fn((_key: string, fallback: string) => fallback),
t: vi.fn((key: string) => key),
te: vi.fn(() => false)
}))
describe('ComfyApp.getNodeDefs', () => {
beforeEach(() => {
vi.clearAllMocks()
})
test('should use object info display_name when available', async () => {
const mockNodeDefs: Record<string, ComfyNodeDefV1> = {
TestNode: {
name: 'TestNode',
display_name: 'Custom Display Name',
category: 'test',
description: 'Test description',
input: {},
output: [],
output_node: false,
python_module: 'test.module'
}
}
vi.mocked(api.getNodeDefs).mockResolvedValue(mockNodeDefs)
const result = await comfyApp.getNodeDefs()
expect(result.TestNode.display_name).toBe('Custom Display Name')
})
test('should fall back to name when display_name is missing', async () => {
const mockNodeDefs: Record<string, ComfyNodeDefV1> = {
TestNode: {
name: 'TestNode',
display_name: '',
category: 'test',
description: 'Test description',
input: {},
output: [],
output_node: false,
python_module: 'test.module'
}
}
vi.mocked(api.getNodeDefs).mockResolvedValue(mockNodeDefs)
const result = await comfyApp.getNodeDefs()
// When display_name is empty, should fall back to name
expect(result.TestNode.display_name).toBe('TestNode')
})
test('should prioritize translation over object info display_name', async () => {
const mockNodeDefs: Record<string, ComfyNodeDefV1> = {
TestNode: {
name: 'TestNode',
display_name: 'Object Info Display Name',
category: 'test',
description: 'Test description',
input: {},
output: [],
output_node: false,
python_module: 'test.module'
}
}
vi.mocked(api.getNodeDefs).mockResolvedValue(mockNodeDefs)
// Mock st to return a translation instead of fallback
vi.mocked(st).mockReturnValue('Translated Display Name')
const result = await comfyApp.getNodeDefs()
expect(result.TestNode.display_name).toBe('Translated Display Name')
})
})