Skip to content

Commit 0aa7b97

Browse files
authored
feat: add autofix to no-duplicate-imports rule (eslint#216)
* feat: add autofix to no-duplicate-imports rule * add test for non-adjacent duplicate @import statements
1 parent 30ca01c commit 0aa7b97

File tree

2 files changed

+70
-0
lines changed

2 files changed

+70
-0
lines changed

src/rules/no-duplicate-imports.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ export default {
2424
meta: {
2525
type: "problem",
2626

27+
fixable: "code",
28+
2729
docs: {
2830
description: "Disallow duplicate @import rules",
2931
recommended: true,
@@ -36,6 +38,7 @@ export default {
3638
},
3739

3840
create(context) {
41+
const { sourceCode } = context;
3942
const imports = new Set();
4043

4144
return {
@@ -47,6 +50,13 @@ export default {
4750
loc: node.loc,
4851
messageId: "duplicateImport",
4952
data: { url },
53+
fix(fixer) {
54+
const [start, end] = sourceCode.getRange(node);
55+
// Remove the node, and also remove a following newline if present
56+
const removeEnd =
57+
sourceCode.text[end] === "\n" ? end + 1 : end;
58+
return fixer.removeRange([start, removeEnd]);
59+
},
5060
});
5161
} else {
5262
imports.add(url);

tests/rules/no-duplicate-imports.test.js

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ ruleTester.run("no-duplicate-imports", rule, {
3131
invalid: [
3232
{
3333
code: "@import url('x.css');\n@import url('x.css');",
34+
output: "@import url('x.css');\n",
3435
errors: [
3536
{
3637
messageId: "duplicateImport",
@@ -42,8 +43,37 @@ ruleTester.run("no-duplicate-imports", rule, {
4243
},
4344
],
4445
},
46+
{
47+
code: "@import url('x.css');@import url('x.css');",
48+
output: "@import url('x.css');",
49+
errors: [
50+
{
51+
messageId: "duplicateImport",
52+
data: { url: "x.css" },
53+
line: 1,
54+
column: 22,
55+
endLine: 1,
56+
endColumn: 43,
57+
},
58+
],
59+
},
60+
{
61+
code: "@import url('x.css');@import url('x.css');@import url('y.css')",
62+
output: "@import url('x.css');@import url('y.css')",
63+
errors: [
64+
{
65+
messageId: "duplicateImport",
66+
data: { url: "x.css" },
67+
line: 1,
68+
column: 22,
69+
endLine: 1,
70+
endColumn: 43,
71+
},
72+
],
73+
},
4574
{
4675
code: "@import url('x.css');\n@import 'x.css';",
76+
output: "@import url('x.css');\n",
4777
errors: [
4878
{
4979
messageId: "duplicateImport",
@@ -57,6 +87,7 @@ ruleTester.run("no-duplicate-imports", rule, {
5787
},
5888
{
5989
code: "@import url('x.css');\n@import 'x.css';\n@import 'x.css';",
90+
output: "@import url('x.css');\n@import 'x.css';",
6091
errors: [
6192
{
6293
messageId: "duplicateImport",
@@ -78,6 +109,7 @@ ruleTester.run("no-duplicate-imports", rule, {
78109
},
79110
{
80111
code: "@import url('x.css');\n@import 'x.css';\n@import url('y.css');\n@import 'y.css';",
112+
output: "@import url('x.css');\n@import url('y.css');\n",
81113
errors: [
82114
{
83115
messageId: "duplicateImport",
@@ -97,5 +129,33 @@ ruleTester.run("no-duplicate-imports", rule, {
97129
},
98130
],
99131
},
132+
{
133+
code: "@import url('a.css');\n@import url('b.css');\n@import url('c.css');\n@import url('a.css');\n@import url('d.css');",
134+
output: "@import url('a.css');\n@import url('b.css');\n@import url('c.css');\n@import url('d.css');",
135+
errors: [
136+
{
137+
messageId: "duplicateImport",
138+
data: { url: "a.css" },
139+
line: 4,
140+
column: 1,
141+
endLine: 4,
142+
endColumn: 22,
143+
},
144+
],
145+
},
146+
{
147+
code: "@import url('a.css');\n@import url('b.css');\n/* comment */\n@import 'a.css';",
148+
output: "@import url('a.css');\n@import url('b.css');\n/* comment */\n",
149+
errors: [
150+
{
151+
messageId: "duplicateImport",
152+
data: { url: "a.css" },
153+
line: 4,
154+
column: 1,
155+
endLine: 4,
156+
endColumn: 17,
157+
},
158+
],
159+
},
100160
],
101161
});

0 commit comments

Comments
 (0)