252 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			252 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| "use strict";
 | |
| 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 __spreadArray = (this && this.__spreadArray) || function (to, from) {
 | |
|     for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
 | |
|         to[j] = from[i];
 | |
|     return to;
 | |
| };
 | |
| 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, __spreadArray([firstConfiguration], __read(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 __spreadArray(__spreadArray([], __read(b)), __read(a));
 | |
|                 case types_1.CustomizeRule.Replace:
 | |
|                     return b;
 | |
|                 case types_1.CustomizeRule.Append:
 | |
|                 default:
 | |
|                     return __spreadArray(__spreadArray([], __read(a)), __read(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) { return utils_1.isSameCondition(ao[rule], o[rule]); });
 | |
|             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");
 | |
|                     }
 | |
|                     // deep merge
 | |
|                     ret[k] = merge(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) ? __spreadArray(__spreadArray([], __read(acc)), __read(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
 |