summaryrefslogtreecommitdiff
path: root/node_modules/cssnano-utils/src/sameParent.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/cssnano-utils/src/sameParent.js')
-rw-r--r--node_modules/cssnano-utils/src/sameParent.js44
1 files changed, 44 insertions, 0 deletions
diff --git a/node_modules/cssnano-utils/src/sameParent.js b/node_modules/cssnano-utils/src/sameParent.js
new file mode 100644
index 00000000..6c484e1f
--- /dev/null
+++ b/node_modules/cssnano-utils/src/sameParent.js
@@ -0,0 +1,44 @@
+'use strict';
+
+/**
+ * @param {import('postcss').AnyNode} nodeA
+ * @param {import('postcss').AnyNode} nodeB
+ * @return {boolean}
+ */
+function checkMatch(nodeA, nodeB) {
+ if (nodeA.type === 'atrule' && nodeB.type === 'atrule') {
+ return (
+ nodeA.params === nodeB.params &&
+ nodeA.name.toLowerCase() === nodeB.name.toLowerCase()
+ );
+ }
+ return nodeA.type === nodeB.type;
+}
+
+/** @typedef {import('postcss').AnyNode & {parent?: Child}} Child */
+/**
+ * @param {Child} nodeA
+ * @param {Child} nodeB
+ * @return {boolean}
+ */
+function sameParent(nodeA, nodeB) {
+ if (!nodeA.parent) {
+ // A is orphaned, return if B is orphaned as well
+ return !nodeB.parent;
+ }
+
+ if (!nodeB.parent) {
+ // B is orphaned and A is not
+ return false;
+ }
+
+ // Check if parents match
+ if (!checkMatch(nodeA.parent, nodeB.parent)) {
+ return false;
+ }
+
+ // Check parents' parents
+ return sameParent(nodeA.parent, nodeB.parent);
+}
+
+module.exports = sameParent;