1 | 'use strict';
|
2 | const selectorParser = require('postcss-selector-parser');
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 | function parseSelectors(selectors, callback) {
|
10 | return selectorParser(callback).processSync(selectors);
|
11 | }
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 | function unique(rule) {
|
18 | const selector = [...new Set(rule.selectors)];
|
19 | selector.sort();
|
20 | rule.selector = selector.join();
|
21 | }
|
22 |
|
23 |
|
24 |
|
25 |
|
26 |
|
27 | function pluginCreator() {
|
28 | return {
|
29 | postcssPlugin: 'postcss-unique-selectors',
|
30 | OnceExit(css) {
|
31 | css.walkRules((nodes) => {
|
32 |
|
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 |
|
52 | pluginCreator.postcss = true;
|
53 | module.exports = pluginCreator;
|