isStandardSyntaxSelector.mjs 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import hasInterpolation from './hasInterpolation.mjs';
  2. /**
  3. * Check whether a selector is standard
  4. *
  5. * @param {string} selector
  6. * @returns {boolean}
  7. */
  8. export default function isStandardSyntaxSelector(selector) {
  9. // SCSS or Less interpolation
  10. if (hasInterpolation(selector)) {
  11. return false;
  12. }
  13. // SCSS placeholder selectors
  14. if (selector.startsWith('%')) {
  15. return false;
  16. }
  17. // SCSS nested properties
  18. if (selector.endsWith(':')) {
  19. return false;
  20. }
  21. // Less :extend()
  22. if (/:extend(?:\(.*?\))?/.test(selector)) {
  23. return false;
  24. }
  25. // Less mixin with resolved nested selectors (e.g. .foo().bar or .foo(@a, @b)[bar])
  26. if (/\.[\w-]+\(.*\).+/.test(selector)) {
  27. return false;
  28. }
  29. // Less non-outputting mixin definition (e.g. .mixin() {})
  30. if (selector.endsWith(')') && !selector.includes(':')) {
  31. return false;
  32. }
  33. // Less Parametric mixins (e.g. .mixin(@variable: x) {})
  34. if (/\(@.*\)$/.test(selector)) {
  35. return false;
  36. }
  37. // ERB template tags
  38. if (selector.includes('<%') || selector.includes('%>')) {
  39. return false;
  40. }
  41. // SCSS and Less comments
  42. if (selector.includes('//')) {
  43. return false;
  44. }
  45. return true;
  46. }