Skip to content

Commit cd57a1d

Browse files
committed
[Fix] prevent circular dependency in index and "all" config
Fixes jsx-eslint#3519
1 parent c8f2813 commit cd57a1d

File tree

5 files changed

+125
-113
lines changed

5 files changed

+125
-113
lines changed

CHANGELOG.md

+5
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@ This change log adheres to standards from [Keep a CHANGELOG](https://keepachange
55

66
## Unreleased
77

8+
### Fixed
9+
* prevent circular dependency in index and "all" config ([#3519][] @ljharb)
10+
11+
[#3519]: https://github.com/jsx-eslint/eslint-plugin-react/issues/3519
12+
813
## [7.32.0] - 2023.01.10
914

1015
### Added

configs/all.js

+3-111
Original file line numberDiff line numberDiff line change
@@ -1,118 +1,10 @@
11
'use strict';
22

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

1135
module.exports = {
1146
plugins: {
115-
react: plugin,
7+
react: { rules },
1168
},
1179
languageOptions: {
11810
parserOptions: {
@@ -121,7 +13,7 @@ module.exports = {
12113
},
12214
},
12315
},
124-
rules: allRules,
16+
rules,
12517
};
12618

12719
// this is so the `languageOptions` property won't be warned in the new config system

index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ const configAll = require('./configs/all');
77
const configRecommended = require('./configs/recommended');
88
const configRuntime = require('./configs/jsx-runtime');
99

10-
const allRules = configAll.rules;
10+
const allRules = require('./lib/rules');
1111

1212
function filterRules(rules, predicate) {
1313
return fromEntries(entries(rules).filter((entry) => predicate(entry[1])));

lib/rules/index.js

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

tests/index.js

+10-1
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@ const fs = require('fs');
77
const path = require('path');
88

99
const plugin = require('..');
10+
const index = require('../lib/rules');
1011

1112
const ruleFiles = fs.readdirSync(path.resolve(__dirname, '../lib/rules/'))
12-
.map((f) => path.basename(f, '.js'));
13+
.map((f) => path.basename(f, '.js'))
14+
.filter((f) => f !== 'index');
1315

1416
describe('all rule files should be exported by the plugin', () => {
1517
ruleFiles.forEach((ruleName) => {
@@ -19,6 +21,13 @@ describe('all rule files should be exported by the plugin', () => {
1921
require(path.join('../lib/rules', ruleName)) // eslint-disable-line global-require, import/no-dynamic-require
2022
);
2123
});
24+
25+
it(`should export ${ruleName} from lib/rules/index`, () => {
26+
assert.equal(
27+
plugin.rules[ruleName],
28+
index[ruleName] // eslint-disable-line global-require, import/no-dynamic-require
29+
);
30+
});
2231
});
2332
});
2433

0 commit comments

Comments
 (0)