getStrippedSelectorSource.mjs 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import selectorParser from 'postcss-selector-parser';
  2. const { isComment } = selectorParser;
  3. /**
  4. * Get the source of a selector, excluding surrounding whitespace and comments.
  5. *
  6. * @param {import('postcss-selector-parser').Selector} node
  7. *
  8. * @returns {{selector: string, index: number, endIndex: number}}
  9. */
  10. export default function getStrippedSelectorSource(node) {
  11. const firstIndex = node.nodes.findIndex((x) => !isComment(x));
  12. const lastIndex = node.nodes.findLastIndex((x) => !isComment(x));
  13. const first = node.nodes[firstIndex];
  14. let last = node.nodes[lastIndex];
  15. if (!first || !last) {
  16. const selector = node.toString().trim();
  17. const index = node.sourceIndex ?? 0;
  18. const endIndex = index + selector.length;
  19. return {
  20. selector,
  21. index,
  22. endIndex,
  23. };
  24. }
  25. last = last.rawSpaceAfter.length ? last.clone() : last;
  26. last.rawSpaceAfter = '';
  27. let selector = node.nodes.slice(firstIndex, lastIndex).map(String).join('');
  28. selector += last.toString();
  29. selector = selector.trim();
  30. const index = first.sourceIndex ?? 0;
  31. const endIndex = index + selector.length;
  32. return {
  33. selector,
  34. index,
  35. endIndex,
  36. };
  37. }