Skip to content

Commit 3670920

Browse files
authored
fix(plugins/x): enhance no-context-provider rule to include context n… (#935)
1 parent fc0e0d1 commit 3670920

File tree

2 files changed

+39
-12
lines changed

2 files changed

+39
-12
lines changed

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

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,14 @@ ruleTester.run(RULE_NAME, rule, {
55
invalid: [
66
{
77
code: "<Context.Provider />",
8-
errors: [{ messageId: "noContextProvider" }],
8+
errors: [
9+
{
10+
messageId: "noContextProvider",
11+
data: {
12+
contextName: "Context",
13+
},
14+
},
15+
],
916
output: "<Context />",
1017
settings: {
1118
"react-x": {
@@ -14,9 +21,16 @@ ruleTester.run(RULE_NAME, rule, {
1421
},
1522
},
1623
{
17-
code: "<Context.Provider><App /></Context.Provider>",
18-
errors: [{ messageId: "noContextProvider" }],
19-
output: "<Context><App /></Context>",
24+
code: "<ThemeContext.Provider><App /></ThemeContext.Provider>",
25+
errors: [
26+
{
27+
messageId: "noContextProvider",
28+
data: {
29+
contextName: "ThemeContext",
30+
},
31+
},
32+
],
33+
output: "<ThemeContext><App /></ThemeContext>",
2034
settings: {
2135
"react-x": {
2236
version: "19.0.0",
@@ -25,7 +39,14 @@ ruleTester.run(RULE_NAME, rule, {
2539
},
2640
{
2741
code: "<Context.Provider>{children}</Context.Provider>",
28-
errors: [{ messageId: "noContextProvider" }],
42+
errors: [
43+
{
44+
messageId: "noContextProvider",
45+
data: {
46+
contextName: "Context",
47+
},
48+
},
49+
],
2950
output: "<Context>{children}</Context>",
3051
settings: {
3152
"react-x": {
@@ -35,7 +56,14 @@ ruleTester.run(RULE_NAME, rule, {
3556
},
3657
{
3758
code: "<Foo.Bar.Provider>{children}</Foo.Bar.Provider>",
38-
errors: [{ messageId: "noContextProvider" }],
59+
errors: [
60+
{
61+
messageId: "noContextProvider",
62+
data: {
63+
contextName: "Foo.Bar",
64+
},
65+
},
66+
],
3967
output: "<Foo.Bar>{children}</Foo.Bar>",
4068
settings: {
4169
"react-x": {

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

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ export default createRule<[], MessageID>({
2424
},
2525
fixable: "code",
2626
messages: {
27-
noContextProvider: "In React 19, you can render '<Context>' as a provider instead of '<Context.Provider>'.",
27+
noContextProvider:
28+
"In React 19, you can render '<{{contextName}}>' as a provider instead of '<{{contextName}}.Provider>'.",
2829
},
2930
schema: [],
3031
},
@@ -37,15 +38,13 @@ export default createRule<[], MessageID>({
3738
}
3839
return {
3940
JSXElement(node) {
40-
const elementName = JSX.getElementName(node);
41-
if (!elementName.endsWith(".Provider")) {
42-
return;
43-
}
41+
const [name, ...rest] = JSX.getElementName(node).split(".").reverse();
42+
if (name !== "Provider") return;
43+
const contextName = rest.reverse().join(".");
4444
context.report({
4545
messageId: "noContextProvider",
4646
node,
4747
fix(fixer) {
48-
const contextName = elementName.replace(/\.Provider$/, "");
4948
const openingElement = node.openingElement;
5049
const closingElement = node.closingElement;
5150
if (closingElement == null) {

0 commit comments

Comments
 (0)