index.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. 'use strict';
  2. exports.__esModule = true;
  3. var _postcss = require('postcss');
  4. function noop() {}
  5. function trimValue(value) {
  6. return value ? value.trim() : value;
  7. }
  8. function empty(node) {
  9. return !node.nodes.filter(function (child) {
  10. return child.type !== 'comment';
  11. }).length;
  12. }
  13. function equals(a, b) {
  14. if (a.type !== b.type) {
  15. return false;
  16. }
  17. if (a.important !== b.important) {
  18. return false;
  19. }
  20. if (a.raws && !b.raws || !a.raws && b.raws) {
  21. return false;
  22. }
  23. switch (a.type) {
  24. case 'rule':
  25. if (a.selector !== b.selector) {
  26. return false;
  27. }
  28. break;
  29. case 'atrule':
  30. if (a.name !== b.name || a.params !== b.params) {
  31. return false;
  32. }
  33. if (a.raws && trimValue(a.raws.before) !== trimValue(b.raws.before)) {
  34. return false;
  35. }
  36. if (a.raws && trimValue(a.raws.afterName) !== trimValue(b.raws.afterName)) {
  37. return false;
  38. }
  39. break;
  40. case 'decl':
  41. if (a.prop !== b.prop || a.value !== b.value) {
  42. return false;
  43. }
  44. if (a.raws && trimValue(a.raws.before) !== trimValue(b.raws.before)) {
  45. return false;
  46. }
  47. break;
  48. }
  49. if (a.nodes) {
  50. if (a.nodes.length !== b.nodes.length) {
  51. return false;
  52. }
  53. for (var i = 0; i < a.nodes.length; i++) {
  54. if (!equals(a.nodes[i], b.nodes[i])) {
  55. return false;
  56. }
  57. }
  58. }
  59. return true;
  60. }
  61. function dedupeRule(last, nodes) {
  62. var index = nodes.indexOf(last) - 1;
  63. var _loop = function _loop() {
  64. var node = nodes[index--];
  65. if (node && node.type === 'rule' && node.selector === last.selector) {
  66. last.each(function (child) {
  67. if (child.type === 'decl') {
  68. dedupeNode(child, node.nodes);
  69. }
  70. });
  71. if (empty(node)) {
  72. node.remove();
  73. }
  74. }
  75. };
  76. while (index >= 0) {
  77. _loop();
  78. }
  79. }
  80. function dedupeNode(last, nodes) {
  81. var index = !!~nodes.indexOf(last) ? nodes.indexOf(last) - 1 : nodes.length - 1;
  82. while (index >= 0) {
  83. var _node = nodes[index--];
  84. if (_node && equals(_node, last)) {
  85. _node.remove();
  86. }
  87. }
  88. }
  89. var handlers = {
  90. rule: dedupeRule,
  91. atrule: dedupeNode,
  92. decl: dedupeNode,
  93. comment: noop
  94. };
  95. function dedupe(root) {
  96. var nodes = root.nodes;
  97. if (!nodes) {
  98. return;
  99. }
  100. var index = nodes.length - 1;
  101. while (index >= 0) {
  102. var last = nodes[index--];
  103. if (!last || !last.parent) {
  104. continue;
  105. }
  106. dedupe(last);
  107. handlers[last.type](last, nodes);
  108. }
  109. }
  110. exports.default = (0, _postcss.plugin)('postcss-discard-duplicates', function () {
  111. return dedupe;
  112. });
  113. module.exports = exports['default'];