Skip to content

Commit 6da5609

Browse files
committed
feat: rm exports and mv legacy.js to index.js
1 parent 204da75 commit 6da5609

10 files changed

+259
-252
lines changed

README.md

Lines changed: 44 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ npm install eslint eslint-plugin-react --save-dev
1717

1818
It is also possible to install ESLint globally rather than locally (using npm install eslint --global). However, this is not recommended, and any plugins or shareable configs that you use must be installed locally in either case.
1919

20-
## Configuration (legacy: eslintrc)
20+
## Configuration (legacy: `.eslintrc*`)
2121

2222
Use [our preset](#recommended) to get reasonable defaults:
2323

@@ -141,7 +141,7 @@ This pairs well with the `eslint:all` rule.
141141

142142
**Note**: These configurations will import `eslint-plugin-react` and enable JSX in [parser options](https://eslint.org/docs/user-guide/configuring/language-options#specifying-parser-options).
143143

144-
## Configuration (new: eslint.config.js)
144+
## Configuration (new: `eslint.config.js`)
145145

146146
From [`v8.21.0`](https://github.com/eslint/eslint/releases/tag/v8.21.0), eslint announced a new config system.
147147
In the new system, `.eslintrc*` is no longer used. `eslint.config.js` would be the default config file name.
@@ -162,10 +162,9 @@ and the [official docs](https://eslint.org/docs/latest/user-guide/configuring/co
162162

163163
The default export of `eslint-plugin-react` is a plugin object.
164164

165-
If your `eslint.config.js` is ESM, you can import and use the plugin like this.
166-
167165
```js
168166
import react from 'eslint-plugin-react'
167+
import globals from 'globals'
169168

170169
export default [
171170
// --- snip ---
@@ -180,6 +179,9 @@ export default [
180179
jsx: true,
181180
},
182181
},
182+
globals: {
183+
...globals.browser
184+
},
183185
},
184186
rules: {
185187
// ... any rules you want
@@ -192,21 +194,6 @@ export default [
192194
]
193195
```
194196

195-
If your `eslint.config.js` is CJS, you can `require()` different entrypoint like this.
196-
197-
```js
198-
const react = require('eslint-plugin-react/new') // <== trailing '/new'
199-
200-
module.exports = [
201-
{
202-
// ... others are omitted for brevity
203-
plugins: {
204-
react,
205-
},
206-
},
207-
]
208-
```
209-
210197
### Configuring shared settings
211198

212199
Refer to the [official docs](https://eslint.org/docs/latest/user-guide/configuring/configuration-files-new#configuring-shared-settings).
@@ -222,17 +209,15 @@ There're also 3 shareable configs.
222209
- `eslint-plugin-react/recommended`
223210
- `eslint-plugin-react/jsx-runtime`
224211

225-
Unlike plugin, entrypoints of these shareable configs are same no matter whether you use ESM or CJS.
212+
If your eslint.config.js is ESM, put `.js` extension, like `eslint-plugin-react/recommended.js`
226213

227214
**Note**: These configurations will import `eslint-plugin-react` and enable JSX in [`languageOptions.parserOptions`](https://eslint.org/docs/latest/user-guide/configuring/configuration-files-new#configuration-objects).
228215

229216
In the new config system, `plugin:` protocol(e.g. `plugin:react/recommended`) is no longer valid.
230217
As eslint does not automatically import the preset config (shareable config), you explicitly do it by yourself.
231218

232-
**Note**: The new plugin object does not have `configs` property as well.
233-
234219
```js
235-
import react from 'eslint-plugin-react/recommended' // <== trailing '/recommended'
220+
import react from 'eslint-plugin-react/recommended.js'
236221

237222
export default [
238223
// --- snip ---
@@ -243,22 +228,51 @@ export default [
243228

244229
You can of course add/override some properties.
245230

246-
**Note**: Our shareable configs does not preconfigure `files`, which means it's `['**/*.js']` by default.
247-
For most of the cases, you probably want to configure by yourself.
231+
**Note**: Our shareable configs does not preconfigure `files` or [`languageOptions.globals`](https://eslint.org/docs/latest/user-guide/configuring/configuration-files-new#configuration-objects).
232+
For most of the cases, you probably want to configure some properties by yourself.
248233

249234
```js
250-
import react from 'eslint-plugin-react/recommended'
235+
import react from 'eslint-plugin-react/recommended.js'
251236
import globals from 'globals'
252237

253238
export default [
254239
// --- snip ---
255240
{
256241
...react,
257242
files: ['**/*.{jsx,tsx}'],
258-
globals: {
259-
...globals.serviceworker,
260-
...globals.browser
261-
},
243+
languageOptions: {
244+
...react.languageOptions,
245+
globals: {
246+
...globals.serviceworker,
247+
...globals.browser
248+
},
249+
}
250+
251+
},
252+
// --- snip ---
253+
]
254+
```
255+
256+
The above example is same as the example below, as the new config system is based on chaining.
257+
258+
```js
259+
import jsxA11y from 'eslint-plugin-react/recommended.js'
260+
import globals from 'globals'
261+
262+
export default [
263+
// --- snip ---
264+
{
265+
...jsxA11y,
266+
files: ['**/*.{jsx,tsx}'],
267+
},
268+
{
269+
files: ['**/*.{jsx,tsx}'],
270+
languageOptions: {
271+
globals: {
272+
...globals.serviceworker,
273+
...globals.browser
274+
},
275+
}
262276
},
263277
// --- snip ---
264278
]

all.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
'use strict';
2+
3+
module.exports = require('./configs/all');

configs/all.js

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,20 @@
11
'use strict';
22

3-
const recommended = require('./recommended');
4-
const legacy = require('../legacy');
3+
const react = require('../index');
54

6-
module.exports = Object.assign({}, recommended, {
7-
rules: legacy.configs.all.rules,
8-
});
5+
const plugin = Object.assign({}, react);
6+
delete plugin.configs;
7+
8+
module.exports = {
9+
plugins: {
10+
react: plugin,
11+
},
12+
languageOptions: {
13+
parserOptions: {
14+
ecmaFeatures: {
15+
jsx: true,
16+
},
17+
},
18+
},
19+
rules: react.configs.all.rules,
20+
};

configs/jsx-runtime.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
'use strict';
22

3-
const recommended = require('./recommended');
3+
const all = require('./all');
44

5-
module.exports = Object.assign({}, recommended, {
5+
module.exports = Object.assign({}, all, {
66
rules: {
77
'react/react-in-jsx-scope': 0,
88
'react/jsx-uses-react': 0,

configs/recommended.js

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,8 @@
11
'use strict';
22

3+
const all = require('./all');
34
const react = require('../index');
4-
const legacy = require('../legacy');
55

6-
module.exports = {
7-
plugins: {
8-
react,
9-
},
10-
languageOptions: {
11-
parserOptions: {
12-
ecmaFeatures: {
13-
jsx: true,
14-
},
15-
},
16-
},
17-
rules: legacy.configs.recommended.rules,
18-
};
6+
module.exports = Object.assign({}, all, {
7+
rules: react.configs.recommended.rules,
8+
});

index.js

Lines changed: 182 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,187 @@
11
'use strict';
22

3-
const legacy = require('./legacy');
3+
const fromEntries = require('object.fromentries');
4+
const entries = require('object.entries');
5+
6+
/* eslint-disable global-require */
7+
const allRules = {
8+
'boolean-prop-naming': require('./lib/rules/boolean-prop-naming'),
9+
'button-has-type': require('./lib/rules/button-has-type'),
10+
'default-props-match-prop-types': require('./lib/rules/default-props-match-prop-types'),
11+
'destructuring-assignment': require('./lib/rules/destructuring-assignment'),
12+
'display-name': require('./lib/rules/display-name'),
13+
'forbid-component-props': require('./lib/rules/forbid-component-props'),
14+
'forbid-dom-props': require('./lib/rules/forbid-dom-props'),
15+
'forbid-elements': require('./lib/rules/forbid-elements'),
16+
'forbid-foreign-prop-types': require('./lib/rules/forbid-foreign-prop-types'),
17+
'forbid-prop-types': require('./lib/rules/forbid-prop-types'),
18+
'function-component-definition': require('./lib/rules/function-component-definition'),
19+
'hook-use-state': require('./lib/rules/hook-use-state'),
20+
'iframe-missing-sandbox': require('./lib/rules/iframe-missing-sandbox'),
21+
'jsx-boolean-value': require('./lib/rules/jsx-boolean-value'),
22+
'jsx-child-element-spacing': require('./lib/rules/jsx-child-element-spacing'),
23+
'jsx-closing-bracket-location': require('./lib/rules/jsx-closing-bracket-location'),
24+
'jsx-closing-tag-location': require('./lib/rules/jsx-closing-tag-location'),
25+
'jsx-curly-spacing': require('./lib/rules/jsx-curly-spacing'),
26+
'jsx-curly-newline': require('./lib/rules/jsx-curly-newline'),
27+
'jsx-equals-spacing': require('./lib/rules/jsx-equals-spacing'),
28+
'jsx-filename-extension': require('./lib/rules/jsx-filename-extension'),
29+
'jsx-first-prop-new-line': require('./lib/rules/jsx-first-prop-new-line'),
30+
'jsx-handler-names': require('./lib/rules/jsx-handler-names'),
31+
'jsx-indent': require('./lib/rules/jsx-indent'),
32+
'jsx-indent-props': require('./lib/rules/jsx-indent-props'),
33+
'jsx-key': require('./lib/rules/jsx-key'),
34+
'jsx-max-depth': require('./lib/rules/jsx-max-depth'),
35+
'jsx-max-props-per-line': require('./lib/rules/jsx-max-props-per-line'),
36+
'jsx-newline': require('./lib/rules/jsx-newline'),
37+
'jsx-no-bind': require('./lib/rules/jsx-no-bind'),
38+
'jsx-no-comment-textnodes': require('./lib/rules/jsx-no-comment-textnodes'),
39+
'jsx-no-constructed-context-values': require('./lib/rules/jsx-no-constructed-context-values'),
40+
'jsx-no-duplicate-props': require('./lib/rules/jsx-no-duplicate-props'),
41+
'jsx-no-leaked-render': require('./lib/rules/jsx-no-leaked-render'),
42+
'jsx-no-literals': require('./lib/rules/jsx-no-literals'),
43+
'jsx-no-script-url': require('./lib/rules/jsx-no-script-url'),
44+
'jsx-no-target-blank': require('./lib/rules/jsx-no-target-blank'),
45+
'jsx-no-useless-fragment': require('./lib/rules/jsx-no-useless-fragment'),
46+
'jsx-one-expression-per-line': require('./lib/rules/jsx-one-expression-per-line'),
47+
'jsx-no-undef': require('./lib/rules/jsx-no-undef'),
48+
'jsx-curly-brace-presence': require('./lib/rules/jsx-curly-brace-presence'),
49+
'jsx-pascal-case': require('./lib/rules/jsx-pascal-case'),
50+
'jsx-fragments': require('./lib/rules/jsx-fragments'),
51+
'jsx-props-no-multi-spaces': require('./lib/rules/jsx-props-no-multi-spaces'),
52+
'jsx-props-no-spreading': require('./lib/rules/jsx-props-no-spreading'),
53+
'jsx-sort-default-props': require('./lib/rules/jsx-sort-default-props'),
54+
'jsx-sort-props': require('./lib/rules/jsx-sort-props'),
55+
'jsx-space-before-closing': require('./lib/rules/jsx-space-before-closing'),
56+
'jsx-tag-spacing': require('./lib/rules/jsx-tag-spacing'),
57+
'jsx-uses-react': require('./lib/rules/jsx-uses-react'),
58+
'jsx-uses-vars': require('./lib/rules/jsx-uses-vars'),
59+
'jsx-wrap-multilines': require('./lib/rules/jsx-wrap-multilines'),
60+
'no-invalid-html-attribute': require('./lib/rules/no-invalid-html-attribute'),
61+
'no-access-state-in-setstate': require('./lib/rules/no-access-state-in-setstate'),
62+
'no-adjacent-inline-elements': require('./lib/rules/no-adjacent-inline-elements'),
63+
'no-array-index-key': require('./lib/rules/no-array-index-key'),
64+
'no-arrow-function-lifecycle': require('./lib/rules/no-arrow-function-lifecycle'),
65+
'no-children-prop': require('./lib/rules/no-children-prop'),
66+
'no-danger': require('./lib/rules/no-danger'),
67+
'no-danger-with-children': require('./lib/rules/no-danger-with-children'),
68+
'no-deprecated': require('./lib/rules/no-deprecated'),
69+
'no-did-mount-set-state': require('./lib/rules/no-did-mount-set-state'),
70+
'no-did-update-set-state': require('./lib/rules/no-did-update-set-state'),
71+
'no-direct-mutation-state': require('./lib/rules/no-direct-mutation-state'),
72+
'no-find-dom-node': require('./lib/rules/no-find-dom-node'),
73+
'no-is-mounted': require('./lib/rules/no-is-mounted'),
74+
'no-multi-comp': require('./lib/rules/no-multi-comp'),
75+
'no-namespace': require('./lib/rules/no-namespace'),
76+
'no-set-state': require('./lib/rules/no-set-state'),
77+
'no-string-refs': require('./lib/rules/no-string-refs'),
78+
'no-redundant-should-component-update': require('./lib/rules/no-redundant-should-component-update'),
79+
'no-render-return-value': require('./lib/rules/no-render-return-value'),
80+
'no-this-in-sfc': require('./lib/rules/no-this-in-sfc'),
81+
'no-typos': require('./lib/rules/no-typos'),
82+
'no-unescaped-entities': require('./lib/rules/no-unescaped-entities'),
83+
'no-unknown-property': require('./lib/rules/no-unknown-property'),
84+
'no-unsafe': require('./lib/rules/no-unsafe'),
85+
'no-unstable-nested-components': require('./lib/rules/no-unstable-nested-components'),
86+
'no-unused-class-component-methods': require('./lib/rules/no-unused-class-component-methods'),
87+
'no-unused-prop-types': require('./lib/rules/no-unused-prop-types'),
88+
'no-unused-state': require('./lib/rules/no-unused-state'),
89+
'no-will-update-set-state': require('./lib/rules/no-will-update-set-state'),
90+
'prefer-es6-class': require('./lib/rules/prefer-es6-class'),
91+
'prefer-exact-props': require('./lib/rules/prefer-exact-props'),
92+
'prefer-read-only-props': require('./lib/rules/prefer-read-only-props'),
93+
'prefer-stateless-function': require('./lib/rules/prefer-stateless-function'),
94+
'prop-types': require('./lib/rules/prop-types'),
95+
'react-in-jsx-scope': require('./lib/rules/react-in-jsx-scope'),
96+
'require-default-props': require('./lib/rules/require-default-props'),
97+
'require-optimization': require('./lib/rules/require-optimization'),
98+
'require-render-return': require('./lib/rules/require-render-return'),
99+
'self-closing-comp': require('./lib/rules/self-closing-comp'),
100+
'sort-comp': require('./lib/rules/sort-comp'),
101+
'sort-prop-types': require('./lib/rules/sort-prop-types'),
102+
'state-in-constructor': require('./lib/rules/state-in-constructor'),
103+
'static-property-placement': require('./lib/rules/static-property-placement'),
104+
'style-prop-object': require('./lib/rules/style-prop-object'),
105+
'void-dom-elements-no-children': require('./lib/rules/void-dom-elements-no-children'),
106+
};
107+
/* eslint-enable */
108+
109+
function filterRules(rules, predicate) {
110+
return fromEntries(entries(rules).filter((entry) => predicate(entry[1])));
111+
}
112+
113+
function configureAsError(rules) {
114+
return fromEntries(Object.keys(rules).map((key) => [`react/${key}`, 2]));
115+
}
116+
117+
const activeRules = filterRules(allRules, (rule) => !rule.meta.deprecated);
118+
const activeRulesConfig = configureAsError(activeRules);
119+
120+
const deprecatedRules = filterRules(allRules, (rule) => rule.meta.deprecated);
4121

5122
module.exports = {
6-
deprecatedRules: legacy.deprecatedRules,
7-
rules: legacy.rules,
123+
deprecatedRules,
124+
rules: allRules,
125+
configs: {
126+
recommended: {
127+
plugins: [
128+
'react',
129+
],
130+
parserOptions: {
131+
ecmaFeatures: {
132+
jsx: true,
133+
},
134+
},
135+
rules: {
136+
'react/display-name': 2,
137+
'react/jsx-key': 2,
138+
'react/jsx-no-comment-textnodes': 2,
139+
'react/jsx-no-duplicate-props': 2,
140+
'react/jsx-no-target-blank': 2,
141+
'react/jsx-no-undef': 2,
142+
'react/jsx-uses-react': 2,
143+
'react/jsx-uses-vars': 2,
144+
'react/no-children-prop': 2,
145+
'react/no-danger-with-children': 2,
146+
'react/no-deprecated': 2,
147+
'react/no-direct-mutation-state': 2,
148+
'react/no-find-dom-node': 2,
149+
'react/no-is-mounted': 2,
150+
'react/no-render-return-value': 2,
151+
'react/no-string-refs': 2,
152+
'react/no-unescaped-entities': 2,
153+
'react/no-unknown-property': 2,
154+
'react/no-unsafe': 0,
155+
'react/prop-types': 2,
156+
'react/react-in-jsx-scope': 2,
157+
'react/require-render-return': 2,
158+
},
159+
},
160+
all: {
161+
plugins: [
162+
'react',
163+
],
164+
parserOptions: {
165+
ecmaFeatures: {
166+
jsx: true,
167+
},
168+
},
169+
rules: activeRulesConfig,
170+
},
171+
'jsx-runtime': {
172+
plugins: [
173+
'react',
174+
],
175+
parserOptions: {
176+
ecmaFeatures: {
177+
jsx: true,
178+
},
179+
jsxPragma: null, // for @typescript/eslint-parser
180+
},
181+
rules: {
182+
'react/react-in-jsx-scope': 0,
183+
'react/jsx-uses-react': 0,
184+
},
185+
},
186+
},
8187
};

jsx-runtime.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
'use strict';
2+
3+
module.exports = require('./configs/jsx-runtime');

0 commit comments

Comments
 (0)