Skip to content

Commit dd0757f

Browse files
authored
Merge pull request #2113 from alexzherdev/2112-fix-self-closing-fragments
[Fix] `jsx-fragments`: avoid crashing on self-closing fragments
2 parents b48b479 + e997f6c commit dd0757f

File tree

2 files changed

+49
-4
lines changed

2 files changed

+49
-4
lines changed

lib/rules/jsx-fragments.js

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,10 +71,18 @@ module.exports = {
7171
function getFixerToShort(jsxElement) {
7272
return function(fixer) {
7373
let source = sourceCode.getText();
74-
source = replaceNode(source, jsxElement.closingElement, closeFragShort);
75-
source = replaceNode(source, jsxElement.openingElement, openFragShort);
76-
const lengthDiff = sourceCode.getText(jsxElement.openingElement).length - openFragShort.length
77-
+ sourceCode.getText(jsxElement.closingElement).length - closeFragShort.length;
74+
let lengthDiff;
75+
if (jsxElement.closingElement) {
76+
source = replaceNode(source, jsxElement.closingElement, closeFragShort);
77+
source = replaceNode(source, jsxElement.openingElement, openFragShort);
78+
lengthDiff = sourceCode.getText(jsxElement.openingElement).length - openFragShort.length
79+
+ sourceCode.getText(jsxElement.closingElement).length - closeFragShort.length;
80+
} else {
81+
source = replaceNode(source, jsxElement.openingElement, `${openFragShort}${closeFragShort}`);
82+
lengthDiff = sourceCode.getText(jsxElement.openingElement).length - openFragShort.length
83+
- closeFragShort.length;
84+
}
85+
7886
const range = jsxElement.range;
7987
return fixer.replaceTextRange(range, source.slice(range[0], range[1] - lengthDiff));
8088
};

tests/lib/rules/jsx-fragments.js

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@ ruleTester.run('jsx-fragments', rule, {
4949
code: '<Act.Frag><Foo /></Act.Frag>',
5050
options: ['element'],
5151
settings
52+
}, {
53+
code: '<Act.Frag />',
54+
options: ['element'],
55+
settings
5256
}, {
5357
code: `
5458
import Act, { Frag as F } from 'react';
@@ -81,6 +85,10 @@ ruleTester.run('jsx-fragments', rule, {
8185
code: '<Act.Frag key="key"><Foo /></Act.Frag>',
8286
options: ['syntax'],
8387
settings
88+
}, {
89+
code: '<Act.Frag key="key" />',
90+
options: ['syntax'],
91+
settings
8492
}],
8593

8694
invalid: [{
@@ -98,6 +106,13 @@ ruleTester.run('jsx-fragments', rule, {
98106
message: 'Fragments are only supported starting from React v16.2. '
99107
+ 'Please disable the `react/jsx-fragments` rule in ESLint settings or upgrade your version of React.'
100108
}]
109+
}, {
110+
code: '<Act.Frag />',
111+
settings: settingsOld,
112+
errors: [{
113+
message: 'Fragments are only supported starting from React v16.2. '
114+
+ 'Please disable the `react/jsx-fragments` rule in ESLint settings or upgrade your version of React.'
115+
}]
101116
}, {
102117
code: '<><Foo /></>',
103118
parser: 'babel-eslint',
@@ -115,6 +130,28 @@ ruleTester.run('jsx-fragments', rule, {
115130
message: 'Prefer fragment shorthand over Act.Frag'
116131
}],
117132
output: '<><Foo /></>'
133+
}, {
134+
code: '<Act.Frag />',
135+
options: ['syntax'],
136+
settings,
137+
errors: [{
138+
message: 'Prefer fragment shorthand over Act.Frag'
139+
}],
140+
output: '<></>'
141+
}, {
142+
code: `
143+
import Act, { Frag as F } from 'react';
144+
<F />;
145+
`,
146+
options: ['syntax'],
147+
settings,
148+
errors: [{
149+
message: 'Prefer fragment shorthand over Act.Frag'
150+
}],
151+
output: `
152+
import Act, { Frag as F } from 'react';
153+
<></>;
154+
`
118155
}, {
119156
code: `
120157
import Act, { Frag as F } from 'react';

0 commit comments

Comments
 (0)