Skip to content

Commit

Permalink
fmt
Browse files Browse the repository at this point in the history
  • Loading branch information
romainmenke committed Sep 20, 2023
1 parent d0e4559 commit 43b2882
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 80 deletions.
158 changes: 79 additions & 79 deletions build/postcss-combine-selectors.cjs
Original file line number Diff line number Diff line change
@@ -1,88 +1,88 @@
const creator = () => {
return {
postcssPlugin: 'postcss-combine-selectors',
Once(root) {
const rulesToCombine = new Map();

root.walkRules(rule => {
if (isKeyframesRule(rule)) {
return;
}

const key = ruleKey(rule);
const existing = rulesToCombine.get(key);

// Existing group:
// - add rule to the group
if (existing) {
existing.rules.push(rule);
return;
}

// New group:
// - first rule is the one we're going to combine into
// - create an empty slice for other rules to be added to
rulesToCombine.set(key, {
first: rule,
rules: []
});
});

// Iterate over all groups
for (const { first, rules } of rulesToCombine.values()) {
// If there was only one rule for a given group, there's nothing to combine
if (rules.length === 0) {
continue;
}

// Append all contents of all subsequent rules to the first rule
for (const rule of rules) {
rule.each((child) => {
child.remove();
first.append(child);
})

// Remove the now-empty rule
rule.remove();
}
}
},
};
};
return {
postcssPlugin: 'postcss-combine-selectors',
Once(root) {
const rulesToCombine = new Map()
root.walkRules(rule => {
if (isKeyframesRule(rule)) {
return
}
const key = ruleKey(rule)
const existing = rulesToCombine.get(key)
// Existing group:
// - add rule to the group
if (existing) {
existing.rules.push(rule)
return
}
// New group:
// - first rule is the one we're going to combine into
// - create an empty slice for other rules to be added to
rulesToCombine.set(key, {
first: rule,
rules: []
})
})
// Iterate over all groups
for (const { first, rules } of rulesToCombine.values()) {
// If there was only one rule for a given group, there's nothing to combine
if (rules.length === 0) {
continue
}
// Append all contents of all subsequent rules to the first rule
for (const rule of rules) {
rule.each((child) => {
child.remove()
first.append(child)
})
// Remove the now-empty rule
rule.remove()
}
}
},
}
}

/**
* Construct a key that is specific to the AST ancestry of the rule.
* Only rules with the same key can be combined.
*
* @param {import('postcss').Rule} rule
* @returns {string}
*/
* Construct a key that is specific to the AST ancestry of the rule.
* Only rules with the same key can be combined.
*
* @param {import('postcss').Rule} rule
* @returns {string}
*/
function ruleKey(rule) {
let key = `[rule ${rule.selector}]`;

let ancestor = rule.parent;
while (ancestor) {
if (ancestor.type === 'atrule') {
key = `[${ancestor.name} ${ancestor.params}]${key}`;
} else if (ancestor.type === 'rule') {
key = `[rule ${ancestor.selector}]${key}`;
} else if (ancestor.type === 'root') {
break;
}

ancestor = ancestor.parent;
}

return key;
let key = `[rule ${rule.selector}]`
let ancestor = rule.parent
while (ancestor) {
if (ancestor.type === 'atrule') {
key = `[${ancestor.name} ${ancestor.params}]${key}`
} else if (ancestor.type === 'rule') {
key = `[rule ${ancestor.selector}]${key}`
} else if (ancestor.type === 'root') {
break
}
ancestor = ancestor.parent
}
return key
}

function isKeyframesRule(rule) {
if (rule.parent?.type === 'atrule' && rule.parent.name === 'keyframes') {
return true;
}

return false;
if (rule.parent?.type === 'atrule' && rule.parent.name === 'keyframes') {
return true
}
return false
}

module.exports = creator;
module.exports.postcss = true;
module.exports = creator
module.exports.postcss = true
2 changes: 1 addition & 1 deletion postcss.config.cjs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
const postcssPresetEnv = require('postcss-preset-env')
const postcssImport = require('postcss-import')
const cssnano = require('cssnano')
const combineSelectors = require('./build/postcss-combine-selectors.cjs')
const combineSelectors = require('./build/postcss-combine-selectors.cjs')

const lib = process.env.npm_lifecycle_event

Expand Down

0 comments on commit 43b2882

Please sign in to comment.