Compare commits

...

1 Commits

Author SHA1 Message Date
Terry Jia
0d40405d16 fix: serialize widgets_values densely to keep values aligned on reload 2026-06-13 21:17:36 -04:00
2 changed files with 31 additions and 2 deletions

View File

@@ -587,6 +587,34 @@ describe('LGraphNode', () => {
expect(node.widgets![0].value).toBe(1)
expect(node.widgets![1].value).toBe(100)
})
test('round-trips values across a serialize:false widget in the middle', () => {
const node = new LGraphNode('TestNode')
node.serialize_widgets = true
node.addWidget('number', 'a', 1, null)
node.addWidget('number', 'shim', 0, null)
node.addWidget('number', 'b', 2, null)
node.widgets![1].serialize = false
const serialized = node.serialize()
// Dense: the middle serialize:false widget must not leave a gap.
expect(serialized.widgets_values).toEqual([1, 2])
node.widgets![0].value = 0
node.widgets![2].value = 0
node.configure(
getMockISerialisedNode({
id: 1,
type: 'TestNode',
pos: [0, 0],
size: [100, 100],
properties: {},
widgets_values: serialized.widgets_values
})
)
expect(node.widgets![0].value).toBe(1)
expect(node.widgets![2].value).toBe(2)
})
})
describe('getInputSlotPos', () => {

View File

@@ -973,14 +973,15 @@ export class LGraphNode
const { widgets } = this
if (widgets && this.serialize_widgets) {
o.widgets_values = []
for (const [i, widget] of widgets.entries()) {
for (const widget of widgets) {
if (widget.serialize === false) continue
const val = widget?.value
// Ensure object values are plain (not reactive proxies) for structuredClone compatibility.
o.widgets_values[i] =
o.widgets_values.push(
val != null && typeof val === 'object'
? JSON.parse(JSON.stringify(val))
: (val ?? null)
)
}
}