import { isPlainObject } from "./isPlainObject.js"; /** * Merge the contents of two or more objects together into the first object. * If passing "true" for first argument, the merge becomes recursive (aka. deep copy). * @param {...any} args * @returns {Object} */ export const extend = (...args) => { let deep = false; if (typeof args[0] == "boolean") { deep = args.shift(); } let result = args[0]; if (!result || typeof result !== "object") { throw new Error("extendee must be an object"); } const extenders = args.slice(1); const len = extenders.length; for (let i = 0; i < len; i++) { const extender = extenders[i]; for (let key in extender) { if (extender.hasOwnProperty(key)) { const value = extender[key]; if (deep && (Array.isArray(value) || isPlainObject(value))) { const base = Array.isArray(value) ? [] : {}; result[key] = extend(true, result.hasOwnProperty(key) ? result[key] : base, value); } else { result[key] = value; } } } } return result; };