From 11b4d34b79ae6438f3ec3d7bbf4b14aaaf213bb1 Mon Sep 17 00:00:00 2001 From: Javi Aguilar <122741+itsjavi@users.noreply.github.com> Date: Thu, 21 May 2026 16:27:51 +0200 Subject: [PATCH] refactor: allow arrays and falsy values in cn util --- packages/surveys/src/lib/utils.test.ts | 8 ++++++++ packages/surveys/src/lib/utils.ts | 10 ++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/packages/surveys/src/lib/utils.test.ts b/packages/surveys/src/lib/utils.test.ts index 0a91e50ed2..e4805bf027 100644 --- a/packages/surveys/src/lib/utils.test.ts +++ b/packages/surveys/src/lib/utils.test.ts @@ -552,4 +552,12 @@ describe("cn", () => { test("handles all undefined", () => { expect(cn(undefined, undefined)).toBe(""); }); + + test("handles nested arrays of classes", () => { + expect(cn(["foo", ["foo", ["foo", "bar"]]])).toBe("foo foo foo bar"); + }); + + test("handles nulls, booleans and undefined values", () => { + expect(cn(null, true, false, undefined, [null, true, false, undefined])).toBe(""); + }); }); diff --git a/packages/surveys/src/lib/utils.ts b/packages/surveys/src/lib/utils.ts index 0885bdb6da..5b8a4f68cd 100644 --- a/packages/surveys/src/lib/utils.ts +++ b/packages/surveys/src/lib/utils.ts @@ -12,8 +12,14 @@ import { type TSurveyElement, type TSurveyElementChoice } from "@formbricks/type import { type TShuffleOption } from "@formbricks/types/surveys/types"; import { ApiResponse, ApiSuccessResponse } from "@/types/api"; -export const cn = (...classes: (string | undefined)[]) => { - return twMerge(classes.filter(Boolean).join(" ")); +type ClassValue = string | boolean | null | undefined | ClassValue[]; +export const cn = (...classes: ClassValue[]): string => { + return twMerge( + classes + .map((c) => (Array.isArray(c) ? cn(...c) : c)) + .filter((c): c is string => typeof c === "string" && c.length > 0) + .join(" ") + ); }; export const getSecureRandom = (): number => {