join-arrays-smart.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. 'use strict';
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.uniteEntries = exports.uniteRules = undefined;
  6. var _differenceWith2 = require('lodash/differenceWith');
  7. var _differenceWith3 = _interopRequireDefault(_differenceWith2);
  8. var _unionWith2 = require('lodash/unionWith');
  9. var _unionWith3 = _interopRequireDefault(_unionWith2);
  10. var _mergeWith2 = require('lodash/mergeWith');
  11. var _mergeWith3 = _interopRequireDefault(_mergeWith2);
  12. var _isEqual2 = require('lodash/isEqual');
  13. var _isEqual3 = _interopRequireDefault(_isEqual2);
  14. var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
  15. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  16. function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
  17. var isArray = Array.isArray;
  18. function uniteRules(rules, key, newRule, rule) {
  19. if (String(rule.test) !== String(newRule.test) || (newRule.enforce || rule.enforce) && rule.enforce !== newRule.enforce || newRule.include && !isSameValue(rule.include, newRule.include) || newRule.exclude && !isSameValue(rule.exclude, newRule.exclude)) {
  20. return false;
  21. } else if (!rule.test && !rule.include && !rule.exclude && (rule.loader && rule.loader.split('?')[0]) !== (newRule.loader && newRule.loader.split('?')[0])) {
  22. // Don't merge the rule if there isn't any identifying fields and the loaders don't match
  23. return false;
  24. }
  25. // newRule.loader should always override
  26. if (newRule.loader) {
  27. var optionsKey = newRule.options ? 'options' : newRule.query && 'query';
  28. delete rule.use;
  29. delete rule.loaders;
  30. rule.loader = newRule.loader;
  31. if (optionsKey) {
  32. rule[optionsKey] = newRule[optionsKey];
  33. }
  34. } else if ((rule.use || rule.loaders || rule.loader) && (newRule.use || newRule.loaders)) {
  35. var expandEntry = function expandEntry(loader) {
  36. return typeof loader === 'string' ? { loader: loader } : loader;
  37. };
  38. // this is only here to avoid breaking existing tests
  39. var unwrapEntry = function unwrapEntry(entry) {
  40. return !entry.options && !entry.query ? entry.loader : entry;
  41. };
  42. var entries = void 0;
  43. if (rule.loader) {
  44. var _optionsKey = rule.options ? 'options' : rule.query && 'query';
  45. entries = [{ loader: rule.loader }];
  46. if (_optionsKey) {
  47. entries[0][_optionsKey] = rule[_optionsKey];
  48. }
  49. delete rule.loader;
  50. if (_optionsKey) {
  51. delete rule[_optionsKey];
  52. }
  53. } else {
  54. entries = [].concat(rule.use || rule.loaders).map(expandEntry);
  55. }
  56. var newEntries = [].concat(newRule.use || newRule.loaders).map(expandEntry);
  57. var loadersKey = rule.use || newRule.use ? 'use' : 'loaders';
  58. var resolvedKey = key + '.' + loadersKey;
  59. switch (rules[resolvedKey]) {
  60. case 'prepend':
  61. rule[loadersKey] = [].concat(_toConsumableArray((0, _differenceWith3.default)(newEntries, entries, uniteEntries)), _toConsumableArray(entries)).map(unwrapEntry);
  62. break;
  63. case 'replace':
  64. rule[loadersKey] = newRule.use || newRule.loaders;
  65. break;
  66. default:
  67. rule[loadersKey] = (0, _unionWith3.default)(entries, newEntries, uniteEntries).map(unwrapEntry);
  68. }
  69. }
  70. if (newRule.include) {
  71. rule.include = newRule.include;
  72. }
  73. if (newRule.exclude) {
  74. rule.exclude = newRule.exclude;
  75. }
  76. return true;
  77. }
  78. /**
  79. * Check equality of two values using lodash's isEqual
  80. * Arrays need to be sorted for equality checking
  81. * but clone them first so as not to disrupt the sort order in tests
  82. */
  83. function isSameValue(a, b) {
  84. var _map = [a, b].map(function (value) {
  85. return isArray(value) ? [].concat(_toConsumableArray(value)).sort() : value;
  86. }),
  87. _map2 = _slicedToArray(_map, 2),
  88. propA = _map2[0],
  89. propB = _map2[1];
  90. return (0, _isEqual3.default)(propA, propB);
  91. }
  92. function uniteEntries(newEntry, entry) {
  93. var loaderNameRe = /^([^?]+)/ig;
  94. var _entry$loader$match = entry.loader.match(loaderNameRe),
  95. _entry$loader$match2 = _slicedToArray(_entry$loader$match, 1),
  96. loaderName = _entry$loader$match2[0];
  97. var _newEntry$loader$matc = newEntry.loader.match(loaderNameRe),
  98. _newEntry$loader$matc2 = _slicedToArray(_newEntry$loader$matc, 1),
  99. newLoaderName = _newEntry$loader$matc2[0];
  100. if (loaderName !== newLoaderName) {
  101. return false;
  102. }
  103. // Replace query values with newer ones
  104. (0, _mergeWith3.default)(entry, newEntry);
  105. return true;
  106. }
  107. exports.uniteRules = uniteRules;
  108. exports.uniteEntries = uniteEntries;