.gitignore added
[dotfiles/.git] / .config / coc / extensions / node_modules / coc-prettier / node_modules / stylelint / lib / rules / no-duplicate-at-import-rules / index.js
1 "use strict";
2
3 const mediaParser = require("postcss-media-query-parser").default;
4 const report = require("../../utils/report");
5 const ruleMessages = require("../../utils/ruleMessages");
6 const validateOptions = require("../../utils/validateOptions");
7 const valueParser = require("postcss-value-parser");
8
9 const ruleName = "no-duplicate-at-import-rules";
10
11 const messages = ruleMessages(ruleName, {
12   rejected: atImport => `Unexpected duplicate @import rule ${atImport}`
13 });
14
15 const rule = function(actual) {
16   return (root, result) => {
17     const validOptions = validateOptions(result, ruleName, { actual });
18     if (!validOptions) {
19       return;
20     }
21
22     const imports = {};
23
24     root.walkAtRules(/^import$/i, atRule => {
25       const params = valueParser(atRule.params).nodes;
26       if (!params.length) {
27         return;
28       }
29
30       // extract uri from url() if exists
31       const uri =
32         params[0].type === "function" && params[0].value === "url"
33           ? params[0].nodes[0].value
34           : params[0].value;
35       // extract media queries if any
36       const media = mediaParser(valueParser.stringify(params.slice(1)))
37         .nodes.map(n => n.value.replace(/\s/g, ""))
38         .filter(n => n.length);
39
40       const isDuplicate = media.length
41         ? imports[uri] && media.some(q => imports[uri].indexOf(q) !== -1)
42         : imports[uri];
43
44       if (isDuplicate) {
45         report({
46           message: messages.rejected(uri),
47           node: atRule,
48           result,
49           ruleName
50         });
51         return;
52       }
53
54       if (!imports[uri]) imports[uri] = [];
55       imports[uri] = imports[uri].concat(media);
56     });
57   };
58 };
59
60 rule.ruleName = ruleName;
61 rule.messages = messages;
62 module.exports = rule;