flattenNestedSelectorsForRule.cjs 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. // NOTICE: This file is generated by Rollup. To modify it,
  2. // please instead edit the ESM counterpart and rebuild with Rollup (npm run build).
  3. 'use strict';
  4. const resolveNestedSelector = require('postcss-resolve-nested-selector');
  5. const selectorParser = require('postcss-selector-parser');
  6. const getRuleSelector = require('./getRuleSelector.cjs');
  7. const isStandardSyntaxSelector = require('./isStandardSyntaxSelector.cjs');
  8. const parseSelector = require('./parseSelector.cjs');
  9. /** @import { Selector, Root } from 'postcss-selector-parser' */
  10. /** @import { Rule } from 'postcss' */
  11. /** @import { PostcssResult } from 'stylelint' */
  12. /**
  13. * Flatten the selectors of the current rule against it's parent rules and at-rules.
  14. *
  15. * The selectors for the current rule are assumed to be standard CSS selectors.
  16. *
  17. * @typedef {{selector: Selector, resolvedSelectors: Root, nested: boolean}} FlattenedSelector
  18. *
  19. * @param {Rule} rule
  20. * @param {PostcssResult} result
  21. * @returns {Array<FlattenedSelector>}
  22. */
  23. function flattenNestedSelectorsForRule(rule, result) {
  24. const ownAST = parseSelector(getRuleSelector(rule), result, rule);
  25. if (!ownAST) return [];
  26. /** @type {Array<FlattenedSelector>} */
  27. const flattenedSelectors = [];
  28. for (const selectorAST of ownAST.nodes) {
  29. const selector = selectorAST.toString();
  30. const resolvedSelectors = resolveNestedSelector(selector, rule);
  31. if (resolvedSelectors.length === 1 && resolvedSelectors[0] === selector) {
  32. flattenedSelectors.push({
  33. selector: selectorAST,
  34. resolvedSelectors: selectorParser.root({
  35. value: '',
  36. nodes: [selectorAST],
  37. }),
  38. nested: false,
  39. });
  40. continue;
  41. }
  42. for (const resolvedSelector of resolvedSelectors) {
  43. if (!isStandardSyntaxSelector(resolvedSelector)) return [];
  44. const resolvedRoot = parseSelector(resolvedSelector, result, rule);
  45. if (!resolvedRoot) {
  46. continue;
  47. }
  48. flattenedSelectors.push({
  49. selector: selectorAST,
  50. resolvedSelectors: resolvedRoot,
  51. nested: true,
  52. });
  53. }
  54. }
  55. return flattenedSelectors;
  56. }
  57. module.exports = flattenNestedSelectorsForRule;