sameParent.js 969 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. 'use strict';
  2. /**
  3. * @param {import('postcss').AnyNode} nodeA
  4. * @param {import('postcss').AnyNode} nodeB
  5. * @return {boolean}
  6. */
  7. function checkMatch(nodeA, nodeB) {
  8. if (nodeA.type === 'atrule' && nodeB.type === 'atrule') {
  9. return (
  10. nodeA.params === nodeB.params &&
  11. nodeA.name.toLowerCase() === nodeB.name.toLowerCase()
  12. );
  13. }
  14. return nodeA.type === nodeB.type;
  15. }
  16. /** @typedef {import('postcss').AnyNode & {parent?: Child}} Child */
  17. /**
  18. * @param {Child} nodeA
  19. * @param {Child} nodeB
  20. * @return {boolean}
  21. */
  22. function sameParent(nodeA, nodeB) {
  23. if (!nodeA.parent) {
  24. // A is orphaned, return if B is orphaned as well
  25. return !nodeB.parent;
  26. }
  27. if (!nodeB.parent) {
  28. // B is orphaned and A is not
  29. return false;
  30. }
  31. // Check if parents match
  32. if (!checkMatch(nodeA.parent, nodeB.parent)) {
  33. return false;
  34. }
  35. // Check parents' parents
  36. return sameParent(nodeA.parent, nodeB.parent);
  37. }
  38. module.exports = sameParent;