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 meta = {
|
16 | url: 'https://stylelint.io/user-guide/rules/list/no-duplicate-at-import-rules',
|
17 | };
|
18 |
|
19 |
|
20 | const rule = (primary) => {
|
21 | return (root, result) => {
|
22 | const validOptions = validateOptions(result, ruleName, { actual: primary });
|
23 |
|
24 | if (!validOptions) {
|
25 | return;
|
26 | }
|
27 |
|
28 |
|
29 | const imports = {};
|
30 |
|
31 | root.walkAtRules(/^import$/i, (atRule) => {
|
32 | const [firstParam, ...restParams] = valueParser(atRule.params).nodes;
|
33 |
|
34 | if (!firstParam) {
|
35 | return;
|
36 | }
|
37 |
|
38 |
|
39 | const uri =
|
40 | firstParam.type === 'function' && firstParam.value === 'url'
|
41 | ? firstParam.nodes[0].value
|
42 | : firstParam.value;
|
43 |
|
44 |
|
45 | const media = (mediaParser(valueParser.stringify(restParams)).nodes || [])
|
46 | .map((n) => n.value.replace(/\s/g, ''))
|
47 | .filter((n) => n.length);
|
48 |
|
49 | const isDuplicate = media.length
|
50 | ? imports[uri] && media.some((q) => imports[uri].includes(q))
|
51 | : imports[uri];
|
52 |
|
53 | if (isDuplicate) {
|
54 | report({
|
55 | message: messages.rejected(uri),
|
56 | node: atRule,
|
57 | result,
|
58 | ruleName,
|
59 | });
|
60 |
|
61 | return;
|
62 | }
|
63 |
|
64 | if (!imports[uri]) imports[uri] = [];
|
65 |
|
66 | imports[uri] = imports[uri].concat(media);
|
67 | });
|
68 | };
|
69 | };
|
70 |
|
71 | rule.ruleName = ruleName;
|
72 | rule.messages = messages;
|
73 | rule.meta = meta;
|
74 | module.exports = rule;
|