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");
9 const ruleName = "no-duplicate-at-import-rules";
11 const messages = ruleMessages(ruleName, {
12 rejected: atImport => `Unexpected duplicate @import rule ${atImport}`
15 const rule = function(actual) {
16 return (root, result) => {
17 const validOptions = validateOptions(result, ruleName, { actual });
24 root.walkAtRules(/^import$/i, atRule => {
25 const params = valueParser(atRule.params).nodes;
30 // extract uri from url() if exists
32 params[0].type === "function" && params[0].value === "url"
33 ? params[0].nodes[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);
40 const isDuplicate = media.length
41 ? imports[uri] && media.some(q => imports[uri].indexOf(q) !== -1)
46 message: messages.rejected(uri),
54 if (!imports[uri]) imports[uri] = [];
55 imports[uri] = imports[uri].concat(media);
60 rule.ruleName = ruleName;
61 rule.messages = messages;
62 module.exports = rule;