From 98eeb1da9012dd1ffd9a9565206ff130fb774252 Mon Sep 17 00:00:00 2001 From: Anton Date: Wed, 3 Jun 2026 11:30:12 -0700 Subject: [PATCH] fix(nodes): coalesce node.children to [] in container renderers (#333) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Guards building/ceiling/site/wall renderers with `(node.children ?? [])` so a node whose `children` array is missing (legacy/unparsed scene data) no longer crashes the renderer with "Cannot read properties of undefined (reading 'map')" (EDITOR-C0). Matches the existing guard in roof/renderer.tsx and the Array.isArray check in the parametric renderer. Note: the schema declares `children: z.array(...).default([])`, so this can only be hit by data that bypasses Zod normalization on load. This is a defense-in-depth crash-stopper; the deeper fix is to normalize/parse legacy nodes in migrateNodes (use-scene.ts) so missing arrays are repaired before render — tracked as a follow-up. --- packages/nodes/src/building/renderer.tsx | 2 +- packages/nodes/src/ceiling/renderer.tsx | 2 +- packages/nodes/src/site/renderer.tsx | 2 +- packages/nodes/src/wall/renderer.tsx | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/nodes/src/building/renderer.tsx b/packages/nodes/src/building/renderer.tsx index 87f2f2f4..6bc40a90 100644 --- a/packages/nodes/src/building/renderer.tsx +++ b/packages/nodes/src/building/renderer.tsx @@ -18,7 +18,7 @@ export const BuildingRenderer = ({ node }: { node: BuildingNode }) => { rotation={[node.rotation[0], node.rotation[1], node.rotation[2]]} {...handlers} > - {node.children.map((childId) => ( + {(node.children ?? []).map((childId) => ( ))} diff --git a/packages/nodes/src/ceiling/renderer.tsx b/packages/nodes/src/ceiling/renderer.tsx index 82a985e7..cf624bd8 100644 --- a/packages/nodes/src/ceiling/renderer.tsx +++ b/packages/nodes/src/ceiling/renderer.tsx @@ -127,7 +127,7 @@ export const CeilingRenderer = ({ node }: { node: CeilingNode }) => { scale={0} visible={false} /> - {node.children.map((childId) => ( + {(node.children ?? []).map((childId) => ( ))} diff --git a/packages/nodes/src/site/renderer.tsx b/packages/nodes/src/site/renderer.tsx index c4bdcf29..17c9315e 100644 --- a/packages/nodes/src/site/renderer.tsx +++ b/packages/nodes/src/site/renderer.tsx @@ -139,7 +139,7 @@ export const SiteRenderer = ({ node }: { node: SiteNode }) => { return ( {/* Render children (buildings and items) */} - {node.children.map((childId) => ( + {(node.children ?? []).map((childId) => ( ))} diff --git a/packages/nodes/src/wall/renderer.tsx b/packages/nodes/src/wall/renderer.tsx index 815f34b1..24abf9b5 100644 --- a/packages/nodes/src/wall/renderer.tsx +++ b/packages/nodes/src/wall/renderer.tsx @@ -78,7 +78,7 @@ const WallRenderer = ({ node }: { node: WallNode }) => { {...handlers} /> - {node.children.map((childId) => ( + {(node.children ?? []).map((childId) => ( ))}