index.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. 'use strict';
  2. exports.__esModule = true;
  3. var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; };
  4. var _has = require('has');
  5. var _has2 = _interopRequireDefault(_has);
  6. var _postcss = require('postcss');
  7. var _postcssValueParser = require('postcss-value-parser');
  8. var _postcssValueParser2 = _interopRequireDefault(_postcssValueParser);
  9. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  10. function canonical(obj) {
  11. return function recurse(key) {
  12. if ((0, _has2.default)(obj, key) && obj[key] !== key) {
  13. return recurse(obj[key]);
  14. }
  15. return key;
  16. };
  17. }
  18. function sameParent(ruleA, ruleB) {
  19. var hasParent = ruleA.parent && ruleB.parent;
  20. var sameType = hasParent && ruleA.parent.type === ruleB.parent.type;
  21. // If an at rule, ensure that the parameters are the same
  22. if (hasParent && ruleA.parent.type !== 'root' && ruleB.parent.type !== 'root') {
  23. sameType = sameType && ruleA.parent.params === ruleB.parent.params && ruleA.parent.name === ruleB.parent.name;
  24. }
  25. return hasParent ? sameType : true;
  26. }
  27. function mergeAtRules(css, pairs) {
  28. pairs.forEach(function (pair) {
  29. pair.cache = [];
  30. pair.replacements = [];
  31. pair.decls = [];
  32. });
  33. var relevant = void 0;
  34. css.walk(function (node) {
  35. if (node.type === 'atrule') {
  36. relevant = pairs.filter(function (pair) {
  37. return pair.atrule.test(node.name);
  38. })[0];
  39. if (!relevant) {
  40. return;
  41. }
  42. if (relevant.cache.length < 1) {
  43. relevant.cache.push(node);
  44. return;
  45. } else {
  46. var _ret = function () {
  47. var toString = node.nodes.toString();
  48. relevant.cache.forEach(function (cached) {
  49. if (cached.name === node.name && sameParent(cached, node) && cached.nodes.toString() === toString) {
  50. cached.remove();
  51. relevant.replacements[cached.params] = node.params;
  52. }
  53. });
  54. relevant.cache.push(node);
  55. return {
  56. v: void 0
  57. };
  58. }();
  59. if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === "object") return _ret.v;
  60. }
  61. }
  62. if (node.type === 'decl') {
  63. relevant = pairs.filter(function (pair) {
  64. return pair.decl.test(node.prop);
  65. })[0];
  66. if (!relevant) {
  67. return;
  68. }
  69. relevant.decls.push(node);
  70. }
  71. });
  72. pairs.forEach(function (pair) {
  73. var canon = canonical(pair.replacements);
  74. pair.decls.forEach(function (decl) {
  75. decl.value = (0, _postcssValueParser2.default)(decl.value).walk(function (node) {
  76. if (node.type === 'word') {
  77. node.value = canon(node.value);
  78. }
  79. if (node.type === 'space') {
  80. node.value = ' ';
  81. }
  82. if (node.type === 'div') {
  83. node.before = node.after = '';
  84. }
  85. }).toString();
  86. });
  87. });
  88. }
  89. exports.default = (0, _postcss.plugin)('postcss-merge-idents', function () {
  90. return function (css) {
  91. mergeAtRules(css, [{
  92. atrule: /keyframes/,
  93. decl: /animation/
  94. }, {
  95. atrule: /counter-style/,
  96. decl: /(list-style|system)/
  97. }]);
  98. };
  99. });
  100. module.exports = exports['default'];