Skip to content

Commit 6de5842

Browse files
committed
feat(plugins/x): add auto-fix to 'prefer-shorthand-fragment', closes #898
1 parent c442638 commit 6de5842

File tree

5 files changed

+32
-3
lines changed

5 files changed

+32
-3
lines changed

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ ruleTester.run(RULE_NAME, rule, {
1010
messageId: "preferShorthandFragment",
1111
},
1212
],
13+
output: "<><div /></>",
1314
},
1415
{
1516
code: /* tsx */ `<Fragment><div /></Fragment>`,
@@ -18,6 +19,24 @@ ruleTester.run(RULE_NAME, rule, {
1819
messageId: "preferShorthandFragment",
1920
},
2021
],
22+
output: "<><div /></>",
23+
},
24+
{
25+
code: /* tsx */ `
26+
<React.Fragment>
27+
<div />
28+
</React.Fragment>
29+
`,
30+
errors: [
31+
{
32+
messageId: "preferShorthandFragment",
33+
},
34+
],
35+
output: `
36+
<>
37+
<div />
38+
</>
39+
`,
2140
},
2241
],
2342
valid: [

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export const RULE_NAME = "prefer-shorthand-fragment";
1111

1212
export const RULE_FEATURES = [
1313
"CHK",
14+
"FIX",
1415
] as const satisfies RuleFeature[];
1516

1617
export type MessageID = CamelCase<typeof RULE_NAME>;
@@ -22,6 +23,7 @@ export default createRule<[], MessageID>({
2223
description: "enforce using fragment syntax instead of 'Fragment' component",
2324
[Symbol.for("rule_features")]: RULE_FEATURES,
2425
},
26+
fixable: "code",
2527
messages: {
2628
preferShorthandFragment: "Use fragment shorthand syntax instead of 'Fragment' component.",
2729
},
@@ -36,6 +38,14 @@ export default createRule<[], MessageID>({
3638
return O.some({
3739
messageId: "preferShorthandFragment",
3840
node,
41+
fix: (fixer) => {
42+
const { closingElement, openingElement } = node;
43+
if (!closingElement) return [];
44+
return [
45+
fixer.replaceTextRange([openingElement.range[0], openingElement.range[1]], "<>"),
46+
fixer.replaceTextRange([closingElement.range[0], closingElement.range[1]], "</>"),
47+
];
48+
},
3949
});
4050
}
4151
return {

website/pages/docs/rules/overview.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@
6464
| [`prefer-react-namespace-import`](prefer-react-namespace-import) | 0️⃣ | `🔍` `🔧` | Enforces React is imported via a namespace import | |
6565
| [`prefer-read-only-props`](prefer-read-only-props) | 0️⃣ | `🔍` `💭` | Enforces read-only props in components. | |
6666
| [`prefer-shorthand-boolean`](prefer-shorthand-boolean) | 0️⃣ | `🔍` `🔧` | Enforces using shorthand syntax for boolean attributes. | |
67-
| [`prefer-shorthand-fragment`](prefer-shorthand-fragment) | 0️⃣ | `🔍` | Enforces using shorthand syntax for fragments. | |
67+
| [`prefer-shorthand-fragment`](prefer-shorthand-fragment) | 0️⃣ | `🔍` `🔧` | Enforces using shorthand syntax for fragments. | |
6868
| [`use-jsx-vars`](use-jsx-vars) | 1️⃣ | | Helpes `eslint/no-unused-vars` to correctly detect variables used in JSX. | |
6969

7070
### Deprecated

website/pages/docs/rules/prefer-shorthand-fragment.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ react-x/prefer-shorthand-fragment
1414

1515
**Features**
1616

17-
`🔍`
17+
`🔍` `🔧`
1818

1919
## What it does
2020

website/pages/roadmap.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424
- [ ] `function-component-definition`
2525
- [ ] `no-useless-fragment`
26-
- [ ] `prefer-shorthand-fragment`
26+
- [x] `prefer-shorthand-fragment`
2727
- [x] `prefer-react-namespace-import`
2828
- [x] `prefer-shorthand-boolean`
2929

0 commit comments

Comments
 (0)