{"id":13400307,"url":"https://github.com/jsx-eslint/eslint-plugin-react","last_synced_at":"2025-09-09T20:39:05.056Z","repository":{"id":24651681,"uuid":"28061676","full_name":"jsx-eslint/eslint-plugin-react","owner":"jsx-eslint","description":"React-specific linting rules for ESLint","archived":false,"fork":false,"pushed_at":"2025-06-04T02:26:11.000Z","size":8415,"stargazers_count":9212,"open_issues_count":349,"forks_count":2751,"subscribers_count":81,"default_branch":"master","last_synced_at":"2025-09-06T19:04:35.131Z","etag":null,"topics":["development","ecmascript","eslint","javascript","lint","react"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jsx-eslint.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"github":["jsx-eslint","ljharb"],"patreon":null,"open_collective":"jsx-eslint","ko_fi":null,"tidelift":"npm/eslint-plugin-jsx-a11y","community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":null}},"created_at":"2014-12-15T23:44:14.000Z","updated_at":"2025-09-05T08:10:50.000Z","dependencies_parsed_at":"2025-02-03T16:46:31.668Z","dependency_job_id":"8eb93cf5-3920-4b22-a47d-511815fe1e71","html_url":"https://github.com/jsx-eslint/eslint-plugin-react","commit_stats":{"total_commits":2764,"total_committers":569,"mean_commits":4.857644991212654,"dds":0.7973950795947902,"last_synced_commit":"4467db503e38b9356517cf6926d11be544ccf4b1"},"previous_names":["yannickcr/eslint-plugin-react"],"tags_count":216,"template":false,"template_full_name":null,"purl":"pkg:github/jsx-eslint/eslint-plugin-react","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jsx-eslint%2Feslint-plugin-react","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jsx-eslint%2Feslint-plugin-react/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jsx-eslint%2Feslint-plugin-react/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jsx-eslint%2Feslint-plugin-react/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jsx-eslint","download_url":"https://codeload.github.com/jsx-eslint/eslint-plugin-react/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jsx-eslint%2Feslint-plugin-react/sbom","scorecard":{"id":539706,"data":{"date":"2025-08-11","repo":{"name":"github.com/jsx-eslint/eslint-plugin-react","commit":"f2869fd6dc76ceb863c5e2aeea8bf4d392508775"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":5.2,"checks":[{"name":"Code-Review","score":2,"reason":"Found 8/30 approved changesets -- score normalized to 2","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Security-Policy","score":10,"reason":"security policy file detected","details":["Info: security policy file detected: SECURITY.md:1","Info: Found linked content: SECURITY.md:1","Info: Found disclosure, vulnerability, and/or timelines in security policy: SECURITY.md:1","Info: Found text in security policy: SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Maintained","score":5,"reason":"1 commit(s) and 5 issue activity found in the last 90 days -- score normalized to 5","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Info: jobLevel 'contents' permission set to 'read': .github/workflows/npm-publish.yml:97","Warn: jobLevel 'contents' permission set to 'write': .github/workflows/release.yml:15","Warn: no topLevel permission defined: .github/workflows/node-18+.yml:1","Warn: no topLevel permission defined: .github/workflows/node-minors.yml:1","Warn: no topLevel permission defined: .github/workflows/node-pretest.yml:1","Info: topLevel 'contents' permission set to 'read': .github/workflows/npm-publish.yml:10","Warn: no topLevel permission defined: .github/workflows/rebase.yml:1","Warn: no topLevel permission defined: .github/workflows/release.yml:1","Warn: no topLevel permission defined: .github/workflows/require-allow-edits.yml:1","Warn: no topLevel permission defined: .github/workflows/smoke-test.yml:1","Info: topLevel 'contents' permission set to 'read': .github/workflows/type-check.yml:6"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: third-party GitHubAction not pinned by hash: .github/workflows/node-18+.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/jsx-eslint/eslint-plugin-react/node-18+.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/node-18+.yml:101: update your workflow using https://app.stepsecurity.io/secureworkflow/jsx-eslint/eslint-plugin-react/node-18+.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/node-18+.yml:102: update your workflow using https://app.stepsecurity.io/secureworkflow/jsx-eslint/eslint-plugin-react/node-18+.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/node-18+.yml:112: update your workflow using https://app.stepsecurity.io/secureworkflow/jsx-eslint/eslint-plugin-react/node-18+.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/node-minors.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/jsx-eslint/eslint-plugin-react/node-minors.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/node-minors.yml:97: update your workflow using https://app.stepsecurity.io/secureworkflow/jsx-eslint/eslint-plugin-react/node-minors.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/node-minors.yml:98: update your workflow using https://app.stepsecurity.io/secureworkflow/jsx-eslint/eslint-plugin-react/node-minors.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/node-minors.yml:110: update your workflow using https://app.stepsecurity.io/secureworkflow/jsx-eslint/eslint-plugin-react/node-minors.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/node-pretest.yml:10: update your workflow using https://app.stepsecurity.io/secureworkflow/jsx-eslint/eslint-plugin-react/node-pretest.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/node-pretest.yml:11: update your workflow using https://app.stepsecurity.io/secureworkflow/jsx-eslint/eslint-plugin-react/node-pretest.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/node-pretest.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/jsx-eslint/eslint-plugin-react/node-pretest.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/node-pretest.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/jsx-eslint/eslint-plugin-react/node-pretest.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/npm-publish.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/jsx-eslint/eslint-plugin-react/npm-publish.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/npm-publish.yml:27: update your workflow using https://app.stepsecurity.io/secureworkflow/jsx-eslint/eslint-plugin-react/npm-publish.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/npm-publish.yml:30: update your workflow using https://app.stepsecurity.io/secureworkflow/jsx-eslint/eslint-plugin-react/npm-publish.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/npm-publish.yml:46: update your workflow using https://app.stepsecurity.io/secureworkflow/jsx-eslint/eslint-plugin-react/npm-publish.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/npm-publish.yml:100: update your workflow using https://app.stepsecurity.io/secureworkflow/jsx-eslint/eslint-plugin-react/npm-publish.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/npm-publish.yml:110: update your workflow using https://app.stepsecurity.io/secureworkflow/jsx-eslint/eslint-plugin-react/npm-publish.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/npm-publish.yml:114: update your workflow using https://app.stepsecurity.io/secureworkflow/jsx-eslint/eslint-plugin-react/npm-publish.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/npm-publish.yml:125: update your workflow using https://app.stepsecurity.io/secureworkflow/jsx-eslint/eslint-plugin-react/npm-publish.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/rebase.yml:7: update your workflow using https://app.stepsecurity.io/secureworkflow/jsx-eslint/eslint-plugin-react/rebase.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/jsx-eslint/eslint-plugin-react/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:32: update your workflow using https://app.stepsecurity.io/secureworkflow/jsx-eslint/eslint-plugin-react/release.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:34: update your workflow using https://app.stepsecurity.io/secureworkflow/jsx-eslint/eslint-plugin-react/release.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:40: update your workflow using https://app.stepsecurity.io/secureworkflow/jsx-eslint/eslint-plugin-react/release.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:75: update your workflow using https://app.stepsecurity.io/secureworkflow/jsx-eslint/eslint-plugin-react/release.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/require-allow-edits.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/jsx-eslint/eslint-plugin-react/require-allow-edits.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/smoke-test.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/jsx-eslint/eslint-plugin-react/smoke-test.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/smoke-test.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/jsx-eslint/eslint-plugin-react/smoke-test.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/smoke-test.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/jsx-eslint/eslint-plugin-react/smoke-test.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/type-check.yml:33: update your workflow using https://app.stepsecurity.io/secureworkflow/jsx-eslint/eslint-plugin-react/type-check.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/type-check.yml:38: update your workflow using https://app.stepsecurity.io/secureworkflow/jsx-eslint/eslint-plugin-react/type-check.yml/master?enable=pin","Warn: npmCommand not pinned by hash: .github/workflows/type-check.yml:61","Warn: npmCommand not pinned by hash: .github/workflows/type-check.yml:65","Info:   0 out of  11 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of  21 third-party GitHubAction dependencies pinned","Info:   0 out of   2 npmCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 8 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-20T07:54:17.868Z","repository_id":24651681,"created_at":"2025-08-20T07:54:17.868Z","updated_at":"2025-08-20T07:54:17.868Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":273986612,"owners_count":25202704,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-06T02:00:13.247Z","response_time":2576,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["development","ecmascript","eslint","javascript","lint","react"],"created_at":"2024-07-30T19:00:50.470Z","updated_at":"2025-09-09T20:39:05.025Z","avatar_url":"https://github.com/jsx-eslint.png","language":"JavaScript","readme":"# `eslint-plugin-react` \u003csup\u003e[![Version Badge][npm-version-svg]][package-url]\u003c/sup\u003e\n\n===================\n\n[![github actions][actions-image]][actions-url]\n[![Maintenance Status][status-image]][status-url]\n[![NPM version][npm-image]][npm-url]\n[![Tidelift][tidelift-image]][tidelift-url]\n\nReact specific linting rules for `eslint`\n\n## Installation\n\n```sh\nnpm install eslint eslint-plugin-react --save-dev\n```\n\nIt is also possible to install ESLint globally rather than locally (using `npm install -g eslint`). However, this is not recommended, and any plugins or shareable configs that you use must be installed locally in either case.\n\n## Configuration (legacy: `.eslintrc*`) \u003ca id=\"configuration\"\u003e\u003c/a\u003e\n\nUse [our preset](#recommended) to get reasonable defaults:\n\n```json\n  \"extends\": [\n    \"eslint:recommended\",\n    \"plugin:react/recommended\"\n  ]\n```\n\nIf you are using the [new JSX transform from React 17](https://reactjs.org/blog/2020/09/22/introducing-the-new-jsx-transform.html#removing-unused-react-imports), extend [`react/jsx-runtime`](https://github.com/jsx-eslint/eslint-plugin-react/blob/c8917b0885094b5e4cc2a6f613f7fb6f16fe932e/index.js#L163-L176) in your eslint config (add `\"plugin:react/jsx-runtime\"` to `\"extends\"`) to disable the relevant rules.\n\nYou should also specify settings that will be shared across all the plugin rules. ([More about eslint shared settings](https://eslint.org/docs/latest/use/configure/configuration-files#configuring-shared-settings))\n\n```json5\n{\n  \"settings\": {\n    \"react\": {\n      \"createClass\": \"createReactClass\", // Regex for Component Factory to use,\n                                         // default to \"createReactClass\"\n      \"pragma\": \"React\",  // Pragma to use, default to \"React\"\n      \"fragment\": \"Fragment\",  // Fragment to use (may be a property of \u003cpragma\u003e), default to \"Fragment\"\n      \"version\": \"detect\", // React version. \"detect\" automatically picks the version you have installed.\n                           // You can also use `16.0`, `16.3`, etc, if you want to override the detected value.\n                           // Defaults to the \"defaultVersion\" setting and warns if missing, and to \"detect\" in the future\n      \"defaultVersion\": \"\", // Default React version to use when the version you have installed cannot be detected.\n                            // If not provided, defaults to the latest React version.\n      \"flowVersion\": \"0.53\" // Flow version\n    },\n    \"propWrapperFunctions\": [\n        // The names of any function used to wrap propTypes, e.g. `forbidExtraProps`. If this isn't set, any propTypes wrapped in a function will be skipped.\n        \"forbidExtraProps\",\n        {\"property\": \"freeze\", \"object\": \"Object\"},\n        {\"property\": \"myFavoriteWrapper\"},\n        // for rules that check exact prop wrappers\n        {\"property\": \"forbidExtraProps\", \"exact\": true}\n    ],\n    \"componentWrapperFunctions\": [\n        // The name of any function used to wrap components, e.g. Mobx `observer` function. If this isn't set, components wrapped by these functions will be skipped.\n        \"observer\", // `property`\n        {\"property\": \"styled\"}, // `object` is optional\n        {\"property\": \"observer\", \"object\": \"Mobx\"},\n        {\"property\": \"observer\", \"object\": \"\u003cpragma\u003e\"} // sets `object` to whatever value `settings.react.pragma` is set to\n    ],\n    \"formComponents\": [\n      // Components used as alternatives to \u003cform\u003e for forms, eg. \u003cForm endpoint={ url } /\u003e\n      \"CustomForm\",\n      {\"name\": \"SimpleForm\", \"formAttribute\": \"endpoint\"},\n      {\"name\": \"Form\", \"formAttribute\": [\"registerEndpoint\", \"loginEndpoint\"]}, // allows specifying multiple properties if necessary\n    ],\n    \"linkComponents\": [\n      // Components used as alternatives to \u003ca\u003e for linking, eg. \u003cLink to={ url } /\u003e\n      \"Hyperlink\",\n      {\"name\": \"MyLink\", \"linkAttribute\": \"to\"},\n      {\"name\": \"Link\", \"linkAttribute\": [\"to\", \"href\"]}, // allows specifying multiple properties if necessary\n    ]\n  }\n}\n```\n\nIf you do not use a preset you will need to specify individual rules and add extra configuration.\n\nAdd \"react\" to the plugins section.\n\n```json\n{\n  \"plugins\": [\n    \"react\"\n  ]\n}\n```\n\nEnable JSX support.\n\nWith `eslint` 2+\n\n```json\n{\n  \"parserOptions\": {\n    \"ecmaFeatures\": {\n      \"jsx\": true\n    }\n  }\n}\n```\n\nEnable the rules that you would like to use.\n\n```json\n  \"rules\": {\n    \"react/jsx-uses-react\": \"error\",\n    \"react/jsx-uses-vars\": \"error\",\n  }\n```\n\n### Shareable configs\n\n#### Recommended\n\nThis plugin exports a `recommended` configuration that enforces React good practices.\n\nTo enable this configuration use the `extends` property in your `.eslintrc` config file:\n\n```json\n{\n  \"extends\": [\"eslint:recommended\", \"plugin:react/recommended\"]\n}\n```\n\nSee [`eslint` documentation](https://eslint.org/docs/user-guide/configuring/configuration-files#extending-configuration-files) for more information about extending configuration files.\n\n#### All\n\nThis plugin also exports an `all` configuration that includes every available rule.\nThis pairs well with the `eslint:all` rule.\n\n```json\n{\n  \"plugins\": [\n    \"react\"\n  ],\n  \"extends\": [\"eslint:all\", \"plugin:react/all\"]\n}\n```\n\n**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).\n\n## Configuration (new: `eslint.config.js`)\n\nFrom [`v8.21.0`](https://github.com/eslint/eslint/releases/tag/v8.21.0), eslint announced a new config system.\nIn the new system, `.eslintrc*` is no longer used. `eslint.config.js` would be the default config file name.\nIn eslint `v8`, the legacy system (`.eslintrc*`) would still be supported, while in eslint `v9`, only the new system would be supported.\n\nAnd from [`v8.23.0`](https://github.com/eslint/eslint/releases/tag/v8.23.0), eslint CLI starts to look up `eslint.config.js`.\n**So, if your eslint is `\u003e=8.23.0`, you're 100% ready to use the new config system.**\n\nYou might want to check out the official blog posts,\n\n- \u003chttps://eslint.org/blog/2022/08/new-config-system-part-1/\u003e\n- \u003chttps://eslint.org/blog/2022/08/new-config-system-part-2/\u003e\n- \u003chttps://eslint.org/blog/2022/08/new-config-system-part-3/\u003e\n\nand the [official docs](https://eslint.org/docs/latest/user-guide/configuring/configuration-files-new).\n\n### Plugin\n\nThe default export of `eslint-plugin-react` is a plugin object.\n\n```js\nconst react = require('eslint-plugin-react');\nconst globals = require('globals');\n\nmodule.exports = [\n  …\n  {\n    files: ['**/*.{js,jsx,mjs,cjs,ts,tsx}'],\n    plugins: {\n      react,\n    },\n    languageOptions: {\n      parserOptions: {\n        ecmaFeatures: {\n          jsx: true,\n        },\n      },\n      globals: {\n        ...globals.browser,\n      },\n    },\n    rules: {\n      // ... any rules you want\n      'react/jsx-uses-react': 'error',\n      'react/jsx-uses-vars': 'error',\n     },\n    // ... others are omitted for brevity\n  },\n  …\n];\n```\n\n### Configuring shared settings\n\nRefer to the [official docs](https://eslint.org/docs/latest/user-guide/configuring/configuration-files-new#configuring-shared-settings).\n\nThe schema of the `settings.react` object would be identical to that of what's already described above in the legacy config section.\n\n\u003c!-- markdownlint-disable-next-line no-duplicate-heading --\u003e\n### Flat Configs\n\nThis plugin exports 3 flat configs:\n\n- `flat.all`\n- `flat.recommended`\n- `flat['jsx-runtime']`\n\nThe flat configs are available via the root plugin import. They will configure the plugin under the `react/` namespace and enable JSX in [`languageOptions.parserOptions`](https://eslint.org/docs/latest/use/configure/language-options#specifying-parser-options).\n\n```js\nconst reactPlugin = require('eslint-plugin-react');\n\nmodule.exports = [\n  …\n  reactPlugin.configs.flat.recommended, // This is not a plugin object, but a shareable config object\n  reactPlugin.configs.flat['jsx-runtime'], // Add this if you are using React 17+\n  …\n];\n```\n\nYou can of course add/override some properties.\n\n**Note**: Our shareable configs does not preconfigure `files` or [`languageOptions.globals`](https://eslint.org/docs/latest/user-guide/configuring/configuration-files-new#configuration-objects).\nFor most of the cases, you probably want to configure some properties by yourself.\n\n```js\nconst reactPlugin = require('eslint-plugin-react');\nconst globals = require('globals');\n\nmodule.exports = [\n  …\n  {\n    files: ['**/*.{js,mjs,cjs,jsx,mjsx,ts,tsx,mtsx}'],\n    ...reactPlugin.configs.flat.recommended,\n    languageOptions: {\n      ...reactPlugin.configs.flat.recommended.languageOptions,\n      globals: {\n        ...globals.serviceworker,\n        ...globals.browser,\n      },\n    },\n  },\n  …\n];\n```\n\nThe above example is same as the example below, as the new config system is based on chaining.\n\n```js\nconst reactPlugin = require('eslint-plugin-react');\nconst globals = require('globals');\n\nmodule.exports = [\n  …\n  {\n    files: ['**/*.{js,mjs,cjs,jsx,mjsx,ts,tsx,mtsx}'],\n    ...reactPlugin.configs.flat.recommended,\n  },\n  {\n    files: ['**/*.{js,mjs,cjs,jsx,mjsx,ts,tsx,mtsx}'],\n    languageOptions: {\n      globals: {\n        ...globals.serviceworker,\n        ...globals.browser,\n      },\n    },\n  },\n  …\n];\n```\n\n## List of supported rules\n\n\u003c!-- begin auto-generated rules list --\u003e\n\n💼 [Configurations](https://github.com/jsx-eslint/eslint-plugin-react/#shareable-configs) enabled in.\\\n🚫 [Configurations](https://github.com/jsx-eslint/eslint-plugin-react/#shareable-configs) disabled in.\\\n🏃 Set in the `jsx-runtime` [configuration](https://github.com/jsx-eslint/eslint-plugin-react/#shareable-configs).\\\n☑️ Set in the `recommended` [configuration](https://github.com/jsx-eslint/eslint-plugin-react/#shareable-configs).\\\n🔧 Automatically fixable by the [`--fix` CLI option](https://eslint.org/docs/user-guide/command-line-interface#--fix).\\\n💡 Manually fixable by [editor suggestions](https://eslint.org/docs/latest/use/core-concepts#rule-suggestions).\\\n❌ Deprecated.\n\n| Name                                                                                         | Description                                                                                                                                  | 💼 | 🚫 | 🔧 | 💡 | ❌  |\n| :------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------- | :- | :- | :- | :- | :- |\n| [boolean-prop-naming](docs/rules/boolean-prop-naming.md)                                     | Enforces consistent naming for boolean props                                                                                                 |    |    |    |    |    |\n| [button-has-type](docs/rules/button-has-type.md)                                             | Disallow usage of `button` elements without an explicit `type` attribute                                                                     |    |    |    |    |    |\n| [checked-requires-onchange-or-readonly](docs/rules/checked-requires-onchange-or-readonly.md) | Enforce using `onChange` or `readonly` attribute when `checked` is used                                                                      |    |    |    |    |    |\n| [default-props-match-prop-types](docs/rules/default-props-match-prop-types.md)               | Enforce all defaultProps have a corresponding non-required PropType                                                                          |    |    |    |    |    |\n| [destructuring-assignment](docs/rules/destructuring-assignment.md)                           | Enforce consistent usage of destructuring assignment of props, state, and context                                                            |    |    | 🔧 |    |    |\n| [display-name](docs/rules/display-name.md)                                                   | Disallow missing displayName in a React component definition                                                                                 | ☑️ |    |    |    |    |\n| [forbid-component-props](docs/rules/forbid-component-props.md)                               | Disallow certain props on components                                                                                                         |    |    |    |    |    |\n| [forbid-dom-props](docs/rules/forbid-dom-props.md)                                           | Disallow certain props on DOM Nodes                                                                                                          |    |    |    |    |    |\n| [forbid-elements](docs/rules/forbid-elements.md)                                             | Disallow certain elements                                                                                                                    |    |    |    |    |    |\n| [forbid-foreign-prop-types](docs/rules/forbid-foreign-prop-types.md)                         | Disallow using another component's propTypes                                                                                                 |    |    |    |    |    |\n| [forbid-prop-types](docs/rules/forbid-prop-types.md)                                         | Disallow certain propTypes                                                                                                                   |    |    |    |    |    |\n| [forward-ref-uses-ref](docs/rules/forward-ref-uses-ref.md)                                   | Require all forwardRef components include a ref parameter                                                                                    |    |    |    | 💡 |    |\n| [function-component-definition](docs/rules/function-component-definition.md)                 | Enforce a specific function type for function components                                                                                     |    |    | 🔧 |    |    |\n| [hook-use-state](docs/rules/hook-use-state.md)                                               | Ensure destructuring and symmetric naming of useState hook value and setter variables                                                        |    |    |    | 💡 |    |\n| [iframe-missing-sandbox](docs/rules/iframe-missing-sandbox.md)                               | Enforce sandbox attribute on iframe elements                                                                                                 |    |    |    |    |    |\n| [jsx-boolean-value](docs/rules/jsx-boolean-value.md)                                         | Enforce boolean attributes notation in JSX                                                                                                   |    |    | 🔧 |    |    |\n| [jsx-child-element-spacing](docs/rules/jsx-child-element-spacing.md)                         | Enforce or disallow spaces inside of curly braces in JSX attributes and expressions                                                          |    |    |    |    |    |\n| [jsx-closing-bracket-location](docs/rules/jsx-closing-bracket-location.md)                   | Enforce closing bracket location in JSX                                                                                                      |    |    | 🔧 |    |    |\n| [jsx-closing-tag-location](docs/rules/jsx-closing-tag-location.md)                           | Enforce closing tag location for multiline JSX                                                                                               |    |    | 🔧 |    |    |\n| [jsx-curly-brace-presence](docs/rules/jsx-curly-brace-presence.md)                           | Disallow unnecessary JSX expressions when literals alone are sufficient or enforce JSX expressions on literals in JSX children or attributes |    |    | 🔧 |    |    |\n| [jsx-curly-newline](docs/rules/jsx-curly-newline.md)                                         | Enforce consistent linebreaks in curly braces in JSX attributes and expressions                                                              |    |    | 🔧 |    |    |\n| [jsx-curly-spacing](docs/rules/jsx-curly-spacing.md)                                         | Enforce or disallow spaces inside of curly braces in JSX attributes and expressions                                                          |    |    | 🔧 |    |    |\n| [jsx-equals-spacing](docs/rules/jsx-equals-spacing.md)                                       | Enforce or disallow spaces around equal signs in JSX attributes                                                                              |    |    | 🔧 |    |    |\n| [jsx-filename-extension](docs/rules/jsx-filename-extension.md)                               | Disallow file extensions that may contain JSX                                                                                                |    |    |    |    |    |\n| [jsx-first-prop-new-line](docs/rules/jsx-first-prop-new-line.md)                             | Enforce proper position of the first property in JSX                                                                                         |    |    | 🔧 |    |    |\n| [jsx-fragments](docs/rules/jsx-fragments.md)                                                 | Enforce shorthand or standard form for React fragments                                                                                       |    |    | 🔧 |    |    |\n| [jsx-handler-names](docs/rules/jsx-handler-names.md)                                         | Enforce event handler naming conventions in JSX                                                                                              |    |    |    |    |    |\n| [jsx-indent](docs/rules/jsx-indent.md)                                                       | Enforce JSX indentation                                                                                                                      |    |    | 🔧 |    |    |\n| [jsx-indent-props](docs/rules/jsx-indent-props.md)                                           | Enforce props indentation in JSX                                                                                                             |    |    | 🔧 |    |    |\n| [jsx-key](docs/rules/jsx-key.md)                                                             | Disallow missing `key` props in iterators/collection literals                                                                                | ☑️ |    |    |    |    |\n| [jsx-max-depth](docs/rules/jsx-max-depth.md)                                                 | Enforce JSX maximum depth                                                                                                                    |    |    |    |    |    |\n| [jsx-max-props-per-line](docs/rules/jsx-max-props-per-line.md)                               | Enforce maximum of props on a single line in JSX                                                                                             |    |    | 🔧 |    |    |\n| [jsx-newline](docs/rules/jsx-newline.md)                                                     | Require or prevent a new line after jsx elements and expressions.                                                                            |    |    | 🔧 |    |    |\n| [jsx-no-bind](docs/rules/jsx-no-bind.md)                                                     | Disallow `.bind()` or arrow functions in JSX props                                                                                           |    |    |    |    |    |\n| [jsx-no-comment-textnodes](docs/rules/jsx-no-comment-textnodes.md)                           | Disallow comments from being inserted as text nodes                                                                                          | ☑️ |    |    |    |    |\n| [jsx-no-constructed-context-values](docs/rules/jsx-no-constructed-context-values.md)         | Disallows JSX context provider values from taking values that will cause needless rerenders                                                  |    |    |    |    |    |\n| [jsx-no-duplicate-props](docs/rules/jsx-no-duplicate-props.md)                               | Disallow duplicate properties in JSX                                                                                                         | ☑️ |    |    |    |    |\n| [jsx-no-leaked-render](docs/rules/jsx-no-leaked-render.md)                                   | Disallow problematic leaked values from being rendered                                                                                       |    |    | 🔧 |    |    |\n| [jsx-no-literals](docs/rules/jsx-no-literals.md)                                             | Disallow usage of string literals in JSX                                                                                                     |    |    |    |    |    |\n| [jsx-no-script-url](docs/rules/jsx-no-script-url.md)                                         | Disallow usage of `javascript:` URLs                                                                                                         |    |    |    |    |    |\n| [jsx-no-target-blank](docs/rules/jsx-no-target-blank.md)                                     | Disallow `target=\"_blank\"` attribute without `rel=\"noreferrer\"`                                                                              | ☑️ |    | 🔧 |    |    |\n| [jsx-no-undef](docs/rules/jsx-no-undef.md)                                                   | Disallow undeclared variables in JSX                                                                                                         | ☑️ |    |    |    |    |\n| [jsx-no-useless-fragment](docs/rules/jsx-no-useless-fragment.md)                             | Disallow unnecessary fragments                                                                                                               |    |    | 🔧 |    |    |\n| [jsx-one-expression-per-line](docs/rules/jsx-one-expression-per-line.md)                     | Require one JSX element per line                                                                                                             |    |    | 🔧 |    |    |\n| [jsx-pascal-case](docs/rules/jsx-pascal-case.md)                                             | Enforce PascalCase for user-defined JSX components                                                                                           |    |    |    |    |    |\n| [jsx-props-no-multi-spaces](docs/rules/jsx-props-no-multi-spaces.md)                         | Disallow multiple spaces between inline JSX props                                                                                            |    |    | 🔧 |    |    |\n| [jsx-props-no-spread-multi](docs/rules/jsx-props-no-spread-multi.md)                         | Disallow JSX prop spreading the same identifier multiple times                                                                               |    |    |    |    |    |\n| [jsx-props-no-spreading](docs/rules/jsx-props-no-spreading.md)                               | Disallow JSX prop spreading                                                                                                                  |    |    |    |    |    |\n| [jsx-sort-default-props](docs/rules/jsx-sort-default-props.md)                               | Enforce defaultProps declarations alphabetical sorting                                                                                       |    |    |    |    | ❌  |\n| [jsx-sort-props](docs/rules/jsx-sort-props.md)                                               | Enforce props alphabetical sorting                                                                                                           |    |    | 🔧 |    |    |\n| [jsx-space-before-closing](docs/rules/jsx-space-before-closing.md)                           | Enforce spacing before closing bracket in JSX                                                                                                |    |    | 🔧 |    | ❌  |\n| [jsx-tag-spacing](docs/rules/jsx-tag-spacing.md)                                             | Enforce whitespace in and around the JSX opening and closing brackets                                                                        |    |    | 🔧 |    |    |\n| [jsx-uses-react](docs/rules/jsx-uses-react.md)                                               | Disallow React to be incorrectly marked as unused                                                                                            | ☑️ | 🏃 |    |    |    |\n| [jsx-uses-vars](docs/rules/jsx-uses-vars.md)                                                 | Disallow variables used in JSX to be incorrectly marked as unused                                                                            | ☑️ |    |    |    |    |\n| [jsx-wrap-multilines](docs/rules/jsx-wrap-multilines.md)                                     | Disallow missing parentheses around multiline JSX                                                                                            |    |    | 🔧 |    |    |\n| [no-access-state-in-setstate](docs/rules/no-access-state-in-setstate.md)                     | Disallow when this.state is accessed within setState                                                                                         |    |    |    |    |    |\n| [no-adjacent-inline-elements](docs/rules/no-adjacent-inline-elements.md)                     | Disallow adjacent inline elements not separated by whitespace.                                                                               |    |    |    |    |    |\n| [no-array-index-key](docs/rules/no-array-index-key.md)                                       | Disallow usage of Array index in keys                                                                                                        |    |    |    |    |    |\n| [no-arrow-function-lifecycle](docs/rules/no-arrow-function-lifecycle.md)                     | Lifecycle methods should be methods on the prototype, not class fields                                                                       |    |    | 🔧 |    |    |\n| [no-children-prop](docs/rules/no-children-prop.md)                                           | Disallow passing of children as props                                                                                                        | ☑️ |    |    |    |    |\n| [no-danger](docs/rules/no-danger.md)                                                         | Disallow usage of dangerous JSX properties                                                                                                   |    |    |    |    |    |\n| [no-danger-with-children](docs/rules/no-danger-with-children.md)                             | Disallow when a DOM element is using both children and dangerouslySetInnerHTML                                                               | ☑️ |    |    |    |    |\n| [no-deprecated](docs/rules/no-deprecated.md)                                                 | Disallow usage of deprecated methods                                                                                                         | ☑️ |    |    |    |    |\n| [no-did-mount-set-state](docs/rules/no-did-mount-set-state.md)                               | Disallow usage of setState in componentDidMount                                                                                              |    |    |    |    |    |\n| [no-did-update-set-state](docs/rules/no-did-update-set-state.md)                             | Disallow usage of setState in componentDidUpdate                                                                                             |    |    |    |    |    |\n| [no-direct-mutation-state](docs/rules/no-direct-mutation-state.md)                           | Disallow direct mutation of this.state                                                                                                       | ☑️ |    |    |    |    |\n| [no-find-dom-node](docs/rules/no-find-dom-node.md)                                           | Disallow usage of findDOMNode                                                                                                                | ☑️ |    |    |    |    |\n| [no-invalid-html-attribute](docs/rules/no-invalid-html-attribute.md)                         | Disallow usage of invalid attributes                                                                                                         |    |    |    | 💡 |    |\n| [no-is-mounted](docs/rules/no-is-mounted.md)                                                 | Disallow usage of isMounted                                                                                                                  | ☑️ |    |    |    |    |\n| [no-multi-comp](docs/rules/no-multi-comp.md)                                                 | Disallow multiple component definition per file                                                                                              |    |    |    |    |    |\n| [no-namespace](docs/rules/no-namespace.md)                                                   | Enforce that namespaces are not used in React elements                                                                                       |    |    |    |    |    |\n| [no-object-type-as-default-prop](docs/rules/no-object-type-as-default-prop.md)               | Disallow usage of referential-type variables as default param in functional component                                                        |    |    |    |    |    |\n| [no-redundant-should-component-update](docs/rules/no-redundant-should-component-update.md)   | Disallow usage of shouldComponentUpdate when extending React.PureComponent                                                                   |    |    |    |    |    |\n| [no-render-return-value](docs/rules/no-render-return-value.md)                               | Disallow usage of the return value of ReactDOM.render                                                                                        | ☑️ |    |    |    |    |\n| [no-set-state](docs/rules/no-set-state.md)                                                   | Disallow usage of setState                                                                                                                   |    |    |    |    |    |\n| [no-string-refs](docs/rules/no-string-refs.md)                                               | Disallow using string references                                                                                                             | ☑️ |    |    |    |    |\n| [no-this-in-sfc](docs/rules/no-this-in-sfc.md)                                               | Disallow `this` from being used in stateless functional components                                                                           |    |    |    |    |    |\n| [no-typos](docs/rules/no-typos.md)                                                           | Disallow common typos                                                                                                                        |    |    |    |    |    |\n| [no-unescaped-entities](docs/rules/no-unescaped-entities.md)                                 | Disallow unescaped HTML entities from appearing in markup                                                                                    | ☑️ |    |    | 💡 |    |\n| [no-unknown-property](docs/rules/no-unknown-property.md)                                     | Disallow usage of unknown DOM property                                                                                                       | ☑️ |    | 🔧 |    |    |\n| [no-unsafe](docs/rules/no-unsafe.md)                                                         | Disallow usage of unsafe lifecycle methods                                                                                                   |    | ☑️ |    |    |    |\n| [no-unstable-nested-components](docs/rules/no-unstable-nested-components.md)                 | Disallow creating unstable components inside components                                                                                      |    |    |    |    |    |\n| [no-unused-class-component-methods](docs/rules/no-unused-class-component-methods.md)         | Disallow declaring unused methods of component class                                                                                         |    |    |    |    |    |\n| [no-unused-prop-types](docs/rules/no-unused-prop-types.md)                                   | Disallow definitions of unused propTypes                                                                                                     |    |    |    |    |    |\n| [no-unused-state](docs/rules/no-unused-state.md)                                             | Disallow definitions of unused state                                                                                                         |    |    |    |    |    |\n| [no-will-update-set-state](docs/rules/no-will-update-set-state.md)                           | Disallow usage of setState in componentWillUpdate                                                                                            |    |    |    |    |    |\n| [prefer-es6-class](docs/rules/prefer-es6-class.md)                                           | Enforce ES5 or ES6 class for React Components                                                                                                |    |    |    |    |    |\n| [prefer-exact-props](docs/rules/prefer-exact-props.md)                                       | Prefer exact proptype definitions                                                                                                            |    |    |    |    |    |\n| [prefer-read-only-props](docs/rules/prefer-read-only-props.md)                               | Enforce that props are read-only                                                                                                             |    |    | 🔧 |    |    |\n| [prefer-stateless-function](docs/rules/prefer-stateless-function.md)                         | Enforce stateless components to be written as a pure function                                                                                |    |    |    |    |    |\n| [prop-types](docs/rules/prop-types.md)                                                       | Disallow missing props validation in a React component definition                                                                            | ☑️ |    |    |    |    |\n| [react-in-jsx-scope](docs/rules/react-in-jsx-scope.md)                                       | Disallow missing React when using JSX                                                                                                        | ☑️ | 🏃 |    |    |    |\n| [require-default-props](docs/rules/require-default-props.md)                                 | Enforce a defaultProps definition for every prop that is not a required prop                                                                 |    |    |    |    |    |\n| [require-optimization](docs/rules/require-optimization.md)                                   | Enforce React components to have a shouldComponentUpdate method                                                                              |    |    |    |    |    |\n| [require-render-return](docs/rules/require-render-return.md)                                 | Enforce ES5 or ES6 class for returning value in render function                                                                              | ☑️ |    |    |    |    |\n| [self-closing-comp](docs/rules/self-closing-comp.md)                                         | Disallow extra closing tags for components without children                                                                                  |    |    | 🔧 |    |    |\n| [sort-comp](docs/rules/sort-comp.md)                                                         | Enforce component methods order                                                                                                              |    |    |    |    |    |\n| [sort-default-props](docs/rules/sort-default-props.md)                                       | Enforce defaultProps declarations alphabetical sorting                                                                                       |    |    |    |    |    |\n| [sort-prop-types](docs/rules/sort-prop-types.md)                                             | Enforce propTypes declarations alphabetical sorting                                                                                          |    |    | 🔧 |    |    |\n| [state-in-constructor](docs/rules/state-in-constructor.md)                                   | Enforce class component state initialization style                                                                                           |    |    |    |    |    |\n| [static-property-placement](docs/rules/static-property-placement.md)                         | Enforces where React component static properties should be positioned.                                                                       |    |    |    |    |    |\n| [style-prop-object](docs/rules/style-prop-object.md)                                         | Enforce style prop value is an object                                                                                                        |    |    |    |    |    |\n| [void-dom-elements-no-children](docs/rules/void-dom-elements-no-children.md)                 | Disallow void DOM elements (e.g. `\u003cimg /\u003e`, `\u003cbr /\u003e`) from receiving children                                                                |    |    |    |    |    |\n\n\u003c!-- end auto-generated rules list --\u003e\n\n## Other useful plugins\n\n- Rules of Hooks: [eslint-plugin-react-hooks](https://github.com/facebook/react/tree/master/packages/eslint-plugin-react-hooks)\n- JSX accessibility: [eslint-plugin-jsx-a11y](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y)\n- React Native: [eslint-plugin-react-native](https://github.com/Intellicode/eslint-plugin-react-native)\n\n## License\n\n`eslint-plugin-react` is licensed under the [MIT License](https://opensource.org/licenses/mit-license.php).\n\n[npm-url]: https://npmjs.org/package/eslint-plugin-react\n[npm-image]: https://img.shields.io/npm/v/eslint-plugin-react.svg\n\n[status-url]: https://github.com/jsx-eslint/eslint-plugin-react/pulse\n[status-image]: https://img.shields.io/github/last-commit/jsx-eslint/eslint-plugin-react.svg\n\n[tidelift-url]: https://tidelift.com/subscription/pkg/npm-eslint-plugin-react?utm_source=npm-eslint-plugin-react\u0026utm_medium=referral\u0026utm_campaign=readme\n[tidelift-image]: https://tidelift.com/badges/package/npm/eslint-plugin-react?style=flat\n\n[package-url]: https://npmjs.org/package/eslint-plugin-react\n[npm-version-svg]: https://versionbadg.es/jsx-eslint/eslint-plugin-react.svg\n\n[actions-image]: https://img.shields.io/endpoint?url=https://github-actions-badge-u3jn4tfpocch.runkit.sh/jsx-eslint/eslint-plugin-react\n[actions-url]: https://github.com/jsx-eslint/eslint-plugin-react/actions\n","funding_links":["https://github.com/sponsors/jsx-eslint","https://github.com/sponsors/ljharb","https://opencollective.com/jsx-eslint","https://tidelift.com/funding/github/npm/eslint-plugin-jsx-a11y","https://tidelift.com/subscription/pkg/npm-eslint-plugin-react?utm_source=npm-eslint-plugin-react\u0026utm_medium=referral\u0026utm_campaign=readme","https://tidelift.com/badges/package/npm/eslint-plugin-react?style=flat"],"categories":["Developer Tools","Uncategorized","Expanding the ESLint configuration","JavaScript","development","react"],"sub_categories":["Uncategorized"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjsx-eslint%2Feslint-plugin-react","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjsx-eslint%2Feslint-plugin-react","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjsx-eslint%2Feslint-plugin-react/lists"}