es-grid-template
Version:
es-grid-template
60 lines (58 loc) • 2.09 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = mergeCellProps;
var _classnames = _interopRequireDefault(require("classnames"));
function composeEventHandler(handler1, handler2) {
return (...args) => {
// Execute the original event handler first
handler1(args);
handler2(args);
// Event handlers do not return a value, so nothing is returned here
};
}
/** Merge two cellProps objects and return a new merged object.
*
* mergeCellProps merges according to these rules:
* - For primitive fields (number, string, boolean), values from `extra` override `base` (with `className` concatenated).
* - For function fields (event handlers), mergeCellProps returns a new function that calls `base` then `extra`.
* - For plain object fields (e.g., styles), mergeCellProps shallow-merges the two objects.
*/
function mergeCellProps(base, extra) {
if (base == null) {
return extra;
}
if (extra == null) {
return base;
}
const result = Object.assign({}, base);
for (const key of Object.keys(extra)) {
const value = extra[key];
const type = typeof value;
if (value === null) {
// When value === null, override the original value
result[key] = null;
} else if (value === undefined) {
// When value === undefined, keep the original value
} else if (type === 'number' || type === 'string' || type === 'boolean') {
if (key === 'className') {
result[key] = (0, _classnames.default)(result[key], value);
} else {
result[key] = value;
}
} else if (type === 'function') {
const prev = result[key];
if (prev == null) {
result[key] = value;
} else {
result[key] = composeEventHandler(prev, value);
}
} else if (type === 'object') {
result[key] = Object.assign({}, result[key], value);
}
// else `type` is 'bigint' or 'symbol', `value` is an invalid cellProp, ignore it
}
return result;
}