61 lines
1.6 KiB
JavaScript
61 lines
1.6 KiB
JavaScript
|
/**
|
||
|
* @fileoverview Applies default rule options
|
||
|
* @author JoshuaKGoldberg
|
||
|
*/
|
||
|
|
||
|
"use strict";
|
||
|
|
||
|
/**
|
||
|
* Check if the variable contains an object strictly rejecting arrays
|
||
|
* @param {unknown} value an object
|
||
|
* @returns {boolean} Whether value is an object
|
||
|
*/
|
||
|
function isObjectNotArray(value) {
|
||
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Deeply merges second on top of first, creating a new {} object if needed.
|
||
|
* @param {T} first Base, default value.
|
||
|
* @param {U} second User-specified value.
|
||
|
* @returns {T | U | (T & U)} Merged equivalent of second on top of first.
|
||
|
*/
|
||
|
function deepMergeObjects(first, second) {
|
||
|
if (second === void 0) {
|
||
|
return first;
|
||
|
}
|
||
|
|
||
|
if (!isObjectNotArray(first) || !isObjectNotArray(second)) {
|
||
|
return second;
|
||
|
}
|
||
|
|
||
|
const result = { ...first, ...second };
|
||
|
|
||
|
for (const key of Object.keys(second)) {
|
||
|
if (Object.prototype.propertyIsEnumerable.call(first, key)) {
|
||
|
result[key] = deepMergeObjects(first[key], second[key]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Deeply merges second on top of first, creating a new [] array if needed.
|
||
|
* @param {T[]} first Base, default values.
|
||
|
* @param {U[]} second User-specified values.
|
||
|
* @returns {(T | U | (T & U))[]} Merged equivalent of second on top of first.
|
||
|
*/
|
||
|
function deepMergeArrays(first, second) {
|
||
|
if (!first || !second) {
|
||
|
return second || first || [];
|
||
|
}
|
||
|
|
||
|
return [
|
||
|
...first.map((value, i) => deepMergeObjects(value, i < second.length ? second[i] : void 0)),
|
||
|
...second.slice(first.length)
|
||
|
];
|
||
|
}
|
||
|
|
||
|
module.exports = { deepMergeArrays };
|