1 | 'use strict';
|
2 | const selectorParser = require('postcss-selector-parser');
|
3 |
|
4 | function parseSelectors(selectors, callback) {
|
5 | return selectorParser(callback).processSync(selectors);
|
6 | }
|
7 |
|
8 | function unique(rule) {
|
9 | const selector = [...new Set(rule.selectors)];
|
10 | selector.sort();
|
11 | rule.selector = selector.join();
|
12 | }
|
13 |
|
14 | function pluginCreator() {
|
15 | return {
|
16 | postcssPlugin: 'postcss-unique-selectors',
|
17 | OnceExit(css) {
|
18 | css.walkRules((nodes) => {
|
19 | let comments = [];
|
20 | nodes.selector = parseSelectors(nodes.selector, (selNode) => {
|
21 | selNode.walk((sel) => {
|
22 | if (sel.type === 'comment') {
|
23 | comments.push(sel.value);
|
24 | sel.remove();
|
25 | return;
|
26 | } else {
|
27 | return;
|
28 | }
|
29 | });
|
30 | });
|
31 | unique(nodes);
|
32 | nodes.selectors = nodes.selectors.concat(comments);
|
33 | });
|
34 | },
|
35 | };
|
36 | }
|
37 |
|
38 | pluginCreator.postcss = true;
|
39 | module.exports = pluginCreator;
|