index.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = void 0;
  6. const OVERRIDABLE_RULES = ['keyframes', 'counter-style'];
  7. const SCOPE_RULES = ['media', 'supports'];
  8. function vendorUnprefixed(prop) {
  9. return prop.replace(/^-\w+-/, '');
  10. }
  11. function isOverridable(name) {
  12. return ~OVERRIDABLE_RULES.indexOf(vendorUnprefixed(name.toLowerCase()));
  13. }
  14. function isScope(name) {
  15. return ~SCOPE_RULES.indexOf(vendorUnprefixed(name.toLowerCase()));
  16. }
  17. function getScope(node) {
  18. let current = node.parent;
  19. const chain = [node.name.toLowerCase(), node.params];
  20. do {
  21. if (current.type === 'atrule' && isScope(current.name)) {
  22. chain.unshift(current.name + ' ' + current.params);
  23. }
  24. current = current.parent;
  25. } while (current);
  26. return chain.join('|');
  27. }
  28. function pluginCreator() {
  29. return {
  30. postcssPlugin: 'postcss-discard-overridden',
  31. prepare() {
  32. const cache = new Map();
  33. const rules = [];
  34. return {
  35. OnceExit(css) {
  36. css.walkAtRules(node => {
  37. if (isOverridable(node.name)) {
  38. const scope = getScope(node);
  39. cache.set(scope, node);
  40. rules.push({
  41. node,
  42. scope
  43. });
  44. }
  45. });
  46. rules.forEach(rule => {
  47. if (cache.get(rule.scope) !== rule.node) {
  48. rule.node.remove();
  49. }
  50. });
  51. }
  52. };
  53. }
  54. };
  55. }
  56. pluginCreator.postcss = true;
  57. var _default = pluginCreator;
  58. exports.default = _default;
  59. module.exports = exports.default;