From 1c837f18bd8d25e1079c3b41543782f5abdc191a Mon Sep 17 00:00:00 2001 From: shamAnimates <145093437+shamAnimates@users.noreply.github.com> Date: Sun, 16 Aug 2026 19:02:52 +0530 Subject: [PATCH] refactor(lib): safely merge organization metadata --- packages/lib/organization-metadata.test.ts | 11 +++++++++++ packages/lib/organization-metadata.ts | 17 ++++++++++------- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/packages/lib/organization-metadata.test.ts b/packages/lib/organization-metadata.test.ts index 3eb3c039..ede14161 100644 --- a/packages/lib/organization-metadata.test.ts +++ b/packages/lib/organization-metadata.test.ts @@ -38,4 +38,15 @@ describe("mergeOrganizationMetadata", () => { mergeOrganizationMetadata(null, "org-a", { isOnboarded: true }), ).toBeNull() }) + + it("replaces malformed metadata without spreading it", () => { + const current: { id: string; metadata?: unknown } = { + id: "org-a", + metadata: ["unexpected"], + } + + expect( + mergeOrganizationMetadata(current, "org-a", { isOnboarded: true }), + ).toEqual({ id: "org-a", metadata: { isOnboarded: true } }) + }) }) diff --git a/packages/lib/organization-metadata.ts b/packages/lib/organization-metadata.ts index e2ef539c..78ee02df 100644 --- a/packages/lib/organization-metadata.ts +++ b/packages/lib/organization-metadata.ts @@ -3,6 +3,10 @@ interface OrganizationWithMetadata { metadata?: unknown } +function isMetadataRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value) +} + export function mergeOrganizationMetadata< Organization extends OrganizationWithMetadata, >( @@ -12,11 +16,10 @@ export function mergeOrganizationMetadata< ): Organization | null { if (!current || current.id !== organizationId) return current - return { - ...current, - metadata: { - ...(current.metadata as Record | null), - ...partial, - }, - } as Organization + const metadata = { + ...(isMetadataRecord(current.metadata) ? current.metadata : {}), + ...partial, + } + + return Object.assign({}, current, { metadata }) }