UNPKG

tailwind-variants

Version:

🦄 Tailwindcss first-class variant API

113 lines (111 loc) • 3.41 kB
// src/utils.js var SPACE_REGEX = /\s+/g; var removeExtraSpaces = (str) => { if (typeof str !== "string" || !str) return str; return str.replace(SPACE_REGEX, " ").trim(); }; var cx = (...classnames) => { const classList = []; const buildClassString = (input) => { if (!input && input !== 0 && input !== 0n) return; if (Array.isArray(input)) { for (let i = 0, len = input.length; i < len; i++) buildClassString(input[i]); return; } const type = typeof input; if (type === "string" || type === "number" || type === "bigint") { if (type === "number" && input !== input) return; classList.push(String(input)); } else if (type === "object") { const keys = Object.keys(input); for (let i = 0, len = keys.length; i < len; i++) { const key = keys[i]; if (input[key]) classList.push(key); } } }; for (let i = 0, len = classnames.length; i < len; i++) { const c = classnames[i]; if (c !== null && c !== void 0) buildClassString(c); } return classList.length > 0 ? removeExtraSpaces(classList.join(" ")) : void 0; }; var falsyToString = (value) => value === false ? "false" : value === true ? "true" : value === 0 ? "0" : value; var isEmptyObject = (obj) => { if (!obj || typeof obj !== "object") return true; for (const _ in obj) return false; return true; }; var isEqual = (obj1, obj2) => { if (obj1 === obj2) return true; if (!obj1 || !obj2) return false; const keys1 = Object.keys(obj1); const keys2 = Object.keys(obj2); if (keys1.length !== keys2.length) return false; for (let i = 0; i < keys1.length; i++) { const key = keys1[i]; if (!keys2.includes(key)) return false; if (obj1[key] !== obj2[key]) return false; } return true; }; var isBoolean = (value) => value === true || value === false; var joinObjects = (obj1, obj2) => { for (const key in obj2) { if (Object.prototype.hasOwnProperty.call(obj2, key)) { const val2 = obj2[key]; if (key in obj1) { obj1[key] = cx(obj1[key], val2); } else { obj1[key] = val2; } } } return obj1; }; var flat = (arr, target) => { for (let i = 0; i < arr.length; i++) { const el = arr[i]; if (Array.isArray(el)) flat(el, target); else if (el) target.push(el); } }; function flatArray(arr) { const flattened = []; flat(arr, flattened); return flattened; } var flatMergeArrays = (...arrays) => { const result = []; flat(arrays, result); const filtered = []; for (let i = 0; i < result.length; i++) { if (result[i]) filtered.push(result[i]); } return filtered; }; var mergeObjects = (obj1, obj2) => { const result = {}; for (const key in obj1) { const val1 = obj1[key]; if (key in obj2) { const val2 = obj2[key]; if (Array.isArray(val1) || Array.isArray(val2)) { result[key] = flatMergeArrays(val2, val1); } else if (typeof val1 === "object" && typeof val2 === "object" && val1 && val2) { result[key] = mergeObjects(val1, val2); } else { result[key] = val2 + " " + val1; } } else { result[key] = val1; } } for (const key in obj2) { if (!(key in obj1)) { result[key] = obj2[key]; } } return result; }; export { cx, falsyToString, flat, flatArray, flatMergeArrays, isBoolean, isEmptyObject, isEqual, joinObjects, mergeObjects, removeExtraSpaces };