Skip to content

Commit 7f26999

Browse files
authored
feat: add JSX fragment factory to error message (#1051)
1 parent 1312a3e commit 7f26999

File tree

2 files changed

+69
-3
lines changed

2 files changed

+69
-3
lines changed

packages/plugins/eslint-plugin-react-x/src/rules/avoid-shorthand-fragment.spec.ts

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,66 @@ ruleTester.run(RULE_NAME, rule, {
2222
],
2323
},
2424
{
25-
code: tsx`<>text</>`,
25+
code: tsx`
26+
/** @jsx createElement */
27+
/** @jsxFrag Fragment */
28+
29+
const element = <><div /></>;
30+
`,
31+
errors: [
32+
{
33+
messageId: "avoidShorthandFragment",
34+
data: {
35+
jsxFragmentFactory: "Fragment",
36+
},
37+
},
38+
],
39+
},
40+
{
41+
code: tsx`
42+
/** @jsx React.createElement */
43+
/** @jsxFrag React.Fragment */
44+
45+
const element = <><div /></>;
46+
`,
47+
errors: [
48+
{
49+
messageId: "avoidShorthandFragment",
50+
data: {
51+
jsxFragmentFactory: "React.Fragment",
52+
},
53+
},
54+
],
55+
},
56+
{
57+
code: tsx`
58+
/** @jsx h */
59+
/** @jsxFrag Fragment */
60+
61+
const element = <><div /></>;
62+
`,
63+
errors: [
64+
{
65+
messageId: "avoidShorthandFragment",
66+
data: {
67+
jsxFragmentFactory: "Fragment",
68+
},
69+
},
70+
],
71+
},
72+
{
73+
code: tsx`
74+
/** @jsx Preact.h */
75+
/** @jsxFrag Preact.Fragment */
76+
77+
const element = <><div /></>;
78+
`,
2679
errors: [
2780
{
2881
messageId: "avoidShorthandFragment",
82+
data: {
83+
jsxFragmentFactory: "Preact.Fragment",
84+
},
2985
},
3086
],
3187
},

packages/plugins/eslint-plugin-react-x/src/rules/avoid-shorthand-fragment.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import type { RuleContext, RuleFeature } from "@eslint-react/kit";
21
import type { RuleListener } from "@typescript-eslint/utils/ts-eslint";
32
import type { CamelCase } from "string-ts";
3+
import { JsxConfig, type RuleContext, type RuleFeature } from "@eslint-react/kit";
44

55
import { createRule } from "../utils";
66

@@ -18,7 +18,7 @@ export default createRule<[], MessageID>({
1818
[Symbol.for("rule_features")]: RULE_FEATURES,
1919
},
2020
messages: {
21-
avoidShorthandFragment: "Avoid using shorthand fragment syntax. Use 'Fragment' component instead.",
21+
avoidShorthandFragment: "Avoid using shorthand fragment syntax. Use '{{jsxFragmentFactory}}' component instead.",
2222
},
2323
schema: [],
2424
},
@@ -28,11 +28,21 @@ export default createRule<[], MessageID>({
2828
});
2929

3030
export function create(context: RuleContext<MessageID, []>): RuleListener {
31+
const jsxConfigFromContext = JsxConfig.getFromContext(context);
32+
const jsxConfigFromAnnotation = JsxConfig.getFromAnnotation(context);
33+
const jsxConfig = {
34+
...jsxConfigFromContext,
35+
...jsxConfigFromAnnotation,
36+
};
37+
3138
return {
3239
JSXFragment(node) {
3340
context.report({
3441
messageId: "avoidShorthandFragment",
3542
node,
43+
data: {
44+
jsxFragmentFactory: jsxConfig.jsxFragmentFactory,
45+
},
3646
});
3747
},
3848
};

0 commit comments

Comments
 (0)