Skip to content

Commit 37da61f

Browse files
feat(shared): add array support to cx utility (#18)
* feat(shared): add array support to cx utility * Apply suggestions from code review Co-authored-by: Aymeric Giraudet <[email protected]> Co-authored-by: Aymeric Giraudet <[email protected]>
1 parent 8d7da7d commit 37da61f

File tree

2 files changed

+26
-4
lines changed

2 files changed

+26
-4
lines changed

Diff for: packages/shared/src/__tests__/cx.test.ts

+12
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,16 @@ describe('cx', () => {
1717
expect(cx('')).toBe(undefined);
1818
expect(cx(false, undefined, null)).toBe(undefined);
1919
});
20+
21+
test('recursively concatenates arrays', () => {
22+
expect(cx(['class1', 'class2'], ['class3', 'class4'])).toBe(
23+
'class1 class2 class3 class4'
24+
);
25+
expect(cx(['class1', 'class2'], false && ['class3', 'class4'])).toBe(
26+
'class1 class2'
27+
);
28+
expect(
29+
cx(['class1', false && 'class2'], ['class3', false && 'class4'])
30+
).toBe('class1 class3');
31+
});
2032
});

Diff for: packages/shared/src/cx.ts

+14-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
1-
export function cx(
2-
...classNames: Array<string | number | boolean | undefined | null>
3-
) {
4-
return classNames.filter(Boolean).join(' ') || undefined;
1+
type ClassValue = string | undefined | boolean | null | number;
2+
3+
export function cx(...cssClasses: Array<ClassValue | ClassValue[]>) {
4+
return (
5+
cssClasses
6+
.reduce<ClassValue[]>((acc, className) => {
7+
if (Array.isArray(className)) {
8+
return acc.concat(className);
9+
}
10+
return acc.concat([className]);
11+
}, [])
12+
.filter(Boolean)
13+
.join(' ') || undefined
14+
);
515
}

0 commit comments

Comments
 (0)