From d3e82fba44b32eb6a4da4e0e7033c44bf020ba44 Mon Sep 17 00:00:00 2001 From: Danila Poyarkov Date: Thu, 21 May 2026 10:37:05 +0300 Subject: [PATCH] fix(fig): preserve source metadata during lazy import --- .../derived-symbol-data/propagate.ts | 4 +++- .../kiwi/fig/instance-overrides/patches/apply.ts | 7 ++++--- .../src/kiwi/fig/instance-overrides/resolve.ts | 8 ++++++-- packages/core/src/kiwi/fig/lazy-import.ts | 16 +++++++++------- 4 files changed, 22 insertions(+), 13 deletions(-) diff --git a/packages/core/src/kiwi/fig/instance-overrides/derived-symbol-data/propagate.ts b/packages/core/src/kiwi/fig/instance-overrides/derived-symbol-data/propagate.ts index 66802c84b..69714867a 100644 --- a/packages/core/src/kiwi/fig/instance-overrides/derived-symbol-data/propagate.ts +++ b/packages/core/src/kiwi/fig/instance-overrides/derived-symbol-data/propagate.ts @@ -54,7 +54,9 @@ export function propagateDsdChanges( const clone = ctx.graph.getNode(cloneId) if (!clone) continue const updates = buildCloneUpdates(ctx, source, clone, cloneId, sizeSet) - if (Object.keys(updates).length > 0) ctx.graph.updateNode(cloneId, updates) + if (Object.keys(updates).length > 0) { + ctx.graph.preserveSourceMetadataDuring(() => ctx.graph.updateNode(cloneId, updates)) + } queue.push(cloneId) } } diff --git a/packages/core/src/kiwi/fig/instance-overrides/patches/apply.ts b/packages/core/src/kiwi/fig/instance-overrides/patches/apply.ts index 6a8a0cf8c..8a468ae89 100644 --- a/packages/core/src/kiwi/fig/instance-overrides/patches/apply.ts +++ b/packages/core/src/kiwi/fig/instance-overrides/patches/apply.ts @@ -37,9 +37,10 @@ export function applyOverridePatch(ctx: OverrideContext, patch: OverridePatch): if (patch.props && Object.keys(patch.props).length > 0) { const target = ctx.graph.getNode(patch.targetId) if (target) { - preserveStrokeShapeProps(target, patch.props) - ctx.graph.updateNode(patch.targetId, patch.props) - protectPatchProps(ctx.protectedFields, patch.targetId, patch.props) + const props = patch.props + preserveStrokeShapeProps(target, props) + ctx.graph.preserveSourceMetadataDuring(() => ctx.graph.updateNode(patch.targetId, props)) + protectPatchProps(ctx.protectedFields, patch.targetId, props) changed = true } } diff --git a/packages/core/src/kiwi/fig/instance-overrides/resolve.ts b/packages/core/src/kiwi/fig/instance-overrides/resolve.ts index 1190bbeda..581895a35 100644 --- a/packages/core/src/kiwi/fig/instance-overrides/resolve.ts +++ b/packages/core/src/kiwi/fig/instance-overrides/resolve.ts @@ -343,7 +343,11 @@ function applyStrokeDescendants(ctx: OverrideContext, nodeId: string, strokes: S const node = ctx.graph.getNode(id) if (!node) return if (node.strokes.length > 0) { - if (index < strokes.length) ctx.graph.updateNode(id, { strokes: copyStrokes(strokes[index]) }) + if (index < strokes.length) { + ctx.graph.preserveSourceMetadataDuring(() => { + ctx.graph.updateNode(id, { strokes: copyStrokes(strokes[index]) }) + }) + } index++ } for (const childId of node.childIds) visit(childId) @@ -364,7 +368,7 @@ export function repopulateInstance(ctx: OverrideContext, nodeId: string, compId: if (comp?.name && rootComp?.name && node.name === rootComp.name) { updates.name = comp.name } - ctx.graph.updateNode(nodeId, updates) + ctx.graph.preserveSourceMetadataDuring(() => ctx.graph.updateNode(nodeId, updates)) if (comp && comp.childIds.length > 0) { ctx.graph.populateInstanceChildren(nodeId, compId) applyStrokeDescendants(ctx, nodeId, previousStrokes) diff --git a/packages/core/src/kiwi/fig/lazy-import.ts b/packages/core/src/kiwi/fig/lazy-import.ts index 13bb8adbe..406d62172 100644 --- a/packages/core/src/kiwi/fig/lazy-import.ts +++ b/packages/core/src/kiwi/fig/lazy-import.ts @@ -27,13 +27,15 @@ function populateRoots( const pending = [...rootIds].filter((id) => id && !context.populatedRootIds.has(id)) if (pending.length === 0) return false - populateAndApplyOverrides( - graph, - context.changeMap, - context.guidToNodeId, - context.blobs, - pending - ) + graph.preserveSourceMetadataDuring(() => { + populateAndApplyOverrides( + graph, + context.changeMap, + context.guidToNodeId, + context.blobs, + pending + ) + }) for (const id of pending) context.populatedRootIds.add(id) return true