| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- /**
- * @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 };
|