summaryrefslogtreecommitdiff
path: root/node_modules/tailwindcss/src/lib/collapseAdjacentRules.js
diff options
context:
space:
mode:
authorPhilipp Tanlak <philipp.tanlak@gmail.com>2025-11-24 20:54:57 +0100
committerPhilipp Tanlak <philipp.tanlak@gmail.com>2025-11-24 20:57:48 +0100
commitb1e2c8fd5cb5dfa46bc440a12eafaf56cd844b1c (patch)
tree49d360fd6cbc6a2754efe93524ac47ff0fbe0f7d /node_modules/tailwindcss/src/lib/collapseAdjacentRules.js
Docs
Diffstat (limited to 'node_modules/tailwindcss/src/lib/collapseAdjacentRules.js')
-rw-r--r--node_modules/tailwindcss/src/lib/collapseAdjacentRules.js58
1 files changed, 58 insertions, 0 deletions
diff --git a/node_modules/tailwindcss/src/lib/collapseAdjacentRules.js b/node_modules/tailwindcss/src/lib/collapseAdjacentRules.js
new file mode 100644
index 0000000..119f592
--- /dev/null
+++ b/node_modules/tailwindcss/src/lib/collapseAdjacentRules.js
@@ -0,0 +1,58 @@
+let comparisonMap = {
+ atrule: ['name', 'params'],
+ rule: ['selector'],
+}
+let types = new Set(Object.keys(comparisonMap))
+
+export default function collapseAdjacentRules() {
+ function collapseRulesIn(root) {
+ let currentRule = null
+ root.each((node) => {
+ if (!types.has(node.type)) {
+ currentRule = null
+ return
+ }
+
+ if (currentRule === null) {
+ currentRule = node
+ return
+ }
+
+ let properties = comparisonMap[node.type]
+
+ if (node.type === 'atrule' && node.name === 'font-face') {
+ currentRule = node
+ } else if (
+ properties.every(
+ (property) =>
+ (node[property] ?? '').replace(/\s+/g, ' ') ===
+ (currentRule[property] ?? '').replace(/\s+/g, ' ')
+ )
+ ) {
+ // An AtRule may not have children (for example if we encounter duplicate @import url(…) rules)
+ if (node.nodes) {
+ currentRule.append(node.nodes)
+ }
+
+ node.remove()
+ } else {
+ currentRule = node
+ }
+ })
+
+ // After we've collapsed adjacent rules & at-rules, we need to collapse
+ // adjacent rules & at-rules that are children of at-rules.
+ // We do not care about nesting rules because Tailwind CSS
+ // explicitly does not handle rule nesting on its own as
+ // the user is expected to use a nesting plugin
+ root.each((node) => {
+ if (node.type === 'atrule') {
+ collapseRulesIn(node)
+ }
+ })
+ }
+
+ return (root) => {
+ collapseRulesIn(root)
+ }
+}