Line data Source code
1 : interface ClassArray extends Array<ClassValue> { }
2 : interface ClassDictionary {
3 : [id: string]: boolean | undefined;
4 : }
5 : declare type ClassValue = undefined | null | string | ClassDictionary | ClassArray;
6 :
7 1 : function parseValue(arg: ClassValue) {
8 1 : if (arg == null) {
9 1 : return null;
10 : }
11 1 : if (typeof arg === 'string') {
12 1 : return arg;
13 : }
14 1 : if (typeof arg !== 'object') {
15 1 : return null;
16 : }
17 1 : if (Array.isArray(arg)) {
18 1 : return classNames(...arg);
19 : }
20 1 : if (arg.toString !== Object.prototype.toString) {
21 1 : return arg.toString();
22 : }
23 1 : let out = '';
24 1 : for (const key in arg) {
25 1 : if (Object.prototype.hasOwnProperty.call(arg, key) && arg[key]) {
26 1 : out = appendClass(out, key);
27 : }
28 : }
29 1 : return out;
30 1 : }
31 :
32 1 : function appendClass(value: string, newClass: string | null) {
33 1 : if (!newClass) {
34 1 : return value;
35 : }
36 1 : return value ? (value + ' ' + newClass) : newClass;
37 1 : }
38 :
39 1 : export function classNames(...args: ClassValue[]) {
40 1 : let out = "";
41 1 : for (const arg of args) {
42 1 : if (arg) {
43 1 : out = appendClass(out, parseValue(arg));
44 : }
45 : }
46 1 : return out;
47 1 : }
|