Skip to content

Commit c3b1797

Browse files
authored
fix(no-use-context): removing imports should also remove the associat… (#932)
1 parent 31aa77f commit c3b1797

File tree

11 files changed

+54
-412
lines changed

11 files changed

+54
-412
lines changed

examples/dual-react-dom-lib/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
"prepare": "pnpm run build"
3030
},
3131
"devDependencies": {
32-
"@eslint-react/eslint-plugin": "^1.25.0",
32+
"@eslint-react/eslint-plugin": "workspace:*",
3333
"@eslint/js": "^9.19.0",
3434
"@tsconfig/node22": "^22.0.0",
3535
"@tsconfig/strictest": "^2.0.5",

examples/next-app/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
"react-dom": "^19.0.0"
1717
},
1818
"devDependencies": {
19-
"@eslint-react/eslint-plugin": "^1.25.0",
19+
"@eslint-react/eslint-plugin": "workspace:*",
2020
"@eslint/config-inspector": "^1.0.0",
2121
"@eslint/js": "^9.19.0",
2222
"@next/eslint-plugin-next": "^15.1.6",

examples/vite-react-dom-app/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
"react-dom": "^19.0.0"
1616
},
1717
"devDependencies": {
18-
"@eslint-react/eslint-plugin": "^1.25.0",
18+
"@eslint-react/eslint-plugin": "workspace:*",
1919
"@eslint/config-inspector": "^1.0.0",
2020
"@eslint/js": "^9.19.0",
2121
"@tsconfig/node22": "^22.0.0",

examples/vite-react-dom-js-app/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
"react-dom": "^19.0.0"
1616
},
1717
"devDependencies": {
18-
"@eslint-react/eslint-plugin": "^1.25.0",
18+
"@eslint-react/eslint-plugin": "workspace:*",
1919
"@eslint/config-inspector": "^1.0.0",
2020
"@eslint/js": "^9.19.0",
2121
"@types/react": "^19.0.8",

examples/vite-react-dom-js-with-babel-eslint-parser-app/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
"@babel/eslint-parser": "^7.26.5",
2020
"@babel/preset-env": "^7.26.7",
2121
"@babel/preset-react": "^7.26.3",
22-
"@eslint-react/eslint-plugin": "^1.25.0",
22+
"@eslint-react/eslint-plugin": "workspace:*",
2323
"@eslint/config-inspector": "^1.0.0",
2424
"@eslint/js": "^9.19.0",
2525
"@types/babel__core": "~7.20.5",

examples/vite-react-dom-with-ts-blank-eslint-parser-app/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
"react-dom": "^19.0.0"
1616
},
1717
"devDependencies": {
18-
"@eslint-react/eslint-plugin": "^1.25.0",
18+
"@eslint-react/eslint-plugin": "workspace:*",
1919
"@eslint/config-inspector": "^1.0.0",
2020
"@eslint/js": "^9.19.0",
2121
"@tsconfig/node22": "^22.0.0",

packages/plugins/eslint-plugin-react-x/src/rules/no-use-context.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ ruleTester.run(RULE_NAME, rule, {
7171
{ messageId: "noUseContext" },
7272
],
7373
output: /* tsx */ `
74-
import { use, } from 'react'
74+
import { use } from 'react'
7575
7676
export const Component = () => {
7777
const value = use(MyContext)

packages/plugins/eslint-plugin-react-x/src/rules/no-use-context.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { compare } from "compare-versions";
66
import type { CamelCase } from "string-ts";
77
import { isMatching } from "ts-pattern";
88

9-
import { createRule } from "../utils";
9+
import { createRule, getAssociatedTokens } from "../utils";
1010

1111
export const RULE_NAME = "no-use-context";
1212

@@ -86,7 +86,13 @@ export default createRule<[], MessageID>({
8686
node: specifier,
8787
fix(fixer) {
8888
if (isUseImported) {
89-
return fixer.replaceText(specifier, " ".repeat(specifier.range[1] - specifier.range[0]));
89+
return [
90+
fixer.remove(specifier),
91+
...getAssociatedTokens(
92+
context,
93+
specifier,
94+
).map((token) => fixer.remove(token)),
95+
];
9096
}
9197
return fixer.replaceText(specifier.imported, "use");
9298
},
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import type { RuleContext } from "@eslint-react/shared";
2+
import type { TSESTree } from "@typescript-eslint/types";
3+
4+
export function getAssociatedTokens(
5+
context: RuleContext,
6+
node: TSESTree.Node,
7+
) {
8+
{
9+
const tokenBefore = context.sourceCode.getTokenBefore(node);
10+
const tokenAfter = context.sourceCode.getTokenAfter(node);
11+
const tokens = [];
12+
13+
// If this is not the only entry, then the line above this one
14+
// will become the last line, and should not have a trailing comma.
15+
if (tokenAfter?.value !== "," && tokenBefore?.value === ",") {
16+
tokens.push(tokenBefore);
17+
}
18+
19+
// If this is not the last entry, then we need to remove the comma from this line.
20+
if (tokenAfter?.value === ",") {
21+
tokens.push(tokenAfter);
22+
}
23+
24+
return tokens;
25+
}
26+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
export * from "./create-rule";
2+
export * from "./get-associated-tokens";

0 commit comments

Comments
 (0)