You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
1.2 KiB
53 lines
1.2 KiB
'use strict'; |
|
const selectorParser = require('postcss-selector-parser'); |
|
|
|
/** |
|
* @param {string} selectors |
|
* @param {selectorParser.SyncProcessor<void>} callback |
|
* @return {string} |
|
*/ |
|
function parseSelectors(selectors, callback) { |
|
return selectorParser(callback).processSync(selectors); |
|
} |
|
|
|
/** |
|
* @param {import('postcss').Rule} rule |
|
* @return {void} |
|
*/ |
|
function unique(rule) { |
|
const selector = [...new Set(rule.selectors)]; |
|
selector.sort(); |
|
rule.selector = selector.join(); |
|
} |
|
|
|
/** |
|
* @type {import('postcss').PluginCreator<void>} |
|
* @return {import('postcss').Plugin} |
|
*/ |
|
function pluginCreator() { |
|
return { |
|
postcssPlugin: 'postcss-unique-selectors', |
|
OnceExit(css) { |
|
css.walkRules((nodes) => { |
|
/** @type {string[]} */ |
|
let comments = []; |
|
nodes.selector = parseSelectors(nodes.selector, (selNode) => { |
|
selNode.walk((sel) => { |
|
if (sel.type === 'comment') { |
|
comments.push(sel.value); |
|
sel.remove(); |
|
return; |
|
} else { |
|
return; |
|
} |
|
}); |
|
}); |
|
unique(nodes); |
|
nodes.selectors = nodes.selectors.concat(comments); |
|
}); |
|
}, |
|
}; |
|
} |
|
|
|
pluginCreator.postcss = true; |
|
module.exports = pluginCreator;
|
|
|