"use strict"; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var __read = (this && this.__read) || function (o, n) { var m = typeof Symbol === "function" && o[Symbol.iterator]; if (!m) return o; var i = m.call(o), r, ar = [], e; try { while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); } catch (error) { e = { error: error }; } finally { try { if (r && !r.done && (m = i["return"])) m.call(i); } finally { if (e) throw e.error; } } return ar; }; var __spread = (this && this.__spread) || function () { for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i])); return ar; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; exports.__esModule = true; exports.unique = exports.mergeWithRules = exports.mergeWithCustomize = exports["default"] = exports.merge = exports.CustomizeRule = exports.customizeObject = exports.customizeArray = void 0; var wildcard_1 = __importDefault(require("wildcard")); var merge_with_1 = __importDefault(require("./merge-with")); var join_arrays_1 = __importDefault(require("./join-arrays")); var unique_1 = __importDefault(require("./unique")); exports.unique = unique_1["default"]; var types_1 = require("./types"); exports.CustomizeRule = types_1.CustomizeRule; var utils_1 = require("./utils"); function merge(firstConfiguration) { var configurations = []; for (var _i = 1; _i < arguments.length; _i++) { configurations[_i - 1] = arguments[_i]; } return mergeWithCustomize({}).apply(void 0, __spread([firstConfiguration], configurations)); } exports.merge = merge; exports["default"] = merge; function mergeWithCustomize(options) { return function mergeWithOptions(firstConfiguration) { var configurations = []; for (var _i = 1; _i < arguments.length; _i++) { configurations[_i - 1] = arguments[_i]; } if (utils_1.isUndefined(firstConfiguration) || configurations.some(utils_1.isUndefined)) { throw new TypeError("Merging undefined is not supported"); } // @ts-ignore if (firstConfiguration.then) { throw new TypeError("Promises are not supported"); } // No configuration at all if (!firstConfiguration) { return {}; } if (configurations.length === 0) { if (Array.isArray(firstConfiguration)) { // Empty array if (firstConfiguration.length === 0) { return {}; } if (firstConfiguration.some(utils_1.isUndefined)) { throw new TypeError("Merging undefined is not supported"); } // @ts-ignore if (firstConfiguration[0].then) { throw new TypeError("Promises are not supported"); } return merge_with_1["default"](firstConfiguration, join_arrays_1["default"](options)); } return firstConfiguration; } return merge_with_1["default"]([firstConfiguration].concat(configurations), join_arrays_1["default"](options)); }; } exports.mergeWithCustomize = mergeWithCustomize; function customizeArray(rules) { return function (a, b, key) { var matchedRule = Object.keys(rules).find(function (rule) { return wildcard_1["default"](rule, key); }) || ""; if (matchedRule) { switch (rules[matchedRule]) { case types_1.CustomizeRule.Prepend: return __spread(b, a); case types_1.CustomizeRule.Replace: return b; case types_1.CustomizeRule.Append: default: return __spread(a, b); } } }; } exports.customizeArray = customizeArray; function mergeWithRules(rules) { return mergeWithCustomize({ customizeArray: function (a, b, key) { var currentRule = rules; key.split(".").forEach(function (k) { if (!currentRule) { return; } currentRule = currentRule[k]; }); if (utils_1.isPlainObject(currentRule)) { return mergeWithRule({ currentRule: currentRule, a: a, b: b }); } if (typeof currentRule === "string") { return mergeIndividualRule({ currentRule: currentRule, a: a, b: b }); } return undefined; } }); } exports.mergeWithRules = mergeWithRules; var isArray = Array.isArray; function mergeWithRule(_a) { var currentRule = _a.currentRule, a = _a.a, b = _a.b; if (!isArray(a)) { return a; } var bAllMatches = []; var ret = a.map(function (ao) { if (!utils_1.isPlainObject(currentRule)) { return ao; } var ret = {}; var rulesToMatch = []; var operations = {}; Object.entries(currentRule).forEach(function (_a) { var _b = __read(_a, 2), k = _b[0], v = _b[1]; if (v === types_1.CustomizeRule.Match) { rulesToMatch.push(k); } else { operations[k] = v; } }); var bMatches = b.filter(function (o) { var matches = rulesToMatch.every(function (rule) { var _a, _b; return ((_a = ao[rule]) === null || _a === void 0 ? void 0 : _a.toString()) === ((_b = o[rule]) === null || _b === void 0 ? void 0 : _b.toString()); }); if (matches) { bAllMatches.push(o); } return matches; }); if (!utils_1.isPlainObject(ao)) { return ao; } Object.entries(ao).forEach(function (_a) { var _b = __read(_a, 2), k = _b[0], v = _b[1]; var rule = currentRule; switch (currentRule[k]) { case types_1.CustomizeRule.Match: ret[k] = v; Object.entries(rule).forEach(function (_a) { var _b = __read(_a, 2), k = _b[0], v = _b[1]; if (v === types_1.CustomizeRule.Replace && bMatches.length > 0) { var val = last(bMatches)[k]; if (typeof val !== "undefined") { ret[k] = val; } } }); break; case types_1.CustomizeRule.Append: if (!bMatches.length) { ret[k] = v; break; } var appendValue = last(bMatches)[k]; if (!isArray(v) || !isArray(appendValue)) { throw new TypeError("Trying to append non-arrays"); } ret[k] = v.concat(appendValue); break; case types_1.CustomizeRule.Merge: if (!bMatches.length) { ret[k] = v; break; } var lastValue = last(bMatches)[k]; if (!utils_1.isPlainObject(v) || !utils_1.isPlainObject(lastValue)) { throw new TypeError("Trying to merge non-objects"); } // @ts-ignore: These should be objects now ret[k] = __assign(__assign({}, v), lastValue); break; case types_1.CustomizeRule.Prepend: if (!bMatches.length) { ret[k] = v; break; } var prependValue = last(bMatches)[k]; if (!isArray(v) || !isArray(prependValue)) { throw new TypeError("Trying to prepend non-arrays"); } ret[k] = prependValue.concat(v); break; case types_1.CustomizeRule.Replace: ret[k] = bMatches.length > 0 ? last(bMatches)[k] : v; break; default: var currentRule_1 = operations[k]; // Use .flat(); starting from Node 12 var b_1 = bMatches .map(function (o) { return o[k]; }) .reduce(function (acc, val) { return isArray(acc) && isArray(val) ? __spread(acc, val) : acc; }, []); ret[k] = mergeWithRule({ currentRule: currentRule_1, a: v, b: b_1 }); break; } }); return ret; }); return ret.concat(b.filter(function (o) { return !bAllMatches.includes(o); })); } function mergeIndividualRule(_a) { var currentRule = _a.currentRule, a = _a.a, b = _a.b; // What if there's no match? switch (currentRule) { case types_1.CustomizeRule.Append: return a.concat(b); case types_1.CustomizeRule.Prepend: return b.concat(a); case types_1.CustomizeRule.Replace: return b; } return a; } function last(arr) { return arr[arr.length - 1]; } function customizeObject(rules) { return function (a, b, key) { switch (rules[key]) { case types_1.CustomizeRule.Prepend: return merge_with_1["default"]([b, a], join_arrays_1["default"]()); case types_1.CustomizeRule.Replace: return b; case types_1.CustomizeRule.Append: return merge_with_1["default"]([a, b], join_arrays_1["default"]()); } }; } exports.customizeObject = customizeObject; //# sourceMappingURL=index.js.map