Skip to content

Commit 911f66e

Browse files
remcohaszingljharb
authored andcommitted
[Fix] jsx-uses-react: mark fragment variables as used
This allows to use the following syntax: ```jsx import { createElement, Fragment } from 'react'; function Component { return <></>; } ``` Or more common in Preact: ```jsx import { Fragment, h } from 'preact'; function Component { return <></>; } ``` The `react.fragment` setting already existed for other rules, but it was undocumented.
1 parent ee8f771 commit 911f66e

File tree

3 files changed

+18
-6
lines changed

3 files changed

+18
-6
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ You should also specify settings that will be shared across all the plugin rules
3939
"createClass": "createReactClass", // Regex for Component Factory to use,
4040
// default to "createReactClass"
4141
"pragma": "React", // Pragma to use, default to "React"
42+
"fragment": "React.Fragment", // Fragment to use, default to "React.Fragment"
4243
"version": "detect", // React version. "detect" automatically picks the version you have installed.
4344
// You can also use `16.0`, `16.3`, etc, if you want to override the detected value.
4445
// default to latest and warns if missing

lib/rules/jsx-uses-react.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ module.exports = {
2525

2626
create(context) {
2727
const pragma = pragmaUtil.getFromContext(context);
28+
const fragment = pragmaUtil.getFragmentFromContext(context);
2829

2930
function handleOpeningElement() {
3031
context.markVariableAsUsed(pragma);
@@ -35,7 +36,10 @@ module.exports = {
3536

3637
return {
3738
JSXOpeningElement: handleOpeningElement,
38-
JSXOpeningFragment: handleOpeningElement
39+
JSXOpeningFragment: handleOpeningElement,
40+
JSXFragment() {
41+
context.markVariableAsUsed(fragment);
42+
}
3943
};
4044
}
4145
};

tests/lib/rules/jsx-uses-react.js

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,17 @@ const linter = ruleTester.linter || eslint.linter;
3939
linter.defineRule('jsx-uses-react', require('../../../lib/rules/jsx-uses-react'));
4040

4141
ruleTester.run('no-unused-vars', rule, {
42-
valid: [
42+
valid: [].concat(
4343
{code: '/*eslint jsx-uses-react:1*/ var React; <div />;'},
4444
{code: '/*eslint jsx-uses-react:1*/ var React; (function () { <div /> })();'},
4545
{code: '/*eslint jsx-uses-react:1*/ /** @jsx Foo */ var Foo; <div />;'},
4646
{code: '/*eslint jsx-uses-react:1*/ var Foo; <div />;', settings},
47-
{code: '/*eslint jsx-uses-react:1*/ var React; <></>;', parser: parsers.BABEL_ESLINT}
48-
],
49-
invalid: [{
47+
parsers.TS([
48+
{code: '/*eslint jsx-uses-react:1*/ var Frag; <></>;', settings: {react: {fragment: 'Frag'}}},
49+
{code: '/*eslint jsx-uses-react:1*/ var React; <></>;', parser: parsers.BABEL_ESLINT}
50+
])
51+
),
52+
invalid: [].concat({
5053
code: '/*eslint jsx-uses-react:1*/ var React;',
5154
errors: [{message: '\'React\' is defined but never used.'}]
5255
}, {
@@ -56,10 +59,14 @@ ruleTester.run('no-unused-vars', rule, {
5659
code: '/*eslint jsx-uses-react:1*/ var React; <div />;',
5760
errors: [{message: '\'React\' is defined but never used.'}],
5861
settings
62+
}, parsers.TS([{
63+
code: '/*eslint jsx-uses-react:1*/ var Frag; <></>;',
64+
errors: [{message: '\'Frag\' is defined but never used.'}],
65+
settings: {react: {fragment: 'Fragment'}}
5966
}, {
6067
code: '/*eslint jsx-uses-react:1*/ var React; <></>;',
6168
parser: parsers.BABEL_ESLINT,
6269
errors: [{message: '\'React\' is defined but never used.'}],
6370
settings
64-
}]
71+
}]))
6572
});

0 commit comments

Comments
 (0)