-
- Notifications
You must be signed in to change notification settings - Fork 2.8k
Closed
Labels
Description
Is there an existing issue for this?
- I have searched the existing issues and my issue is unique
- My issue appears in the command-line and not only in the text editor
Description Overview
Repro
// eslint.config.js import eslintReact from 'eslint-plugin-react'; import eslintReactRecommended from 'eslint-plugin-react/configs/recommended.js'; export default [ { plugins: { react: eslintReact, }, }, eslintReactRecommended, ];
npx eslint eslint.config.js
Expected
No errors
Actual
Oops! Something went wrong! :( ESLint: 8.56.0 Error: Key "plugins": Cannot redefine plugin "react".
More Info
When defining a plugin key in the flat config ESLint enforces that you only ever redefine they key with the same plugin. This check is done by comparing by reference -- i.e. configA.plugin.react === configB.plugin.react
eslint-plugin-react
fails this check because it defines its "plugin" in two locations:
Lines 14 to 31 in 36e791d
module.exports = { | |
deprecatedRules: configAll.plugins.react.deprecatedRules, | |
rules: allRules, | |
configs: { | |
recommended: Object.assign({}, configRecommended, { | |
parserOptions: configRecommended.languageOptions.parserOptions, | |
plugins, | |
}), | |
all: Object.assign({}, configAll, { | |
parserOptions: configAll.languageOptions.parserOptions, | |
plugins, | |
}), | |
'jsx-runtime': Object.assign({}, configRuntime, { | |
parserOptions: configRuntime.languageOptions.parserOptions, | |
plugins, | |
}), | |
}, | |
}; |
eslint-plugin-react/configs/all.js
Lines 23 to 26 in 36e791d
react: { | |
deprecatedRules, | |
rules: allRules, | |
}, |
For this to work there needs to be exactly 1 copy of the "plugin" defined by the package.
For example:
const plugin = { ... }; plugin.configs = { recommended: { plugins: { react: plugin }, rules: { ... }, }, all: { plugins: { react: plugin }, rules: { ... }, }, });
eslint-plugin-react version
v7.33.2
eslint version
v8.56.0
node version
v20.11.0
ljharb, kusotenpa, silverwind, Alconix and ganevdev