UNPKG

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