UNPKG

1.27 kBJavaScriptView Raw
1'use strict';
2const selectorParser = require('postcss-selector-parser');
3
4/**
5 * @param {string} selectors
6 * @param {selectorParser.SyncProcessor<void>} callback
7 * @return {string}
8 */
9function parseSelectors(selectors, callback) {
10 return selectorParser(callback).processSync(selectors);
11}
12
13/**
14 * @param {import('postcss').Rule} rule
15 * @return {void}
16 */
17function unique(rule) {
18 const selector = [...new Set(rule.selectors)];
19 selector.sort();
20 rule.selector = selector.join();
21}
22
23/**
24 * @type {import('postcss').PluginCreator<void>}
25 * @return {import('postcss').Plugin}
26 */
27function pluginCreator() {
28 return {
29 postcssPlugin: 'postcss-unique-selectors',
30 OnceExit(css) {
31 css.walkRules((nodes) => {
32 /** @type {string[]} */
33 let comments = [];
34 nodes.selector = parseSelectors(nodes.selector, (selNode) => {
35 selNode.walk((sel) => {
36 if (sel.type === 'comment') {
37 comments.push(sel.value);
38 sel.remove();
39 return;
40 } else {
41 return;
42 }
43 });
44 });
45 unique(nodes);
46 nodes.selectors = nodes.selectors.concat(comments);
47 });
48 },
49 };
50}
51
52pluginCreator.postcss = true;
53module.exports = pluginCreator;