diff --git a/packages/sdk/src/core/goview/convert.ts b/packages/sdk/src/core/goview/convert.ts index 6ba7b3d..e23f90b 100644 --- a/packages/sdk/src/core/goview/convert.ts +++ b/packages/sdk/src/core/goview/convert.ts @@ -63,22 +63,36 @@ export interface GoViewProjectLike { } function unwrapComponent(c: GoViewComponentLike): GoViewComponentLike { - // Prefer nested component shapes but keep outer fields as fallback. + // Prefer nested component shapes but keep outer geometry/id as fallback. // Some exports wrap components multiple times like: // { id, attr, component: { component: { chartConfig, option } } } // We unwrap iteratively to avoid recursion pitfalls. + // + // Important: do NOT let `undefined` values from inner layers overwrite outer values. + // Some goView exports include wrapper objects where `id/attr` only exist on the outer layer. let out: GoViewComponentLike = c; let depth = 0; while (out.component && depth < 6) { + const outer = out; const inner = out.component; + out = { - // Prefer outer for geometry/id, but prefer inner for identity/option when present. - ...out, - ...inner, + // Outer (wrapper) often contains the stable identity/geometry. + id: outer.id ?? inner.id, + attr: outer.attr ?? inner.attr, + status: outer.status ?? inner.status, + + // Inner tends to carry the real widget identity/config. + key: inner.key ?? outer.key, + componentKey: inner.componentKey ?? outer.componentKey, + chartConfig: inner.chartConfig ?? outer.chartConfig, + option: inner.option ?? outer.option, + // keep unwrapping if there are more layers component: inner.component, }; + depth++; }