UNPKG

@mui/utils

Version:
55 lines (54 loc) 2.14 kB
import clsx from 'clsx'; /** * Add keys, values of `defaultProps` that does not exist in `props` * @param defaultProps * @param props * @param mergeClassNameAndStyle If `true`, merges `className` and `style` props instead of overriding them. * When `false` (default), props override defaultProps. When `true`, `className` values are concatenated * and `style` objects are merged with props taking precedence. * @returns resolved props */ export default function resolveProps(defaultProps, props, mergeClassNameAndStyle = false) { const output = { ...props }; for (const key in defaultProps) { if (Object.prototype.hasOwnProperty.call(defaultProps, key)) { const propName = key; if (propName === 'components' || propName === 'slots') { output[propName] = { ...defaultProps[propName], ...output[propName] }; } else if (propName === 'componentsProps' || propName === 'slotProps') { const defaultSlotProps = defaultProps[propName]; const slotProps = props[propName]; if (!slotProps) { output[propName] = defaultSlotProps || {}; } else if (!defaultSlotProps) { output[propName] = slotProps; } else { output[propName] = { ...slotProps }; for (const slotKey in defaultSlotProps) { if (Object.prototype.hasOwnProperty.call(defaultSlotProps, slotKey)) { const slotPropName = slotKey; output[propName][slotPropName] = resolveProps(defaultSlotProps[slotPropName], slotProps[slotPropName], mergeClassNameAndStyle); } } } } else if (propName === 'className' && mergeClassNameAndStyle && props.className) { output.className = clsx(defaultProps?.className, props?.className); } else if (propName === 'style' && mergeClassNameAndStyle && props.style) { output.style = { ...defaultProps?.style, ...props?.style }; } else if (output[propName] === undefined) { output[propName] = defaultProps[propName]; } } } return output; }