index.js 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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. isFileInArray(root.source.input.file, ignoreFiles)
  13. ) {
  14. return;
  15. }
  16. if (
  17. includeFiles.length &&
  18. root.source.input.file &&
  19. !isFileInArray(root.source.input.file, includeFiles)
  20. ) {
  21. return;
  22. }
  23. root.walkRules((rule) => {
  24. const keyframeRules = [
  25. 'keyframes',
  26. '-webkit-keyframes',
  27. '-moz-keyframes',
  28. '-o-keyframes',
  29. '-ms-keyframes',
  30. ];
  31. if (rule.parent && keyframeRules.includes(rule.parent.name)) {
  32. return;
  33. }
  34. rule.selectors = rule.selectors.map((selector) => {
  35. if (options.exclude && excludeSelector(selector, options.exclude)) {
  36. return selector;
  37. }
  38. if (options.transform) {
  39. return options.transform(
  40. prefix,
  41. selector,
  42. prefixWithSpace + selector,
  43. root.source.input.file,
  44. rule
  45. );
  46. }
  47. return prefixWithSpace + selector;
  48. });
  49. });
  50. };
  51. };
  52. function isFileInArray(file, arr) {
  53. return arr.some((ruleOrString) => {
  54. if (ruleOrString instanceof RegExp) {
  55. return ruleOrString.test(file);
  56. }
  57. return file.includes(ruleOrString);
  58. });
  59. }
  60. function excludeSelector(selector, excludeArr) {
  61. return excludeArr.some((excludeRule) => {
  62. if (excludeRule instanceof RegExp) {
  63. return excludeRule.test(selector);
  64. }
  65. return selector === excludeRule;
  66. });
  67. }