summaryrefslogtreecommitdiff
path: root/node_modules/postcss-unique-selectors/src
diff options
context:
space:
mode:
authorlittleblack111 <littleblack11111@gmail.com>2023-10-14 15:05:55 +0800
committerlittleblack111 <littleblack11111@gmail.com>2023-10-14 15:05:55 +0800
commitc06f7ee0a40255214c477e13d9b956a7e07c2900 (patch)
treef5982a568ef8fab865d0142e71c7494fea3e4c1b /node_modules/postcss-unique-selectors/src
parent3fd9400d4dccc25aa29b5702216732e0b7542073 (diff)
postcss,(plugins): nanocss, postcss-preset-env
Diffstat (limited to 'node_modules/postcss-unique-selectors/src')
-rw-r--r--node_modules/postcss-unique-selectors/src/index.js59
1 files changed, 59 insertions, 0 deletions
diff --git a/node_modules/postcss-unique-selectors/src/index.js b/node_modules/postcss-unique-selectors/src/index.js
new file mode 100644
index 00000000..39cd52fa
--- /dev/null
+++ b/node_modules/postcss-unique-selectors/src/index.js
@@ -0,0 +1,59 @@
+'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 {string}
+ */
+function unique(rule) {
+ const selector = [...new Set(rule.selectors)];
+ selector.sort();
+ return 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 = [];
+ /** @type {selectorParser.SyncProcessor<void>} */
+ const removeAndSaveComments = (selNode) => {
+ selNode.walk((sel) => {
+ if (sel.type === 'comment') {
+ comments.push(sel.value);
+ sel.remove();
+ return;
+ } else {
+ return;
+ }
+ });
+ };
+ if (nodes.raws.selector && nodes.raws.selector.raw) {
+ parseSelectors(nodes.raws.selector.raw, removeAndSaveComments);
+ nodes.raws.selector.raw = unique(nodes);
+ }
+ nodes.selector = parseSelectors(nodes.selector, removeAndSaveComments);
+ nodes.selector = unique(nodes);
+ nodes.selectors = nodes.selectors.concat(comments);
+ });
+ },
+ };
+}
+
+pluginCreator.postcss = true;
+module.exports = pluginCreator;