mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-02-02 22:37:32 +00:00
## Summary Part 2 of the type safety remediation plan. This PR focuses on the Litegraph Library Layer as part of the **No Explicit Any** mission. ### Changes **LiteGraphGlobal.ts:** - `DEFAULT_GROUP_FONT_SIZE`: Changed from `any` (with no value) to `number = 24`. The internal fallback was already 24, so the constant was effectively useless without an assigned value. - `getParameterNames`: Replace `any` with `unknown` in function signature - `extendClass`: Replace deprecated `__lookupGetter__`/`__defineGetter__` with modern `Object.getOwnPropertyDescriptor`/`defineProperty` and add proper Record types **LGraphNodeProperties.ts:** - Replace `any` with `unknown` for property values - Use `Record<string, unknown>` with proper type assertions for dynamic property access **types/widgets.ts & BaseWidget.ts:** - Change `callback` value parameter from `any` to properly typed (`unknown` in interface, `TWidget['value']` in implementation) **Consuming code fixes:** - `previewAny.ts`: Add explicit `boolean` type annotation for callback value - `ButtonWidget.ts`: Pass widget value instead of widget instance to callback (matching the interface signature) ## Breaking Change Analysis (Sourcegraph Verified) ### ButtonWidget callback fix (`this` → `this.value`) This PR fixes the ButtonWidget callback to pass `value` instead of `this`, matching the interface definition. **Verification via Sourcegraph** - all external usages are safe: - [comfyui-ollama](https://cs.comfy.org/github.com/stavsap/comfyui-ollama/-/blob/web/js/OllamaNode.js?L84) - doesn't use callback args - [ComfyLab-Pack](https://cs.comfy.org/github.com/bugltd/ComfyLab-Pack/-/blob/dist/js/nodes/list.js?L8) - doesn't use callback args - [ComfyUI_PaintingCoderUtils](https://cs.comfy.org/github.com/jammyfu/ComfyUI_PaintingCoderUtils/-/blob/web/js/click_popup.js?L18) - doesn't use callback args - [ComfyUI-ShaderNoiseKSampler](https://cs.comfy.org/github.com/AEmotionStudio/ComfyUI-ShaderNoiseKSampler/-/blob/web/matrix_button.js?L3055-3056) - was already working around this bug --------- Co-authored-by: GitHub Action <action@github.com>
84 lines
2.8 KiB
TypeScript
84 lines
2.8 KiB
TypeScript
/*
|
|
Preview Any - original implement from
|
|
https://github.com/rgthree/rgthree-comfy/blob/main/py/display_any.py
|
|
upstream requested in https://github.com/Kosinkadink/rfcs/blob/main/rfcs/0000-corenodes.md#preview-nodes
|
|
*/
|
|
import { app } from '@/scripts/app'
|
|
import { type DOMWidget } from '@/scripts/domWidget'
|
|
import { ComfyWidgets } from '@/scripts/widgets'
|
|
import { useExtensionService } from '@/services/extensionService'
|
|
|
|
useExtensionService().registerExtension({
|
|
name: 'Comfy.PreviewAny',
|
|
async beforeRegisterNodeDef(nodeType, nodeData) {
|
|
if (nodeData.name === 'PreviewAny') {
|
|
const onNodeCreated = nodeType.prototype.onNodeCreated
|
|
|
|
nodeType.prototype.onNodeCreated = function () {
|
|
onNodeCreated ? onNodeCreated.apply(this, []) : undefined
|
|
|
|
const showValueWidget = ComfyWidgets['MARKDOWN'](
|
|
this,
|
|
'preview',
|
|
['MARKDOWN', {}],
|
|
app
|
|
).widget as DOMWidget<HTMLTextAreaElement, string>
|
|
|
|
const showValueWidgetPlain = ComfyWidgets['STRING'](
|
|
this,
|
|
'preview',
|
|
['STRING', { multiline: true }],
|
|
app
|
|
).widget as DOMWidget<HTMLTextAreaElement, string>
|
|
|
|
const showAsPlaintextWidget = ComfyWidgets['BOOLEAN'](
|
|
this,
|
|
'previewMode',
|
|
[
|
|
'BOOLEAN',
|
|
{ label_on: 'Markdown', label_off: 'Plaintext', default: false }
|
|
],
|
|
app
|
|
)
|
|
|
|
showAsPlaintextWidget.widget.callback = (value: boolean) => {
|
|
showValueWidget.hidden = !value
|
|
showValueWidget.options.hidden = !value
|
|
showValueWidgetPlain.hidden = value
|
|
showValueWidgetPlain.options.hidden = value
|
|
}
|
|
|
|
showValueWidget.hidden = true
|
|
showValueWidget.options.hidden = true
|
|
showValueWidget.options.read_only = true
|
|
showValueWidget.element.readOnly = true
|
|
showValueWidget.element.disabled = true
|
|
showValueWidget.serialize = false
|
|
|
|
showValueWidgetPlain.hidden = false
|
|
showValueWidgetPlain.options.hidden = false
|
|
showValueWidgetPlain.options.read_only = true
|
|
showValueWidgetPlain.element.readOnly = true
|
|
showValueWidgetPlain.element.disabled = true
|
|
showValueWidgetPlain.serialize = false
|
|
}
|
|
|
|
const onExecuted = nodeType.prototype.onExecuted
|
|
|
|
nodeType.prototype.onExecuted = function (message) {
|
|
onExecuted === null || onExecuted === void 0
|
|
? void 0
|
|
: onExecuted.apply(this, [message])
|
|
|
|
const previewWidgets =
|
|
this.widgets?.filter((w) => w.name === 'preview') ?? []
|
|
|
|
for (const previewWidget of previewWidgets) {
|
|
const text = message.text ?? ''
|
|
previewWidget.value = Array.isArray(text) ? (text[0] ?? '') : text
|
|
}
|
|
}
|
|
}
|
|
}
|
|
})
|