@chakra-ui/react
Version:
Responsive and accessible React UI components built with React and Emotion
44 lines (41 loc) • 1.35 kB
JavaScript
;
import { mergeWith } from '../utils/merge.js';
import { clone } from '../utils/clone.js';
import { walkObject } from '../utils/walk-object.js';
const tokenKeys = ["value", "type", "description"];
const isValidToken = (token) => {
return token && typeof token === "object" && !Array.isArray(token);
};
const mergeConfigs = (...configs) => {
const merged = mergeWith({}, ...configs.map(clone));
if (merged.theme?.tokens) {
walkObject(
merged.theme.tokens,
(value) => {
const keys = Object.keys(value);
const nestedKeys = keys.filter((k) => !tokenKeys.includes(k));
const hasNested = nestedKeys.length > 0;
const hasTokenProps = tokenKeys.some((k) => value[k] != null);
if (hasNested && hasTokenProps) {
value.DEFAULT || (value.DEFAULT = {});
tokenKeys.forEach((key) => {
var _a;
if (value[key] == null) return;
(_a = value.DEFAULT)[key] || (_a[key] = value[key]);
delete value[key];
});
}
return value;
},
{
stop(value) {
return isValidToken(value) && Object.keys(value).some(
(k) => tokenKeys.includes(k) || k !== k.toLowerCase() && k !== k.toUpperCase()
);
}
}
);
}
return merged;
};
export { mergeConfigs };