unite-rules.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. 'use strict';
  2. 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"); } }; }();
  3. 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); } }
  4. var isEqual = require('lodash.isequal');
  5. var mergeWith = require('lodash.mergewith');
  6. var unionWith = require('lodash.unionwith');
  7. var differenceWith = require('lodash.differencewith');
  8. var isArray = Array.isArray;
  9. module.exports = function uniteRules(newRule, rule, prepend) {
  10. if (String(rule.test) !== String(newRule.test) || newRule.enforce && rule.enforce !== newRule.enforce || newRule.include && !isSameValue(rule.include, newRule.include) || newRule.exclude && !isSameValue(rule.exclude, newRule.exclude)) {
  11. return false;
  12. }
  13. // webpack 2 nested rules support
  14. if (rule.rules) {
  15. rule.rules = prepend ? [].concat(_toConsumableArray(differenceWith(newRule.rules, rule.rules, function (b, a) {
  16. return uniteRules(b, a, true);
  17. })), _toConsumableArray(rule.rules)) : unionWith(rule.rules, newRule.rules, uniteRules);
  18. }
  19. // newRule.loader should always override
  20. if (newRule.loader) {
  21. var optionsKey = newRule.options ? 'options' : newRule.query && 'query';
  22. delete rule.use;
  23. delete rule.loaders;
  24. rule.loader = newRule.loader;
  25. if (optionsKey) {
  26. rule[optionsKey] = newRule[optionsKey];
  27. }
  28. } else if ((rule.use || rule.loaders || rule.loader) && (newRule.use || newRule.loaders)) {
  29. var expandEntry = function expandEntry(loader) {
  30. return typeof loader === 'string' ? { loader: loader } : loader;
  31. };
  32. // this is only here to avoid breaking existing tests
  33. var unwrapEntry = function unwrapEntry(entry) {
  34. return !entry.options && !entry.query ? entry.loader : entry;
  35. };
  36. var entries = void 0;
  37. if (rule.loader) {
  38. var _optionsKey = rule.options ? 'options' : rule.query && 'query';
  39. entries = [{ loader: rule.loader }];
  40. if (_optionsKey) {
  41. entries[0][_optionsKey] = rule[_optionsKey];
  42. }
  43. delete rule.loader;
  44. if (_optionsKey) {
  45. delete rule[_optionsKey];
  46. }
  47. } else {
  48. entries = [].concat(rule.use || rule.loaders).map(expandEntry);
  49. }
  50. var newEntries = [].concat(newRule.use || newRule.loaders).map(expandEntry);
  51. var loadersKey = rule.use || newRule.use ? 'use' : 'loaders';
  52. rule[loadersKey] = prepend ? [].concat(_toConsumableArray(differenceWith(newEntries, entries, uniteEntries)), _toConsumableArray(entries)).map(unwrapEntry) : unionWith(entries, newEntries, uniteEntries).map(unwrapEntry);
  53. }
  54. if (newRule.include) {
  55. rule.include = newRule.include;
  56. }
  57. if (newRule.exclude) {
  58. rule.exclude = newRule.exclude;
  59. }
  60. return true;
  61. };
  62. /**
  63. * Check equality of two values using lodash's isEqual
  64. * Arrays need to be sorted for equality checking
  65. * but clone them first so as not to disrupt the sort order in tests
  66. */
  67. function isSameValue(a, b) {
  68. var _map = [a, b].map(function (value) {
  69. return isArray(value) ? [].concat(_toConsumableArray(value)).sort() : value;
  70. }),
  71. _map2 = _slicedToArray(_map, 2),
  72. propA = _map2[0],
  73. propB = _map2[1];
  74. return isEqual(propA, propB);
  75. }
  76. function uniteEntries(newEntry, entry) {
  77. var loaderNameRe = /^([^?]+)/ig;
  78. var _entry$loader$match = entry.loader.match(loaderNameRe),
  79. _entry$loader$match2 = _slicedToArray(_entry$loader$match, 1),
  80. loaderName = _entry$loader$match2[0];
  81. var _newEntry$loader$matc = newEntry.loader.match(loaderNameRe),
  82. _newEntry$loader$matc2 = _slicedToArray(_newEntry$loader$matc, 1),
  83. newLoaderName = _newEntry$loader$matc2[0];
  84. if (loaderName !== newLoaderName) {
  85. return false;
  86. }
  87. // Replace query values with newer ones
  88. mergeWith(entry, newEntry);
  89. return true;
  90. }