extend2
Version:
Port of jQuery.extend for Node.js
70 lines • 5.57 kB
JavaScript
const hasOwn = Object.prototype.hasOwnProperty;
const toStr = Object.prototype.toString;
function isPlainObject(obj) {
if (!obj || toStr.call(obj) !== '[object Object]') {
return false;
}
const hasOwnConstructor = hasOwn.call(obj, 'constructor');
const hasIsPrototypeOf = obj.constructor && obj.constructor.prototype && hasOwn.call(obj.constructor.prototype, 'isPrototypeOf');
// Not own constructor property must be Object
if (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) {
return false;
}
// Own properties are enumerated firstly, so to speed up,
// if last one is own, then all properties are own.
let key;
for (key in obj) {
/**/
}
return typeof key === 'undefined' || hasOwn.call(obj, key);
}
export function extend(deepOrTarget, ...objects) {
// extend(deep, target, obj1, obj2, ...)
// extend(target, obj1, obj2, ...)
let target = deepOrTarget;
let i = 0;
const length = objects.length;
let deep = false;
// Handle a deep copy situation
if (typeof target === 'boolean') {
// extend(deep, target, obj1, obj2, ...)
deep = target;
target = objects[0] || {};
// skip the boolean and the target
i = 1;
}
else if ((typeof target !== 'object' && typeof target !== 'function') || target == null) {
// extend(null, obj1, obj2, ...)
target = {};
}
for (; i < length; ++i) {
const options = objects[i];
// Only deal with non-null/undefined values
if (options === null || options === undefined)
continue;
// Extend the base object
for (const name in options) {
if (name === '__proto__')
continue;
const src = target[name];
const copy = options[name];
// Prevent never-ending loop
if (target === copy)
continue;
// Recurse if we're merging plain objects
if (deep && copy && isPlainObject(copy)) {
const clone = src && isPlainObject(src) ? src : {};
// Never move original objects, clone them
target[name] = extend(deep, clone, copy);
// Don't bring in undefined values
}
else if (typeof copy !== 'undefined') {
target[name] = copy;
}
}
}
// Return the modified object
return target;
}
export default extend;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUM7QUFDL0MsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUM7QUFFeEMsU0FBUyxhQUFhLENBQUMsR0FBWTtJQUNqQyxJQUFJLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssaUJBQWlCLEVBQUUsQ0FBQztRQUNsRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxNQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQzFELE1BQU0sZ0JBQWdCLEdBQUcsR0FBRyxDQUFDLFdBQVcsSUFBSSxHQUFHLENBQUMsV0FBVyxDQUFDLFNBQVMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ2pJLDhDQUE4QztJQUM5QyxJQUFJLEdBQUcsQ0FBQyxXQUFXLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDL0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQseURBQXlEO0lBQ3pELG1EQUFtRDtJQUNuRCxJQUFJLEdBQXVCLENBQUM7SUFDNUIsS0FBSyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFDaEIsSUFBSTtJQUNOLENBQUM7SUFFRCxPQUFPLE9BQU8sR0FBRyxLQUFLLFdBQVcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUM3RCxDQUFDO0FBRUQsTUFBTSxVQUFVLE1BQU0sQ0FBMEIsWUFBc0IsRUFBRSxHQUFHLE9BQWtCO0lBQzNGLHdDQUF3QztJQUN4QyxrQ0FBa0M7SUFDbEMsSUFBSSxNQUFNLEdBQUcsWUFBbUIsQ0FBQztJQUNqQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDVixNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO0lBQzlCLElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQztJQUVqQiwrQkFBK0I7SUFDL0IsSUFBSSxPQUFPLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNoQyx3Q0FBd0M7UUFDeEMsSUFBSSxHQUFHLE1BQU0sQ0FBQztRQUNkLE1BQU0sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzFCLGtDQUFrQztRQUNsQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztTQUFNLElBQUksQ0FBQyxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksT0FBTyxNQUFNLEtBQUssVUFBVSxDQUFDLElBQUksTUFBTSxJQUFJLElBQUksRUFBRSxDQUFDO1FBQzFGLGdDQUFnQztRQUNoQyxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVELE9BQU8sQ0FBQyxHQUFHLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQVEsQ0FBQztRQUNsQywyQ0FBMkM7UUFDM0MsSUFBSSxPQUFPLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxTQUFTO1lBQUUsU0FBUztRQUV4RCx5QkFBeUI7UUFDekIsS0FBSyxNQUFNLElBQUksSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUMzQixJQUFJLElBQUksS0FBSyxXQUFXO2dCQUFFLFNBQVM7WUFFbkMsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pCLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUUzQiw0QkFBNEI7WUFDNUIsSUFBSSxNQUFNLEtBQUssSUFBSTtnQkFBRSxTQUFTO1lBRTlCLHlDQUF5QztZQUN6QyxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ3hDLE1BQU0sS0FBSyxHQUFHLEdBQUcsSUFBSSxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNuRCwwQ0FBMEM7Z0JBQzFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFFM0Msa0NBQWtDO1lBQ2xDLENBQUM7aUJBQU0sSUFBSSxPQUFPLElBQUksS0FBSyxXQUFXLEVBQUUsQ0FBQztnQkFDdkMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQztZQUN0QixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCw2QkFBNkI7SUFDN0IsT0FBTyxNQUFXLENBQUM7QUFDckIsQ0FBQztBQUVELGVBQWUsTUFBTSxDQUFDIn0=