index.js 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. module.exports = function postcssPrefixSelector(options) {
  2. const prefix = options.prefix;
  3. const prefixWithSpace = /\s+$/.test(prefix) ? prefix : `${prefix} `;
  4. const ignoreFiles = options.ignoreFiles ? [].concat(options.ignoreFiles) : [];
  5. const includeFiles = options.includeFiles
  6. ? [].concat(options.includeFiles)
  7. : [];
  8. return function (root) {
  9. if (
  10. ignoreFiles.length &&
  11. root.source.input.file &&
  12. ignoreFiles.some((file) => root.source.input.file.includes(file))
  13. ) {
  14. return;
  15. }
  16. if (
  17. includeFiles.length &&
  18. root.source.input.file &&
  19. !includeFiles.find((file) => root.source.input.file.includes(file))
  20. ) {
  21. return;
  22. }
  23. root.walkRules((rule) => {
  24. const keyframeRules = [
  25. 'keyframes',
  26. '-webkit-keyframes',
  27. '-moz-keyframes',
  28. '-o-keyframes',
  29. ];
  30. if (rule.parent && keyframeRules.includes(rule.parent.name)) {
  31. return;
  32. }
  33. rule.selectors = rule.selectors.map((selector) => {
  34. if (options.exclude && excludeSelector(selector, options.exclude)) {
  35. return selector;
  36. }
  37. if (options.transform) {
  38. return options.transform(
  39. prefix,
  40. selector,
  41. prefixWithSpace + selector
  42. );
  43. }
  44. return prefixWithSpace + selector;
  45. });
  46. });
  47. };
  48. };
  49. function excludeSelector(selector, excludeArr) {
  50. return excludeArr.some((excludeRule) => {
  51. if (excludeRule instanceof RegExp) {
  52. return excludeRule.test(selector);
  53. }
  54. return selector === excludeRule;
  55. });
  56. }