From 692802f8a6982fbdbf131b26e4a4deea21493887 Mon Sep 17 00:00:00 2001 From: Ryan Di Date: Wed, 25 Mar 2026 20:10:43 +1100 Subject: [PATCH] fix: handle missing schemaState in migration --- packages/excalidraw/data/schema.test.ts | 31 +++++++++++++++++++++++++ packages/excalidraw/data/schema.ts | 1 + 2 files changed, 32 insertions(+) diff --git a/packages/excalidraw/data/schema.test.ts b/packages/excalidraw/data/schema.test.ts index f1f207c630..e38b6fec8d 100644 --- a/packages/excalidraw/data/schema.test.ts +++ b/packages/excalidraw/data/schema.test.ts @@ -36,6 +36,37 @@ describe("schema migration", () => { ); }); + it("should handle elements without schemaState", () => { + const frameWithoutSchemaState = { + ...API.createElement({ + type: "frame", + backgroundColor: "#ffc9c9", + }), + schemaState: undefined, + } as any; + + const textWithoutSchemaState = { + ...API.createElement({ + type: "text", + text: "", + }), + schemaState: undefined, + } as any; + + const migrated = migrateElements([ + frameWithoutSchemaState, + textWithoutSchemaState, + ])!; + + expect(migrated[0].backgroundColor).toBe( + DEFAULT_ELEMENT_PROPS.backgroundColor, + ); + expect(migrated[0].schemaState.tracks[CORE_FRAME_SCHEMA_TRACK]).toBe( + CORE_SUPPORTED_TRACKS[CORE_FRAME_SCHEMA_TRACK], + ); + expect(migrated[1].schemaState).toEqual({ tracks: {} }); + }); + it("should keep latest-track frame backgrounds unchanged", () => { const frame = { ...API.createElement({ diff --git a/packages/excalidraw/data/schema.ts b/packages/excalidraw/data/schema.ts index e8a2ac5daf..5baf3b0f66 100644 --- a/packages/excalidraw/data/schema.ts +++ b/packages/excalidraw/data/schema.ts @@ -141,6 +141,7 @@ const ensureElementSchemaState = (element: ExcalidrawElement) => { } if ( + element.schemaState && Object.keys(element.schemaState?.tracks || {}).length === Object.keys(normalizedSchemaState.tracks).length && Object.entries(normalizedSchemaState.tracks).every(