Compare commits

..

217 Commits

Author SHA1 Message Date
Christian Vuerings
0e2ef178a2 Add code of conduct
Airbnb has adopted a [Code of Conduct](https://airbnb.io/codeofconduct/) that applies to all open source projects. This addition ensures project participants understand community standards and provides clear reporting mechanisms for violations.

Source is a copy from https://github.com/airbnb/swift/blob/master/CODE_OF_CONDUCT.md
2025-09-17 11:12:44 -07:00
Christian Vuerings
99ade7a6b1 Add code of conduct
Airbnb has adopted a Code of Conduct that applies to all open source projects. This addition ensures project participants understand community standards and provides clear reporting mechanisms for violations.
2025-09-17 18:52:54 +02:00
ptmkenny
11f986fdc7 [eslint config] [deps] update eslint-plugin-react-hooks 2024-12-07 13:03:23 +09:00
Matheus Felipe
6499695ac1 [readme] update link to es5 and es6 compat table in readme 2023-10-13 04:58:10 -03:00
Anees Iqbal
f45bd1ebc0 [eslint config] [*] [fix] fix crash in eslint invocation with TIMING env set 2024-10-02 01:14:01 +04:00
Richard Klees
e6080c7bee [readme] add ILIAS to users 2023-05-11 17:30:30 +02:00
“naandalist”
b912288e4b [readme] Remove dead URLs 2024-09-22 05:00:08 +07:00
Kim Minh Thắng
39b970f702 Add Zit Software to In the Wild
Signed-off-by: Kim Minh Thắng <thangved02@gmail.com>
2024-09-24 14:42:47 +07:00
Ngene Arinzechukwu
d1705c389e [guide] [css] Added what BEM stands for (Block Element Modifier) 2024-02-19 16:47:10 +01:00
Jordan Harband
e6f292286b [eslint config] [*] [deps] update deps 2024-09-20 22:39:53 -07:00
Jordan Harband
7a8f568769 [eslint config] [patch] add new disabled react rules 2024-09-20 22:36:49 -07:00
Hadi
c25bce83be [readme] replace dead link with archive.org link 2024-04-07 19:18:29 +01:00
Riaz
f20eca9f64 [guide] fix compat table URL
https://kangax.github.io/compat-table/es6/ hit a 404 error,

URL: https://compat-table.github.io/compat-table/es6/
2024-03-25 13:00:44 +04:00
Jordan Harband
932951adc2 [eslint config] [deps] update eslint-plugin-react 2024-03-25 09:31:09 -07:00
Jordan Harband
5f019b1b11 [eslint config] [*] [dev deps] update tape 2024-03-25 09:28:53 -07:00
Jordan Harband
b23992033c [eslint config] [patch] jsx-a11y/no-redundant-roles: allow nav to have navigation role 2024-01-30 10:59:47 -08:00
Jordan Harband
09adc22031 [eslint config] [patch] jsx-a11y/no-noninteractive-tabindex: allow expression values 2024-01-30 10:59:23 -08:00
Jordan Harband
51a37d0fa5 [eslint config] [*] [robustness] cache static builtins 2024-01-27 21:02:05 -08:00
43081j
0681a43e0a [eslint config] [*] [refactor] remove object.entries dependency
This removes the `object.entries` package and uses the widely available built-in native `Object.entries`.
2024-01-04 19:14:38 +00:00
Jordan Harband
55899b57a6 [eslint config] [*] [deps] update deps 2024-01-27 21:08:54 -08:00
Jordan Harband
e95b1f2754 [eslint config] [base] add new disabled rules 2024-01-27 21:07:02 -08:00
Vahid Mohammadi
11ab37144b [eslint config] [base] [patch] Add a message for confusing-browser-globals 2023-08-21 15:43:54 +01:00
savalaram-redkar
46ae3e2256 [readme] Add Object.hasOwn to section 3.7 2023-08-15 20:24:16 +05:30
hamzahuda
cb191776db [readme] correct no-use-before-define justification
The recommendation is to declare the variables, classes and functions before. So the contrasting negative example should say after.
2023-08-12 12:19:30 +01:00
Joe Mornin
cda44dad40 [guide] Add commas to Truth, Equality, and JavaScript
Co-authored-by: Jordan Harband <ljharb@gmail.com>
2023-08-01 09:25:54 -07:00
Joe Mornin
2fc5e2d52c [guide] fix grammar 2023-08-02 13:16:48 -07:00
Jordan Harband
749f4c2bd0 [eslint config] [deps] update eslint-plugin-react 2023-08-05 12:06:55 +12:00
Jordan Harband
4aee38f1e7 [eslint config] [*] [deps] update eslint-plugin-import, @babel/runtime, tape 2023-08-05 12:05:40 +12:00
Jordan Harband
18a08b862b [Dev Deps] update markdownlint, markdownlint-cli 2023-08-05 11:55:23 +12:00
Khadija-Batool
fd77bbebb7 [guide] add nullish-coalescing-operator definition 2023-07-02 23:51:01 +05:00
Jordan Harband
7916d6f538 [guide] Add documentation for no-use-before-define rule under hoisting section 2023-05-15 10:21:09 -07:00
zhesha
01f046dc05 [guide] added second link to eslint rule for item 7.1 2023-05-23 15:10:23 +03:00
Jordan Harband
0f3ca32323 [eslint config] [*] [deps] update object.entries 2023-05-15 10:21:09 -07:00
Jordan Harband
95b6b43d63 [eslint-config] [*] [dev deps] update @babel/runtime 2023-05-15 10:20:15 -07:00
Jordan Harband
240a3789db [Dev Deps] update markdownlint, markdownlint-cli 2023-05-15 10:19:05 -07:00
Jordan Harband
0e627e2fa3 [readme] update eslint plugin repo URLs 2023-05-15 10:15:59 -07:00
Christian Koop
7982931ba7 [readme] Updates ESLint rule in section 12.3 (exponentiation-operator)
The change itself has already been made in f3d3a075cd
(tracked in/acording to https://github.com/airbnb/javascript/issues/2421#issuecomment-1371305010).


#2421
Remove Math.pow from `no-restricted-properties` and use `prefer-exponentiation-operator` instead.
2023-05-02 19:49:09 +02:00
Felipe Garcia Diaz
69fc1bf195 spell checking, fixed grammar error. 2023-04-28 03:33:28 -04:00
syedmouaazfarrukh
5c01a10949 [readme] added JavaScript Roadmap link 2023-02-07 11:17:51 -08:00
Jordan Harband
bf536566ce [eslint config] [deps] update eslint-plugin-react, eslint-plugin-jsx-a11y 2023-02-08 22:59:18 -08:00
Jordan Harband
917c8d92a3 [*] [deps] update eslint-plugin-import 2023-02-08 22:19:53 -08:00
Jordan Harband
8091e39343 [*] [dev deps] update @babel/runtime, tape 2023-02-08 22:11:42 -08:00
Jordan Harband
fd96a4fd57 [eslint config] [*] [refactor] use object spread instead of Object.assign 2022-12-30 14:48:36 -08:00
Mustafa UZUN
81157eec23 [guide] add Object.hasOwn 2022-11-17 20:15:09 +03:00
Mert Can Altın
4ef69edc63 [Tests] refactor test paths 2022-12-04 00:32:01 +03:00
Mustafa UZUN
d601701730 [readme] wayback machine, or remove, broken links 2022-10-30 02:00:29 +03:00
Mustafa UZUN
49d08a2f13 [readme] prefer const/let over var in examples
2.1 Use const for all of your references; avoid using var. eslint: prefer-const, no-const-assign
2022-10-29 23:49:43 +03:00
Pushpendra Pal
0d747c6d96 [readme] add space before code blocks 2022-11-14 04:54:20 +05:30
Jordan Harband
1fb7d76add [eslint config] [patch] add new disabled core rules 2022-11-17 13:56:33 -08:00
Maksim Ploski
38f1488918 [guide] fix typo in space-before-blocks 2022-10-31 21:57:59 +03:00
Mustafa UZUN
c6b1a43c48 [guide] rename qux to quux
Fixes #2661
2022-10-26 13:44:17 +03:00
Mustafa UZUN
6947138ee3 [guide] add comma to the end of the property 2022-10-26 16:17:38 +03:00
Mustafa UZUN
6fb4f8e878 [guide] add Optional Chaining 2022-10-26 00:06:26 +03:00
Mustafa UZUN
ca0ff97f17 [guide] add Nullish Coalescing operator 2022-10-25 23:26:56 +03:00
Mustafa UZUN
0b1f62372e [editorial] convert example to use single instead of double quotes 2022-10-25 16:03:37 +03:00
Jordan Harband
7dbb7b154f [eslint config] [base] add disabled logical-assignment-operators rule 2022-10-25 09:42:25 -07:00
Jordan Harband
75a908aacf [eslint config] [deps] update eslint-plugin-jsx-a11y, eslint-plugin-react, eslint-plugin-react-hooks 2022-09-18 22:21:48 -07:00
Jordan Harband
f6f63b89f6 [eslint config] [*] [deps] update object.assign 2022-09-18 22:18:57 -07:00
Jordan Harband
866f441d05 [eslint config] [*] update @babel/runtime, tape 2022-09-18 22:18:17 -07:00
Jordan Harband
5143a7a97a [Dev Deps] update markdownlint, markdownlint-cli 2022-09-18 22:16:08 -07:00
Jordan Harband
3cbf96de7c [eslint config] [base] no-alert: add TODO comment 2022-09-18 22:08:04 -07:00
Haoqun Jiang
5155aa5fc1 [eslint config] [base] disable the deprecated no-spaced-func rule
This rule was deprecated since ESLint v3.3.0 and replaced by the
`func-call-spacing` rule.
https://eslint.org/docs/latest/rules/no-spaced-func

`func-call-spacing` was enabled in this package long ago:
27dcb99c6d

So there's no need for it to stay in the ruleset.

Besides, it is causing some tricky issues when overriding the rules for
TypeScript support (https://github.com/iamturns/eslint-config-airbnb-typescript/issues/246)
2022-08-08 21:56:10 +08:00
Michael Orzel
cbf9ade10a [guide] Added period to 4.4 for formatting consistency. 2021-07-02 09:40:46 -04:00
Jordan Harband
206d25b55a [eslint config] [deps] update eslint-plugin-react 2022-05-24 08:52:07 -07:00
Jordan Harband
a0e94052d5 [eslint config] [*] [dev deps] update @babel/runtime 2022-05-24 08:49:47 -07:00
Joe Lencioni
42c0e2ea13 Fix typo in eslint-config-airbnb-base changelog 2022-05-24 09:52:05 -05:00
terrablue
7fdc87a8be [guide] fix eslint core rule URLs
- fix broken eslint eol-last link
 - remove .html ending in eslint urls
2022-05-03 19:06:48 +02:00
Jordan Harband
1677ba6c6a [eslint config] [meta] update eslint-plugin-react repo URLs 2022-05-03 10:41:03 -07:00
Jordan Harband
7c0f28af8b [eslint config] [deps] update @babel/runtime, eslint-find-rules, eslint-plugin-import, eslint-plugin-react, eslint-plugin-react-hooks, tape 2022-05-03 10:33:40 -07:00
Jordan Harband
fd2f5a1dae [eslint config] [base] [deps] update @babel/runtime, confusing-browser-globals, eslint-find-rules, eslint-plugin-import, tape 2022-05-03 10:29:37 -07:00
Jordan Harband
b4377fb030 [meta] better eclint command 2022-01-11 12:09:40 -08:00
Jordan Harband
34b5bc39f1 [meta] revert changes from d4e39c9b10
Caused by https://github.com/npm/cli/issues/3619
2021-12-25 12:34:37 -08:00
Jordan Harband
d4e39c9b10 v19.0.4 2021-12-25 07:34:29 -08:00
Jordan Harband
baaa5e8d26 [eslint config] v19.0.3 2021-12-24 12:27:19 -08:00
David Petersen
274c8d5701 [eslint config] [patch] set namedComponents option to match style guide
Change the `namedComponents` option to `function-declaration` to match what the style guide requires.

019e0f7e07 (r60060792)
2021-11-10 17:05:21 -06:00
Jordan Harband
38bc026fe4 [eslint config] [base] add disabled prefer-object-has-own rule 2021-12-22 15:12:04 -08:00
Jordan Harband
445322db64 [eslint config] [deps] update eslint-plugin-react 2021-12-22 15:09:25 -08:00
Jordan Harband
152bd5e85a [eslint config] v19.0.2 2021-12-02 10:34:58 -08:00
Jordan Harband
afc2cc3432 [eslint config] [meta] fix "exports" path
Fixes #2524
2021-12-02 10:04:51 -08:00
Jordan Harband
371537f393 [Tests] re-enable tests disabled for the eslint 8 upgrade 2021-11-22 13:44:36 -08:00
Jordan Harband
c05ffb2417 [eslint config] v19.0.1 2021-11-22 13:32:11 -08:00
Jordan Harband
97a3238020 [eslint config] [deps] update eslint-plugin-react 2021-11-22 11:12:36 -08:00
Jordan Harband
e0bb393519 [eslint config] [*] [dev deps] update tape 2021-11-22 11:12:26 -08:00
Jordan Harband
c4000b932a [eslint config] [fix] whitespace: udpate to support eslint 8
Fixes #2517
2021-11-22 11:07:00 -08:00
Jordan Harband
31c6f21878 [eslint config] [base] [refactor] make a single source of truth for whitespace rule names 2021-11-22 11:06:19 -08:00
Yatin
91cab81f69 [readme] operator => parameter syntax 2021-11-17 00:14:08 +05:30
d8cb404da7 [eslint config] [base] remove unneeded eslint version check 2021-11-11 23:45:40 +08:00
Jordan Harband
52e710c14e [eslint config] v19.0.0 2021-11-10 12:25:30 -08:00
Jordan Harband
1bc8cabd44 [eslint config] [breaking] support eslint 8; drop eslint < 7 2021-11-10 11:31:18 -08:00
Jordan Harband
37ebbba44c [eslint config] [deps] update eslint-config-airbnb-base, eslint-plugin-jsx-a11y, eslint-plugin-react, eslint-plugin-react-hooks, safe-publish-latest 2021-11-10 00:04:12 -08:00
Jordan Harband
930a6f2e4c [eslint config] [*] update @babel/runtime, eslint-plugin-import 2021-11-10 00:01:04 -08:00
Jordan Harband
366bfa6638 [eslint config] [base] v15.0.0 2021-11-08 22:59:44 -08:00
Jordan Harband
f3d3a075cd [eslint config] [base] [breaking] drop eslint < 7, add eslint 8 2021-11-08 18:27:29 -08:00
Jordan Harband
eac8cc605b [eslint config] [base] [breaking] add exports 2021-11-08 18:48:04 -08:00
Jordan Harband
be6966b251 [eslint-config] [meta] add --no-save to link scripts 2021-11-08 22:33:12 -08:00
Jordan Harband
4fc997b97e [readme] some updates 2021-11-08 18:42:02 -08:00
Jordan Harband
96f11d8c81 [actions] run prepublishOnly in prepublish tests 2021-11-08 22:25:39 -08:00
Jordan Harband
c12a08c479 [actions] fix action working directories 2021-11-08 18:27:29 -08:00
Jordan Harband
10a6d02c66 [meta] use prepublishOnly script for npm 7+ 2021-11-08 21:21:58 -08:00
Jordan Harband
ef6c478a2b [eslint config] [*] [dev deps] update @babel/runtime 2021-11-08 18:06:45 -08:00
Jordan Harband
6734b78911 [eslint config] [*] [deps] update eslint-plugin-import, object.entries 2021-11-08 16:00:07 -08:00
Kai
fdc812a0a5 [Docs] HTTP => HTTPS 2021-11-04 00:24:41 +01:00
Joe Lencioni
8aec65a4d3 Merge pull request #2491 from airbnb/travis
[Tests] migrate tests to Github Actions
2021-11-05 12:49:19 -05:00
Jordan Harband
ea5b991a4f [Tests] migrate tests to Github Actions 2021-11-04 23:05:04 -07:00
Augustus Buonviri
2a6bec1132 [eslint config] [base] [patch] Improve function-paren-newline with multiline-arguments option
Related to #1731

Co-authored-by: Augustus Buonviri <augustus.buonviri@stratusgrid.com>
Co-authored-by: Jordan Harband <ljharb@gmail.com>
2021-09-14 22:12:31 -04:00
Johnwesley R
82dbec3c99 [guide] Fix 14.1 Temporal Dead Zones link 2021-10-17 14:27:43 -04:00
Mustafa Haddara
122788230a [eslint config] clarify hooks requirement 2021-10-15 17:00:15 -04:00
Marko Schulz
4ee7326393 [eslint-config-airbnb] [patch] Explain why react/jsx-key is turned off 2021-09-24 11:26:03 +02:00
Jordan Harband
7fbed3b55c [eslint-config-airbnb] [deps] update eslint-plugin-react 2021-09-28 21:44:21 -07:00
Jordan Harband
30927d2503 [*] [deps] update @babel/runtime, eslint-plugin-import, tape 2021-09-28 21:41:06 -07:00
Luke Ingalls
f5c14cae2f [readme] fixed typo and removed redundancy 2021-06-18 19:49:13 -06:00
Jordan Harband
428c9ddb7e [*] [deps] update @babel/runtime, eslint-plugin-import, eslint-plugin-react 2021-06-29 10:03:15 -07:00
Jordan Harband
af8bdf17dd [*] [deps] update object.entries 2021-06-29 09:56:18 -07:00
amirvatani
d5d406a849 [readme] add AloPeyk to "in the wild" 2021-05-09 00:10:31 -07:00
Asher Hwang
35914b1402 [guide] Spread operator => Spread syntax 2021-05-11 09:08:23 +09:00
Kiran S
1fb4592122 [guide] add references for eslint rules 2021-05-04 21:15:46 +05:30
Kushang Shah
5641278fa1 [editorial] add var info to let/const section 2021-05-03 16:34:19 -07:00
Kiran S
dc3af3a90e [eslint config] [base] update default value for complexity 2021-05-03 21:39:00 +05:30
Mackenzie Morgan
1eadb93e37 [eslint config] [fix] bump eslint-plugin-react-hooks peer dependency version
Fixes #2355
2020-12-17 00:18:29 -05:00
Cong Zhang
0cf78acab0 [guide] Fix 19.6 example code 2021-03-24 18:17:15 +08:00
Diane Ko
730b749274 [eslint config] [patch] Alphabetize the rules for react-a11y.js
The ordering of the rules are currently not alphabetical, which can make it hard to tell whether there are rules missing or what's set for each rule from eslint-plugin-jsx-a11y.

This change alphabetizes the list so it's easier to compare to the [list of supported rules](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y#supported-rules)
2021-03-24 18:38:08 -07:00
Jordan Harband
4d837646b7 [eslint config] [deps] update eslint-plugin-react 2021-03-24 23:33:38 -07:00
Jordan Harband
1b540ba14e [*] [dev deps] update tape 2021-03-24 23:32:41 -07:00
kimhanui
711aeb650d [editorial] Complete 19.6 example code (cut in the middle)
Fixes #2403
2021-03-18 08:43:41 +09:00
Ikko Ashimine
9c181108a7 [meta] Fix typo in .markdownlint.json
preceeding -> preceding
2021-01-08 20:40:02 +09:00
marsonya
ea5ec0c524 [readme] removed dead links - 404 not found 2020-12-30 10:44:32 +05:30
Jordan Harband
db8b6ceb33 [eslint config] update eslint-plugin-react, add new rules, disabled 2020-12-29 21:37:48 -08:00
Jordan Harband
b9ff0aee71 [eslint-config] [base] add disabled no-unsafe-optional-chaining rule 2020-12-29 21:34:18 -08:00
Jordan Harband
fb3214c9d6 [*] [deps] update object.entries 2020-12-29 21:32:29 -08:00
Jordan Harband
66cd156a48 [*] [dev deps] update tape 2020-12-29 21:32:08 -08:00
Hollow Man
63098cbb6c [eslint config] [base] [patch] arthmetic -> arithmetic 2020-11-20 22:49:57 +08:00
Jeremy
1f786e154f [eslint config] [base] [patch] fix spelling of "than"
you mean "than" not "then".
2020-11-11 20:17:20 -06:00
Jordan Harband
5620bd5620 [eslint config] [base] add no-nonoctal-decimal-escape rule 2020-11-21 00:59:24 -08:00
Hugo Alliaume
f0df3a8680 [eslint config] [base] import/no-extraneous-dependencies: Add .eslintrc.js to devDeps
Similar to #1168 and #1522.
2020-11-07 08:17:29 +01:00
Jordan Harband
37d48dbf60 [eslint config] v18.2.1 2020-11-06 14:20:24 -08:00
Jordan Harband
e5de51e55f [eslint config] [patch] re-add jsx-a11y/accessible-emoji, but disabled
See #2322
2020-11-06 14:19:17 -08:00
Jordan Harband
eee79a5455 [eslint config] [deps] update eslint-plugin-jsx-a11y, eslint-plugin-react 2020-11-06 14:14:17 -08:00
Jordan Harband
b7015dd0b3 [eslint config] [deps] update eslint-config-airbnb-base 2020-11-06 14:12:51 -08:00
Jordan Harband
36f23d7886 [eslint config] [base] v14.2.1 2020-11-06 10:10:00 -08:00
Jordan Harband
e149b05366 [eslint config] [*] [deps] update confusing-browser-globals, object.assign 2020-11-06 10:03:46 -08:00
Jordan Harband
f0492d59bd [eslint config] [*] [dev deps] update @babel/runtime, eslint-find-rules, eslint-plugin-import 2020-11-06 10:01:35 -08:00
Jordan Harband
25b64d7f46 [dev deps] update markdownlint, markdownlint-cli 2020-11-06 09:59:46 -08:00
Kyℓe Hensel
8996aa7c53 [eslint config] [patch] remove deprecated jsx-a11y/accessible-emoji rule 2020-10-27 08:54:41 +13:00
Alex Mercier
05c3bb0018 [eslint config] [patch] Fix ignoreNonDOM typo in jsx-a11y/aria-role rule
This should be `ignoreNonDOM` not `ignoreNonDom` according to [documentation](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/master/docs/rules/aria-role.md).
2020-10-23 13:30:37 +01:00
alvyn le
d3c7b84d9e [eslint config] [patch] Fixed handle and on ordering in sort-comp rule
- fixes #2116
2020-09-23 01:30:35 -04:00
Samuel Scheiderich
b30b0e4d91 [eslint-config] [base] no-restricted-globals: add better messages 2020-10-24 16:30:10 -04:00
Michael Flores
2c5c88d048 [guide] Update reason for preferring object destructuring
Fixes #2293

The reason for preferring object destructuring is quite narrow in scope. While this guide isn't intended to provide every possible reason for every preference, it perhaps should aim to provide a succinct and compelling reason. The current reasoning could be improved to meet this standard, so I'm proposing adding some additional information to clarify the benefits of what is an often controversial rule (controversial only because its introduction can require many changes in a mature codebase and has no auto fix available).
2020-10-21 23:10:31 -05:00
Daniel Paz
ee2f22a10c [guide] Better link reference to Drupal's linter
This link was taken from their Code standard page: https://www.drupal.org/docs/develop/standards/javascript/eslint-settings

The previous link wasn't very informative and required a download process in order to check their standards.
2020-10-16 14:02:43 +03:00
Daniel Paz
aa43bb2398 [guide] add explanation about why to use radix when using parseInt
I added an explanation at [22.3](https://github.com/airbnb/javascript/blob/master/README.md#coercion--numbers) why to use radix once parseInt, this explanation has been taken from [Mozilla's docs](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt#Octal_interpretations_with_no_radix).

I think it's not clear without an explanation since people can think that it's obvious that string will be parsed to 10 base number, but it's not always the case.
2020-10-14 18:48:40 +03:00
Pirasis
82170f9127 [guide] add eslint rule reference for prefer-object-spread 2020-10-11 21:28:52 +07:00
Pirasis
5ebfe3e5b8 [guide] add eslint rule reference for default-param-last 2020-10-06 21:36:29 +07:00
Android Dev Notes
337f60706f [guide] Fix grammatical errors 2020-09-06 02:02:14 +05:30
Jordan Harband
6006d6d2df [guide] fix dead es-discourse link
Fixes #2274.
2020-08-27 14:29:09 -07:00
Akshath Sivaprasad
a24dc34a4a [guide] [react] Add examples for formatting multiline conditional components 2020-08-05 21:38:20 -07:00
Jordan Harband
1dc71d3839 [guide] [react] add missing PascalCase guidance for prop names 2020-08-03 09:36:24 -07:00
Jordan Harband
973384be1b [eslint config] [*] [dev deps] update @babel/runtime, eslint-find-rules, eslint-plugin-jsx-a11y, eslint-plugin-react 2020-08-05 22:06:20 -07:00
Jordan Harband
3dcc591123 [eslint config] [base] add id-denylist rule 2020-08-05 22:04:10 -07:00
Jordan Harband
c5bee75b1b [eslint config] [*] [deps] update eslint-plugin-import, use valid import/no-cycle maxDepth option 2020-06-22 22:55:52 -07:00
Jordan Harband
5124de23da [eslint config] [base] add new rules from v7.3 2020-06-27 13:22:33 -07:00
Jordan Harband
54955410ee [eslint config] v18.2.0 2020-06-18 13:11:38 -07:00
Jordan Harband
197b50c076 [eslint config] [deps] update eslint-config-airbnb-base, eslint-plugin-jsx-a11y 2020-06-18 11:57:41 -07:00
Jordan Harband
f550ded6da [eslint config] [tests] fix for eslint 7 2020-06-18 12:03:46 -07:00
Jordan Harband
562e3519b8 [Dev Deps] update markdownlint, markdownlint-cli 2020-06-18 11:53:53 -07:00
Jordan Harband
78457af2c5 [eslint config] [base] v14.2.0 2020-06-10 23:25:49 -07:00
Jordan Harband
5b462a04cd [eslint config] [*] [new] add eslint v7 2020-06-10 15:43:13 -07:00
Kristóf Poduszló
22adc06f56 [eslint config] [minor] Allow using eslint-plugin-react-hooks v3 and v4
Co-authored-by: Kristóf Poduszló <kripod@protonmail.com>
Co-authored-by: Jordan Harband <ljharb@gmail.com>
2020-04-10 00:47:18 +02:00
Jordan Harband
fe2e451ba7 [Tests] add node v14; remove v9, v11 2020-06-10 14:58:23 -07:00
Jordan Harband
b587006077 [eslint config] [*] [deps] update eslint-plugin-import 2020-06-10 14:49:21 -07:00
Vlad Shcherbin
8aee3e1600 [eslint config] [base] [patch] Include 'context' exception for no-param-reassign 2020-05-20 13:21:10 +03:00
Vlad Shcherbin
cad3db3169 [eslint config] [base] [minor] Disallow multiple empty lines 2020-06-07 00:01:51 +03:00
Jordan Harband
7aa0fa14d6 [eslint config] [*] [deps] update eslint-plugin-import, eslint-plugin-react, babel-preset-airbnb, eslint-find-rules, in-publish, tape 2020-06-07 20:50:43 -07:00
Jordan Harband
d34f807459 [Deps] update object.entries 2020-06-07 20:05:48 -07:00
Severiano Badajoz
c48a060aff [eslint config] [patch] set explicitSpread to ignore for react/jsx-props-no-spreading 2020-06-05 15:09:12 -07:00
Paul Matthew Barrameda
06b3ab11d9 [eslint config] [minor] Fix typo in no-multiple-empty-lines rule
## Why is the change being made?

This change is made because the Airbnb documentation states to "avoid a
newline at the beginning of files", yet the code does not follow this.

 ## What has changed to address the problem?

This change fixes the `no-multiple-empty-lines` rule by setting max
beginning of file (`maxBOF`) to from 1 to 0.

 ## How was this change tested?

This change was tested with `npm test`.

 ## Related docs

https://github.com/airbnb/javascript#whitespace--no-multiple-empty-lines
2020-02-19 22:56:52 -08:00
小蚊酱
c0ee2c4924 [guide] unquote properties in whitespace key spacing section 2020-03-31 17:41:38 +08:00
Jiahao
e4f3dd4eff [react] Update Chinese (Simplified) Translation
The translation for Chinese (Simplified) is outdated. Changed to an up-to-date translation that synced with current English version, enhanced expressions for better readability, and also added notes of technical terms for Chinese readers.
2020-03-10 23:24:39 -04:00
Nick Reiley
0375265cbd [eslint config] [base] [patch] Allow triple-slash (///) comments 2020-03-16 23:27:49 +05:00
Nick Reiley
d3628e2600 [eslint config] [base] [patch] Disable prefer-object-spread for airbnb-base/legacy 2020-03-16 23:39:16 +05:00
Jordan Harband
f075a0db50 [eslint config] [patch] relax eslint-plugin-react-hooks down to v2.3, due to a controversial change in v2.5
Fixes #2195.
2020-03-14 15:39:55 -07:00
David J. Bradshaw
d529ccaea3 [eslint config] readme: fix typo 2020-03-14 07:36:30 +00:00
Jordan Harband
a3355f90c4 [eslint config] v18.1.0 2020-03-12 22:58:43 -07:00
Jordan Harband
e7062c32bb [eslint config] [deps] update eslint-config-airbnb-base 2020-03-12 22:47:00 -07:00
Jordan Harband
c75b66daa6 [eslint config] [base] v14.1.0 2020-03-12 16:45:56 -07:00
Jordan Harband
e279b6d3a8 [eslint config] [*] [deps] update eslint, eslint-plugin-react, eslint-plugin-react-hooks 2020-03-12 15:58:42 -07:00
Jordan Harband
6924bd3604 [Dev Deps] update @babel/runtime 2020-03-12 15:58:18 -07:00
Jordan Harband
165af9b6c8 [Tests] actually run the linter on subpackages 2020-03-12 15:41:30 -07:00
Dmitry Semigradsky
e6e6414c97 [guide] Add link to eslint rule for https://github.com/airbnb/javascript#modules--multiline-imports-over-newlines 2020-03-09 12:55:31 +03:00
lagagain
717ba5187a [guide]: add "bigint" type to the primitives type section.
```js
var bn = 123n
```
(with "n" as suffix)
2020-02-28 14:53:58 +08:00
Cain Hall
9890b40677 guide: import/extensions rule documentation 2020-03-02 16:27:57 +11:00
Julian Grinblat
3493b060ec [eslint config] [minor] Support eslint-plugin-react-hooks@2 2019-09-16 19:37:29 +09:00
Jordan Harband
019e0f7e07 [eslint config] add config for disabled new rules 2020-02-13 17:42:08 -08:00
Jordan Harband
41ca203e3e [Dev Deps] update markdownlint-cli 2020-02-07 08:05:47 -10:00
Kévin Berthommier
651280e5a2 [eslint config] [base] Fix indentation with JSX Fragments 2020-02-07 16:49:10 +01:00
Jordan Harband
f86f19cefc [eslint config] [*] [deps] update eslint-plugin-import, eslint-plugin-react 2020-02-07 08:32:08 -10:00
Jordan Harband
4df908033f [eslint config] [*] [dev deps] update @babel/runtime, babel-preset-airbnb, safe-publish-latest, tape 2020-02-07 08:29:46 -10:00
Jordan Harband
377fbcac88 [eslint config] [*] [deps] update object.entries 2020-02-07 08:25:49 -10:00
Geo Artemenko
6d05dd898a [eslint config] [*] [readme] normalize multiline word according to merriam-webster 2019-11-22 22:04:23 -05:00
Jordan Harband
b5954c32b3 [eslint config] [base] [deps] [minor] add new disabled rules, update eslint 2019-12-10 16:47:51 -08:00
Jordan Harband
370793b3dd [eslint-config] [*] [fix] whitespace: only set erroring rules to "warn"
Fixes #2105
2019-12-10 16:32:17 -08:00
Jonas Scheffner
2e3adc98c7 [eslint config] [base] [patch] import/no-extraneous-dependencies: Support karma config files 2019-10-28 13:42:10 +01:00
Vse Mozhet Byt
5927c7f706 [guide] fix possible typo 2019-11-08 16:05:06 +02:00
Igor Gassmann
56b75dc359 [guide] Document class-methods-use-this
This PR documents the currently enforced `class-methods-use-this` ESlint rule as discussed in #2129
2019-11-03 21:00:57 +01:00
trg
64b965efe0 [guide] Fix Temporal dead zone link anchor 2019-10-01 01:27:12 +03:00
Alexander Wesolowski
3fb312f181 [eslint config] [patch] Add static-variables to sort-comp rule 2019-10-04 15:57:05 -07:00
Pirasis
8f78e1f44b [tests] re-enable eslint rule prefer-destructuring internally 2019-10-05 08:01:44 +07:00
Pirasis
5a32c33bf2 [eslint config] [base] [minor] enable import/no-useless-path-segments for commonjs
Fixes #2077.
2019-10-05 08:49:01 +07:00
Pirasis
df2c99c814 [tests] fix eslint errors from c66cfc3 2019-10-05 08:21:45 +07:00
Filipp Riabchun
ab72ab9e90 [eslint config] [patch] Remove duplicate componentDidCatch
See https://github.com/airbnb/javascript/pull/2043#discussion_r331208075

I left the one before `cWU`, as in [defaults](https://github.com/airbnb/javascript/pull/2043#discussion_r331208075)
2019-10-03 21:31:32 +02:00
Jordan Harband
dee4f172e7 [eslint config] [base] add new rules in eslint 6.x, disabled 2019-10-03 19:18:32 -04:00
Jordan Harband
c66cfc3f89 [eslint config] [deps] update eslint-plugin-react 2019-10-03 19:20:10 -04:00
Jordan Harband
8c94d53bf8 [eslint config] [*] [dev deps] update @babel/runtime, babel-preset-airbnb, safe-publish-latest 2019-10-03 19:10:47 -04:00
Jordan Harband
79047a9470 [eslint config] [base] [deps] update confusing-browser-globals 2019-10-03 19:10:12 -04:00
Tom Prats
7932a52e4b Added Tomify and Traitify to the organizations 2019-09-04 14:11:39 -04:00
Daniel Gray
1ca21aba79 [eslint config] clarify hooks section in readme
It took me too long to realize that `"extends": "airbnb/hooks"` won't cut it, and that you need to include both `"extends": ["airbnb", "airbnb/hooks"]`. I think the docs should be explicit about this.
2019-08-17 19:14:24 -05:00
Jordan Harband
295d1e61cb [guide] clean up confusing example from bad rebase
... from
820745d610 (diff-04c6e90faac2675aa89e2176d2eec7d8R963-R965)
/ #1863.

Fixes #2071.
2019-08-14 08:46:21 -07:00
Jordan Harband
a204cdf38a [eslint config] v18.0.1 2019-08-13 12:30:37 -07:00
Jordan Harband
530278467f [eslint config] [patch] react/state-in-constructor: fix incorrect configuration 2019-08-13 12:29:28 -07:00
38 changed files with 1800 additions and 775 deletions

26
.github/workflows/node-pretest.yml vendored Normal file
View File

@@ -0,0 +1,26 @@
name: 'Tests: pretest/posttest'
on: [pull_request, push]
jobs:
pretest:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
package:
- '..'
- eslint-config-airbnb
- eslint-config-airbnb-base
defaults:
run:
working-directory: "packages/${{ matrix.package }}"
steps:
- uses: actions/checkout@v2
- uses: ljharb/actions/node/install@main
name: 'nvm install lts/* && npm install'
with:
node-version: 'lts/*'
- run: npm run pretest

163
.github/workflows/node.yml vendored Normal file
View File

@@ -0,0 +1,163 @@
name: 'Tests: node.js'
on: [pull_request, push]
jobs:
matrix:
runs-on: ubuntu-latest
outputs:
latest: ${{ steps.set-matrix.outputs.requireds }}
steps:
- uses: ljharb/actions/node/matrix@main
id: set-matrix
with:
versionsAsRoot: true
type: 'majors'
preset: '^12 || ^14 || ^16 || >= 17'
base:
needs: [matrix]
name: 'base config'
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
node-version: ${{ fromJson(needs.matrix.outputs.latest) }}
eslint:
- 8
- 7
package:
- eslint-config-airbnb-base
exclude:
- node-version: 10
eslint: 8
package: eslint-config-airbnb-base
defaults:
run:
working-directory: "packages/${{ matrix.package }}"
steps:
- uses: actions/checkout@v2
- uses: ljharb/actions/node/install@main
name: 'nvm install ${{ matrix.node-version }} && npm install'
with:
before_install: cd "packages/${{ matrix.package }}"
node-version: ${{ matrix.node-version }}
after_install: |
npm install --no-save "eslint@${{ matrix.eslint }}"
- run: node -pe "require('eslint/package.json').version"
name: 'eslint version'
- run: npm run travis
- uses: codecov/codecov-action@v2
react:
needs: [matrix]
name: 'react config'
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
node-version: ${{ fromJson(needs.matrix.outputs.latest) }}
eslint:
- 8
- 7
package:
- eslint-config-airbnb
react-hooks:
- 4
defaults:
run:
working-directory: "packages/${{ matrix.package }}"
steps:
- uses: actions/checkout@v2
- uses: ljharb/actions/node/install@main
name: 'nvm install ${{ matrix.node-version }} && npm install'
with:
before_install: cd "packages/${{ matrix.package }}"
node-version: ${{ matrix.node-version }}
after_install: |
npm install --no-save "eslint@${{ matrix.eslint }}"
- run: node -pe "require('eslint/package.json').version"
name: 'eslint version'
- run: npm install --no-save "eslint-plugin-react-hooks@${{ matrix.react-hooks }}"
if: ${{ matrix.react-hooks > 0}}
- run: npm run travis
- uses: codecov/codecov-action@v2
prepublish-base:
name: 'prepublish tests (base config)'
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
eslint:
- 8
- 7
package:
- eslint-config-airbnb-base
defaults:
run:
working-directory: "packages/${{ matrix.package }}"
steps:
- uses: actions/checkout@v2
- uses: ljharb/actions/node/install@main
name: 'nvm install lts/* && npm install'
with:
before_install: cd "packages/${{ matrix.package }}"
node-version: lts/*
after_install: |
npm install --no-save "eslint@${{ matrix.eslint }}"
- run: node -pe "require('eslint/package.json').version"
name: 'eslint version'
- run: npm run pretravis
- run: npm run prepublishOnly
- run: npm run posttravis
prepublish-react:
name: 'prepublish tests (react config)'
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
eslint:
- 8
- 7
package:
- eslint-config-airbnb
react-hooks:
- 4
defaults:
run:
working-directory: "packages/${{ matrix.package }}"
steps:
- uses: actions/checkout@v2
- uses: ljharb/actions/node/install@main
name: 'nvm install lts/* && npm install'
with:
before_install: cd "packages/${{ matrix.package }}"
node-version: lts/*
after_install: |
npm install --no-save "eslint@${{ matrix.eslint }}"
- run: npm install --no-save "eslint-plugin-react-hooks@${{ matrix.react-hooks }}"
if: ${{ matrix.react-hooks > 0}}
- run: node -pe "require('eslint/package.json').version"
name: 'eslint version'
- run: npm run pretravis
- run: npm run prepublishOnly
- run: npm run posttravis
node:
name: 'node 10+'
needs: [base, prepublish-base, react, prepublish-react]
runs-on: ubuntu-latest
steps:
- run: 'echo tests completed'

15
.github/workflows/rebase.yml vendored Normal file
View File

@@ -0,0 +1,15 @@
name: Automatic Rebase
on: [pull_request_target]
jobs:
_:
name: "Automatic Rebase"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: ljharb/rebase@master
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -0,0 +1,12 @@
name: Require “Allow Edits”
on: [pull_request_target]
jobs:
_:
name: "Require “Allow Edits”"
runs-on: ubuntu-latest
steps:
- uses: ljharb/require-allow-edits@main

View File

@@ -1,52 +0,0 @@
language: node_js
node_js:
- "12"
- "11"
- "10"
- "9"
- "8"
before_install:
- 'nvm install-latest-npm'
install:
- 'if [ -n "${PACKAGE-}" ]; then cd "packages/${PACKAGE}"; fi'
- 'if [ "${TRAVIS_NODE_VERSION}" = "0.6" ] || [ "${TRAVIS_NODE_VERSION}" = "0.9" ]; then nvm install --latest-npm 0.8 && npm install && nvm use "${TRAVIS_NODE_VERSION}"; else npm install; fi;'
- 'if [ -n "${ESLINT}" ]; then npm install --no-save "eslint@${ESLINT}"; fi'
script:
- 'if [ -n "${PREPUBLISH-}" ]; then npm run pretravis && npm run prepublish && npm run posttravis; elif [ -n "${LINT-}" ]; then npm run lint; else npm run travis; fi'
sudo: false
env:
matrix:
- 'TEST=true ESLINT=6 PACKAGE=eslint-config-airbnb-base'
- 'TEST=true ESLINT=6 PACKAGE=eslint-config-airbnb'
- 'TEST=true ESLINT=5 PACKAGE=eslint-config-airbnb-base'
- 'TEST=true ESLINT=5 PACKAGE=eslint-config-airbnb'
matrix:
fast_finish: true
include:
- node_js: "lts/*"
env: PREPUBLISH=true ESLINT=6 PACKAGE=eslint-config-airbnb-base
- node_js: "lts/*"
env: PREPUBLISH=true ESLINT=6 PACKAGE=eslint-config-airbnb
- node_js: "lts/*"
env: PREPUBLISH=true ESLINT=5 PACKAGE=eslint-config-airbnb-base
- node_js: "lts/*"
env: PREPUBLISH=true ESLINT=5 PACKAGE=eslint-config-airbnb
- node_js: "lts/*"
env: LINT=true
- node_js: "7"
env: TEST=true ESLINT=5 PACKAGE=eslint-config-airbnb-base
- node_js: "7"
env: TEST=true ESLINT=5 PACKAGE=eslint-config-airbnb
- node_js: "6"
env: TEST=true ESLINT=5 PACKAGE=eslint-config-airbnb-base
- node_js: "6"
env: TEST=true ESLINT=5 PACKAGE=eslint-config-airbnb
exclude:
allow_failures:
- node_js: "11"
- node_js: "9"
- node_js: "7"
- env: PREPUBLISH=true ESLINT=6 PACKAGE=eslint-config-airbnb-base
- env: PREPUBLISH=true ESLINT=6 PACKAGE=eslint-config-airbnb
- env: PREPUBLISH=true ESLINT=5 PACKAGE=eslint-config-airbnb-base
- env: PREPUBLISH=true ESLINT=5 PACKAGE=eslint-config-airbnb

3
CODE_OF_CONDUCT.md Normal file
View File

@@ -0,0 +1,3 @@
Airbnb has adopted a Code of Conduct that we expect project participants to adhere to. Please [read the full Code of Conduct text](https://airbnb.io/codeofconduct/) so that you can understand what actions will and will not be tolerated. Report violations to the maintainers of this project or to [opensource-conduct@airbnb.com](mailto:opensource-conduct@airbnb.com).
Reports sent to [opensource-conduct@airbnb.com](mailto:opensource-conduct@airbnb.com) are received by Airbnb's open source code of conduct moderation team, which is composed of Airbnb employees. All communications are private and confidential.

444
README.md

File diff suppressed because it is too large Load Diff

View File

@@ -34,7 +34,7 @@
- Use an underscore for modifiers to other styles.
> Why? Similar to BEM, this naming convention makes it clear that the styles are intended to modify the element preceded by the underscore. Underscores do not need to be quoted, so they are preferred over other characters, such as dashes.
> Why? Similar to [BEM](https://getbem.com/introduction/), this naming convention makes it clear that the styles are intended to modify the element preceded by the underscore. Underscores do not need to be quoted, so they are preferred over other characters, such as dashes.
```js
// bad

View File

@@ -26,7 +26,8 @@
"comment": "MD007: Unordered list indentation: 2 spaces.",
"ul-indent": {
"indent": 2
"indent": 2,
"start_indented": true
},
"comment": "MD009: Disallow trailing spaces!",
@@ -68,7 +69,7 @@
"no-multiple-space-closed-atx": true,
"comment": "MD022: Headers should be surrounded by blank lines.",
"comment": "Some headers have preceeding HTML anchors. Unfortunate that we have to disable this, as it otherwise catches a real problem that trips up some Markdown renderers",
"comment": "Some headers have preceding HTML anchors. Unfortunate that we have to disable this, as it otherwise catches a real problem that trips up some Markdown renderers",
"blanks-around-headers": false,
"comment": "MD023: Headers must start at the beginning of the line.",
@@ -110,7 +111,7 @@
"blanks-around-fences": true,
"comment": "MD032: Lists should be surrounded by blank lines",
"comment": "Some lists have preceeding HTML anchors. Unfortunate that we have to disable this, as it otherwise catches a real problem that trips up some Markdown renderers",
"comment": "Some lists have preceding HTML anchors. Unfortunate that we have to disable this, as it otherwise catches a real problem that trips up some Markdown renderers",
"blanks-around-lists": false,
"comment": "MD033: Disallow inline HTML",

View File

@@ -9,7 +9,7 @@
*
* @version 0.3.0
* @see https://github.com/SublimeLinter/SublimeLinter
* @see http://www.jshint.com/docs/
* @see https://www.jshint.com/docs/
*/
{
"jshint_options":

View File

@@ -4,6 +4,7 @@
"description": "A mostly reasonable approach to JavaScript.",
"scripts": {
"preinstall": "npm run install:config && npm run install:config:base",
"postinstall": "rm -rf node_modules/markdownlint-cli/node_modules/markdownlint",
"install:config": "cd packages/eslint-config-airbnb && npm prune && npm install",
"install:config:base": "cd packages/eslint-config-airbnb-base && npm prune && npm install",
"lint": "markdownlint --config linters/.markdownlint.json README.md */README.md",
@@ -39,6 +40,7 @@
},
"homepage": "https://github.com/airbnb/javascript",
"devDependencies": {
"markdownlint-cli": "^0.13.0"
"markdownlint": "^0.29.0",
"markdownlint-cli": "^0.35.0"
}
}

View File

@@ -4,7 +4,7 @@
// disable requiring trailing commas because it might be nice to revert to
// being JSON at some point, and I don't want to make big changes now.
"comma-dangle": 0,
// we support node 4
"prefer-destructuring": 0,
"max-len": 0,
},
}

View File

@@ -1,3 +1,52 @@
15.0.0 / 2021-11-08
==================
- [breaking] drop eslint < 7, add eslint 8 (#2495)
- [breaking] add `exports`
- [patch] Improve `function-paren-newline` with `multiline-arguments` option (#2471)
- [patch] update default value for complexity (#2420)
- [patch] add disabled `no-unsafe-optional-chaining` rule
- [patch] arthmetic -> arithmetic (#2341)
- [patch] fix spelling of "than" (#2333)
- [patch] add `no-nonoctal-decimal-escape` rule
- [patch] `import/no-extraneous-dependencies`: Add .eslintrc.js to devDeps (#2329)
- [guide] Spread operator => Spread syntax (#2423)
- [guide] add references for eslint rules (#2419)
- [Docs] HTTP => HTTPS (#2489)
- [readme] some updates
- [meta] use `prepublishOnly` script for npm 7+
- [deps] update `eslint-plugin-import`, `eslint-plugin-react`, `object.entries`
- [dev deps] update `@babel/runtime`, `tape`
14.2.1 / 2020-11-06
==================
- [base] `no-restricted-globals`: add better messages (#2320)
- [base] add new core eslint rules, set to off
- [deps] update `confusing-browser-globals`, `object.assign`
- [deps] update `eslint-plugin-import`, use valid `import/no-cycle` `maxDepth` option (#2250, #2249)
- [dev deps] update `@babel/runtime`, `eslint-find-rules`, `eslint-plugin-import`
14.2.0 / 2020-06-10
==================
- [new] add `eslint` `v7`
- [minor] Disallow multiple empty lines (#2238)
- [minor] Fix typo in no-multiple-empty-lines rule (#2168)
- [patch] Include 'context' exception for `no-param-reassign` (#2230)
- [patch] Allow triple-slash (///) comments (#2197)
- [patch] Disable `prefer-object-spread` for `airbnb-base/legacy` (#2198)
- [deps] update `eslint-plugin-import`, `eslint-plugin-react`, `babel-preset-airbnb`, `eslint-find-rules`, `in-publish`, `tape`, `object.entries`
14.1.0 / 2020-03-12
==================
- [minor] add new disabled rules, update eslint
- [minor] enable `import/no-useless-path-segments` for commonjs (#2113)
- [fix] `whitespace`: only set erroring rules to "warn"
- Fix indentation with JSX Fragments (#2157)
- [patch] `import/no-extraneous-dependencies`: Support karma config files (#2121)
- [readme] normalize multiline word according to merriam-webster (#2138)
- [deps] update `eslint`, `eslint-plugin-import`, `eslint-plugin-react`, `object.entries`, `confusing-browser-globals`
- [dev deps] update `@babel/runtime`, `babel-preset-airbnb`, `safe-publish-latest`, `tape`
- [tests] re-enable eslint rule `prefer-destructuring` internally (#2110)
14.0.0 / 2019-08-09
==================
- [breaking] `no-self-assign`: enable `props` option

View File

@@ -1,6 +1,10 @@
# eslint-config-airbnb-base
# eslint-config-airbnb-base <sup>[![Version Badge][npm-version-svg]][package-url]</sup>
[![npm version](https://badge.fury.io/js/eslint-config-airbnb-base.svg)](http://badge.fury.io/js/eslint-config-airbnb-base)
[![npm version](https://badge.fury.io/js/eslint-config-airbnb-base.svg)][package-url]
[![github actions][actions-image]][actions-url]
[![License][license-image]][license-url]
[![Downloads][downloads-image]][downloads-url]
This package provides Airbnb's base JS .eslintrc (without React plugins) as an extensible shared config.
@@ -79,7 +83,7 @@ Lints ES5 and below. Requires `eslint` and `eslint-plugin-import`.
Which produces and runs a command like:
```sh
npm install --save-dev eslint-config-airbnb-base eslint@^3.0.1 eslint-plugin-import@^1.10.3
npm install --save-dev eslint-config-airbnb-base eslint@^#.#.# eslint-plugin-import@^#.#.#
```
2. Add `"extends": "airbnb-base/legacy"` to your .eslintrc
@@ -97,3 +101,12 @@ Consider adding test cases if you're making complicated rules changes, like anyt
You can run tests with `npm test`.
You can make sure this module lints with itself using `npm run lint`.
[package-url]: https://npmjs.org/package/eslint-config-airbnb-base
[npm-version-svg]: https://versionbadg.es/airbnb/javascript.svg
[license-image]: https://img.shields.io/npm/l/eslint-config-airbnb-base.svg
[license-url]: LICENSE.md
[downloads-image]: https://img.shields.io/npm/dm/eslint-config-airbnb-base.svg
[downloads-url]: https://npm-stat.com/charts.html?package=eslint-config-airbnb-base
[actions-image]: https://img.shields.io/endpoint?url=https://github-actions-badge-u3jn4tfpocch.runkit.sh/airbnb/javascript
[actions-url]: https://github.com/airbnb/javascript/actions

View File

@@ -28,6 +28,7 @@ module.exports = {
message: 'Please use Object.defineProperty instead.',
}],
'no-var': 'off',
'prefer-object-spread': 'off',
strict: ['error', 'safe'],
}
};

View File

@@ -1,14 +1,29 @@
{
"name": "eslint-config-airbnb-base",
"version": "14.0.0",
"version": "15.0.0",
"description": "Airbnb's base JS ESLint config, following our styleguide",
"main": "index.js",
"exports": {
".": "./index.js",
"./legacy": "./legacy.js",
"./whitespace": "./whitespace.js",
"./rules/best-practices": "./rules/best-practices.js",
"./rules/es6": "./rules/es6.js",
"./rules/node": "./rules/node.js",
"./rules/style": "./rules/style.js",
"./rules/errors": "./rules/errors.js",
"./rules/imports": "./rules/imports.js",
"./rules/strict": "./rules/strict.js",
"./rules/variables": "./rules/variables.js",
"./package.json": "./package.json"
},
"scripts": {
"prelint": "eclint check * rules/* test/*",
"prelint": "eclint check $(git ls-files | xargs find 2> /dev/null | grep -vE 'node_modules|\\.git')",
"lint": "eslint --report-unused-disable-directives .",
"pretests-only": "node ./test/requires",
"tests-only": "babel-tape-runner ./test/test-*.js",
"prepublish": "(in-install || eslint-find-rules --unused) && (not-in-publish || npm test) && safe-publish-latest",
"prepublishOnly": "eslint-find-rules --unused && npm test && safe-publish-latest",
"prepublish": "not-in-publish || npm run prepublishOnly",
"pretest": "npm run --silent lint",
"test": "npm run --silent tests-only",
"pretravis": ":",
@@ -53,27 +68,25 @@
},
"homepage": "https://github.com/airbnb/javascript",
"devDependencies": {
"@babel/runtime": "^7.5.5",
"babel-preset-airbnb": "^4.0.1",
"@babel/runtime": "^7.25.6",
"babel-preset-airbnb": "^4.5.0",
"babel-tape-runner": "^3.0.0",
"eclint": "^2.8.1",
"eslint": "^5.16.0 || ^6.1.0",
"eslint-find-rules": "^3.4.0",
"eslint-plugin-import": "^2.18.2",
"in-publish": "^2.0.0",
"safe-publish-latest": "^1.1.2",
"tape": "^4.11.0"
"eslint": "^7.32.0 || ^8.2.0",
"eslint-find-rules": "^4.1.0",
"eslint-plugin-import": "^2.30.0",
"in-publish": "^2.0.1",
"safe-publish-latest": "^2.0.0",
"tape": "^5.9.0"
},
"peerDependencies": {
"eslint": "^5.16.0 || ^6.1.0",
"eslint-plugin-import": "^2.18.2"
"eslint": "^7.32.0 || ^8.2.0",
"eslint-plugin-import": "^2.30.0"
},
"engines": {
"node": ">= 6"
"node": "^10.12.0 || >=12.0.0"
},
"dependencies": {
"confusing-browser-globals": "^1.0.7",
"object.assign": "^4.1.0",
"object.entries": "^1.1.0"
"confusing-browser-globals": "^1.0.11"
}
}

View File

@@ -1,6 +1,7 @@
module.exports = {
rules: {
// enforces getter/setter pairs in objects
// https://eslint.org/docs/rules/accessor-pairs
'accessor-pairs': 'off',
// enforces return statements in callbacks of array's methods
@@ -8,10 +9,12 @@ module.exports = {
'array-callback-return': ['error', { allowImplicit: true }],
// treat var statements as if they were block scoped
// https://eslint.org/docs/rules/block-scoped-var
'block-scoped-var': 'error',
// specify the maximum cyclomatic complexity allowed in a program
complexity: ['off', 11],
// https://eslint.org/docs/rules/complexity
complexity: ['off', 20],
// enforce that class methods use "this"
// https://eslint.org/docs/rules/class-methods-use-this
@@ -20,15 +23,26 @@ module.exports = {
}],
// require return statements to either always or never specify values
// https://eslint.org/docs/rules/consistent-return
'consistent-return': 'error',
// specify curly brace conventions for all control statements
curly: ['error', 'multi-line'],
// https://eslint.org/docs/rules/curly
curly: ['error', 'multi-line'], // multiline
// require default case in switch statements
// https://eslint.org/docs/rules/default-case
'default-case': ['error', { commentPattern: '^no default$' }],
// Enforce default clauses in switch statements to be last
// https://eslint.org/docs/rules/default-case-last
'default-case-last': 'error',
// https://eslint.org/docs/rules/default-param-last
'default-param-last': 'error',
// encourages use of dot notation whenever possible
// https://eslint.org/docs/rules/dot-notation
'dot-notation': ['error', { allowKeywords: true }],
// enforces consistent newlines before or after dots
@@ -39,7 +53,12 @@ module.exports = {
// https://eslint.org/docs/rules/eqeqeq
eqeqeq: ['error', 'always', { null: 'ignore' }],
// Require grouped accessor pairs in object literals and classes
// https://eslint.org/docs/rules/grouped-accessor-pairs
'grouped-accessor-pairs': 'error',
// make sure for-in loops have an if statement
// https://eslint.org/docs/rules/guard-for-in
'guard-for-in': 'error',
// enforce a maximum number of classes per file
@@ -47,15 +66,22 @@ module.exports = {
'max-classes-per-file': ['error', 1],
// disallow the use of alert, confirm, and prompt
// https://eslint.org/docs/rules/no-alert
// TODO: enable, semver-major
'no-alert': 'warn',
// disallow use of arguments.caller or arguments.callee
// https://eslint.org/docs/rules/no-caller
'no-caller': 'error',
// disallow lexical declarations in case/default clauses
// https://eslint.org/docs/rules/no-case-declarations.html
// https://eslint.org/docs/rules/no-case-declarations
'no-case-declarations': 'error',
// Disallow returning value in constructor
// https://eslint.org/docs/rules/no-constructor-return
'no-constructor-return': 'error',
// disallow division operators explicitly at beginning of regular expression
// https://eslint.org/docs/rules/no-div-regex
'no-div-regex': 'off',
@@ -78,16 +104,25 @@ module.exports = {
// https://eslint.org/docs/rules/no-empty-pattern
'no-empty-pattern': 'error',
// Disallow empty static blocks
// https://eslint.org/docs/latest/rules/no-empty-static-block
// TODO: semver-major, enable
'no-empty-static-block': 'off',
// disallow comparisons to null without a type-checking operator
// https://eslint.org/docs/rules/no-eq-null
'no-eq-null': 'off',
// disallow use of eval()
// https://eslint.org/docs/rules/no-eval
'no-eval': 'error',
// disallow adding to native types
// https://eslint.org/docs/rules/no-extend-native
'no-extend-native': 'error',
// disallow unnecessary function binding
// https://eslint.org/docs/rules/no-extra-bind
'no-extra-bind': 'error',
// disallow Unnecessary Labels
@@ -95,15 +130,19 @@ module.exports = {
'no-extra-label': 'error',
// disallow fallthrough of case statements
// https://eslint.org/docs/rules/no-fallthrough
'no-fallthrough': 'error',
// disallow the use of leading or trailing decimal points in numeric literals
// https://eslint.org/docs/rules/no-floating-decimal
'no-floating-decimal': 'error',
// disallow reassignments of native objects or read-only globals
// https://eslint.org/docs/rules/no-global-assign
'no-global-assign': ['error', { exceptions: [] }],
// deprecated in favor of no-global-assign
// https://eslint.org/docs/rules/no-native-reassign
'no-native-reassign': 'off',
// disallow implicit type conversions
@@ -120,21 +159,27 @@ module.exports = {
'no-implicit-globals': 'off',
// disallow use of eval()-like methods
// https://eslint.org/docs/rules/no-implied-eval
'no-implied-eval': 'error',
// disallow this keywords outside of classes or class-like objects
// https://eslint.org/docs/rules/no-invalid-this
'no-invalid-this': 'off',
// disallow usage of __iterator__ property
// https://eslint.org/docs/rules/no-iterator
'no-iterator': 'error',
// disallow use of labels for anything other then loops and switches
// disallow use of labels for anything other than loops and switches
// https://eslint.org/docs/rules/no-labels
'no-labels': ['error', { allowLoop: false, allowSwitch: false }],
// disallow unnecessary nested blocks
// https://eslint.org/docs/rules/no-lone-blocks
'no-lone-blocks': 'error',
// disallow creation of functions within loops
// https://eslint.org/docs/rules/no-loop-func
'no-loop-func': 'error',
// disallow magic numbers
@@ -147,27 +192,43 @@ module.exports = {
}],
// disallow use of multiple spaces
// https://eslint.org/docs/rules/no-multi-spaces
'no-multi-spaces': ['error', {
ignoreEOLComments: false,
}],
// disallow use of multiline strings
// https://eslint.org/docs/rules/no-multi-str
'no-multi-str': 'error',
// disallow use of new operator when not part of the assignment or comparison
// https://eslint.org/docs/rules/no-new
'no-new': 'error',
// disallow use of new operator for Function object
// https://eslint.org/docs/rules/no-new-func
'no-new-func': 'error',
// disallows creating new instances of String, Number, and Boolean
// https://eslint.org/docs/rules/no-new-wrappers
'no-new-wrappers': 'error',
// Disallow \8 and \9 escape sequences in string literals
// https://eslint.org/docs/rules/no-nonoctal-decimal-escape
'no-nonoctal-decimal-escape': 'error',
// Disallow calls to the Object constructor without an argument
// https://eslint.org/docs/latest/rules/no-object-constructor
// TODO: enable, semver-major
'no-object-constructor': 'off',
// disallow use of (old style) octal literals
// https://eslint.org/docs/rules/no-octal
'no-octal': 'error',
// disallow use of octal escape sequences in string literals, such as
// var foo = 'Copyright \251';
// https://eslint.org/docs/rules/no-octal-escape
'no-octal-escape': 'error',
// disallow reassignment of function parameters
@@ -180,6 +241,7 @@ module.exports = {
'accumulator', // for reduce accumulators
'e', // for e.returnvalue
'ctx', // for Koa routing
'context', // for Koa routing
'req', // for Express requests
'request', // for Express requests
'res', // for Express responses
@@ -190,9 +252,11 @@ module.exports = {
}],
// disallow usage of __proto__ property
// https://eslint.org/docs/rules/no-proto
'no-proto': 'error',
// disallow declaring the same variable more then once
// disallow declaring the same variable more than once
// https://eslint.org/docs/rules/no-redeclare
'no-redeclare': 'error',
// disallow certain object properties
@@ -238,12 +302,15 @@ module.exports = {
}],
// disallow use of assignment in return statement
// https://eslint.org/docs/rules/no-return-assign
'no-return-assign': ['error', 'always'],
// disallow redundant `return await`
// https://eslint.org/docs/rules/no-return-await
'no-return-await': 'error',
// disallow use of `javascript:` urls.
// https://eslint.org/docs/rules/no-script-url
'no-script-url': 'error',
// disallow self assignment
@@ -253,12 +320,15 @@ module.exports = {
}],
// disallow comparisons where both sides are exactly the same
// https://eslint.org/docs/rules/no-self-compare
'no-self-compare': 'error',
// disallow use of comma operator
// https://eslint.org/docs/rules/no-sequences
'no-sequences': 'error',
// restrict what can be thrown as an exception
// https://eslint.org/docs/rules/no-throw-literal
'no-throw-literal': 'error',
// disallow unmodified conditions of loops
@@ -266,6 +336,7 @@ module.exports = {
'no-unmodified-loop-condition': 'off',
// disallow usage of expressions in statement position
// https://eslint.org/docs/rules/no-unused-expressions
'no-unused-expressions': ['error', {
allowShortCircuit: false,
allowTernary: false,
@@ -277,6 +348,7 @@ module.exports = {
'no-unused-labels': 'error',
// disallow unnecessary .call() and .apply()
// https://eslint.org/docs/rules/no-useless-call
'no-useless-call': 'off',
// Disallow unnecessary catch clauses
@@ -300,9 +372,11 @@ module.exports = {
'no-void': 'error',
// disallow usage of configurable warning terms in comments: e.g. todo
// https://eslint.org/docs/rules/no-warning-comments
'no-warning-comments': ['off', { terms: ['todo', 'fixme', 'xxx'], location: 'start' }],
// disallow use of the with statement
// https://eslint.org/docs/rules/no-with
'no-with': 'error',
// require using Error objects as Promise rejection reasons
@@ -313,7 +387,18 @@ module.exports = {
// https://eslint.org/docs/rules/prefer-named-capture-group
'prefer-named-capture-group': 'off',
// Prefer Object.hasOwn() over Object.prototype.hasOwnProperty.call()
// https://eslint.org/docs/rules/prefer-object-has-own
// TODO: semver-major: enable thus rule, once eslint v8.5.0 is required
'prefer-object-has-own': 'off',
// https://eslint.org/docs/rules/prefer-regex-literals
'prefer-regex-literals': ['error', {
disallowRedundantWrapping: true,
}],
// require use of the second argument for parseInt()
// https://eslint.org/docs/rules/radix
radix: 'error',
// require `await` in `async function` (note: this is a horrible rule that should never be used)
@@ -325,6 +410,7 @@ module.exports = {
'require-unicode-regexp': 'off',
// requires to declare all vars on top of their containing scope
// https://eslint.org/docs/rules/vars-on-top
'vars-on-top': 'error',
// require immediate function invocation to be wrapped in parentheses
@@ -332,6 +418,7 @@ module.exports = {
'wrap-iife': ['error', 'outside', { functionPrototypeMethods: false }],
// require or disallow Yoda conditions
// https://eslint.org/docs/rules/yoda
yoda: 'error'
}
};

View File

@@ -26,6 +26,11 @@ module.exports = {
// disallow use of console
'no-console': 'warn',
// Disallows expressions where the operation doesn't affect the value
// https://eslint.org/docs/rules/no-constant-binary-expression
// TODO: semver-major, enable
'no-constant-binary-expression': 'off',
// disallow use of constant expressions in conditions
'no-constant-condition': 'warn',
@@ -38,6 +43,10 @@ module.exports = {
// disallow duplicate arguments in functions
'no-dupe-args': 'error',
// Disallow duplicate conditions in if-else-if chains
// https://eslint.org/docs/rules/no-dupe-else-if
'no-dupe-else-if': 'error',
// disallow duplicate keys when creating object literals
'no-dupe-keys': 'error',
@@ -73,6 +82,9 @@ module.exports = {
// disallow overwriting functions written as function declarations
'no-func-assign': 'error',
// https://eslint.org/docs/rules/no-import-assign
'no-import-assign': 'error',
// disallow function or variable declarations in nested blocks
'no-inner-declarations': 'error',
@@ -82,6 +94,10 @@ module.exports = {
// disallow irregular whitespace outside of strings and comments
'no-irregular-whitespace': 'error',
// Disallow Number Literals That Lose Precision
// https://eslint.org/docs/rules/no-loss-of-precision
'no-loss-of-precision': 'error',
// Disallow characters which are made with multiple code points in character class syntax
// https://eslint.org/docs/rules/no-misleading-character-class
'no-misleading-character-class': 'error',
@@ -89,6 +105,15 @@ module.exports = {
// disallow the use of object properties of the global object (Math and JSON) as functions
'no-obj-calls': 'error',
// Disallow new operators with global non-constructor functions
// https://eslint.org/docs/latest/rules/no-new-native-nonconstructor
// TODO: semver-major, enable
'no-new-native-nonconstructor': 'off',
// Disallow returning values from Promise executor functions
// https://eslint.org/docs/rules/no-promise-executor-return
'no-promise-executor-return': 'error',
// disallow use of Object.prototypes builtins directly
// https://eslint.org/docs/rules/no-prototype-builtins
'no-prototype-builtins': 'error',
@@ -96,6 +121,10 @@ module.exports = {
// disallow multiple spaces in a regular expression literal
'no-regex-spaces': 'error',
// Disallow returning values from setters
// https://eslint.org/docs/rules/no-setter-return
'no-setter-return': 'error',
// disallow sparse arrays
'no-sparse-arrays': 'error',
@@ -110,6 +139,12 @@ module.exports = {
// disallow unreachable statements after a return, throw, continue, or break statement
'no-unreachable': 'error',
// Disallow loops with a body that allows only one iteration
// https://eslint.org/docs/rules/no-unreachable-loop
'no-unreachable-loop': ['error', {
ignore: [], // WhileStatement, DoWhileStatement, ForStatement, ForInStatement, ForOfStatement
}],
// disallow return/throw/break/continue inside finally blocks
// https://eslint.org/docs/rules/no-unsafe-finally
'no-unsafe-finally': 'error',
@@ -117,13 +152,27 @@ module.exports = {
// disallow negating the left operand of relational operators
// https://eslint.org/docs/rules/no-unsafe-negation
'no-unsafe-negation': 'error',
// disallow use of optional chaining in contexts where the undefined value is not allowed
// https://eslint.org/docs/rules/no-unsafe-optional-chaining
'no-unsafe-optional-chaining': ['error', { disallowArithmeticOperators: true }],
// Disallow Unused Private Class Members
// https://eslint.org/docs/rules/no-unused-private-class-members
// TODO: enable once eslint 7 is dropped (which is semver-major)
'no-unused-private-class-members': 'off',
// Disallow useless backreferences in regular expressions
// https://eslint.org/docs/rules/no-useless-backreference
'no-useless-backreference': 'error',
// disallow negation of the left operand of an in expression
// deprecated in favor of no-unsafe-negation
'no-negated-in-lhs': 'off',
// Disallow assignments that can lead to race conditions due to usage of await or yield
// https://eslint.org/docs/rules/require-atomic-updates
// TODO: enable, semver-major
// note: not enabled because it is very buggy
'require-atomic-updates': 'off',
// disallow comparisons with the value NaN

View File

@@ -53,13 +53,22 @@ module.exports = {
// disallow importing from the same path more than once
// https://eslint.org/docs/rules/no-duplicate-imports
// replaced by https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-duplicates.md
// replaced by https://github.com/import-js/eslint-plugin-import/blob/master/docs/rules/no-duplicates.md
'no-duplicate-imports': 'off',
// disallow symbol constructor
// https://eslint.org/docs/rules/no-new-symbol
'no-new-symbol': 'error',
// Disallow specified names in exports
// https://eslint.org/docs/rules/no-restricted-exports
'no-restricted-exports': ['error', {
restrictedNamedExports: [
'default', // use `export default` to provide a default export
'then', // this will cause tons of confusion when your module is dynamically `import()`ed, and will break in most node ESM versions
],
}],
// disallow specific imports
// https://eslint.org/docs/rules/no-restricted-imports
'no-restricted-imports': ['off', {
@@ -136,7 +145,7 @@ module.exports = {
// https://eslint.org/docs/rules/prefer-rest-params
'prefer-rest-params': 'error',
// suggest using the spread operator instead of .apply()
// suggest using the spread syntax instead of .apply()
// https://eslint.org/docs/rules/prefer-spread
'prefer-spread': 'error',

View File

@@ -33,40 +33,40 @@ module.exports = {
// Static analysis:
// ensure imports point to files/modules that can be resolved
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-unresolved.md
// https://github.com/import-js/eslint-plugin-import/blob/master/docs/rules/no-unresolved.md
'import/no-unresolved': ['error', { commonjs: true, caseSensitive: true }],
// ensure named imports coupled with named exports
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/named.md#when-not-to-use-it
// https://github.com/import-js/eslint-plugin-import/blob/master/docs/rules/named.md#when-not-to-use-it
'import/named': 'error',
// ensure default import coupled with default export
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/default.md#when-not-to-use-it
// https://github.com/import-js/eslint-plugin-import/blob/master/docs/rules/default.md#when-not-to-use-it
'import/default': 'off',
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/namespace.md
// https://github.com/import-js/eslint-plugin-import/blob/master/docs/rules/namespace.md
'import/namespace': 'off',
// Helpful warnings:
// disallow invalid exports, e.g. multiple defaults
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/export.md
// https://github.com/import-js/eslint-plugin-import/blob/master/docs/rules/export.md
'import/export': 'error',
// do not allow a default import name to match a named export
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-named-as-default.md
// https://github.com/import-js/eslint-plugin-import/blob/master/docs/rules/no-named-as-default.md
'import/no-named-as-default': 'error',
// warn on accessing default export property names that are also named exports
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-named-as-default-member.md
// https://github.com/import-js/eslint-plugin-import/blob/master/docs/rules/no-named-as-default-member.md
'import/no-named-as-default-member': 'error',
// disallow use of jsdoc-marked-deprecated imports
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-deprecated.md
// https://github.com/import-js/eslint-plugin-import/blob/master/docs/rules/no-deprecated.md
'import/no-deprecated': 'off',
// Forbid the use of extraneous packages
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-extraneous-dependencies.md
// https://github.com/import-js/eslint-plugin-import/blob/master/docs/rules/no-extraneous-dependencies.md
// paths are treated both as absolute paths, and relative to process.cwd()
'import/no-extraneous-dependencies': ['error', {
devDependencies: [
@@ -90,51 +90,53 @@ module.exports = {
'**/Gruntfile{,.js}', // grunt config
'**/protractor.conf.js', // protractor config
'**/protractor.conf.*.js', // protractor config
'**/karma.conf.js', // karma config
'**/.eslintrc.js' // eslint config
],
optionalDependencies: false,
}],
// Forbid mutable exports
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-mutable-exports.md
// https://github.com/import-js/eslint-plugin-import/blob/master/docs/rules/no-mutable-exports.md
'import/no-mutable-exports': 'error',
// Module systems:
// disallow require()
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-commonjs.md
// https://github.com/import-js/eslint-plugin-import/blob/master/docs/rules/no-commonjs.md
'import/no-commonjs': 'off',
// disallow AMD require/define
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-amd.md
// https://github.com/import-js/eslint-plugin-import/blob/master/docs/rules/no-amd.md
'import/no-amd': 'error',
// No Node.js builtin modules
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-nodejs-modules.md
// https://github.com/import-js/eslint-plugin-import/blob/master/docs/rules/no-nodejs-modules.md
// TODO: enable?
'import/no-nodejs-modules': 'off',
// Style guide:
// disallow non-import statements appearing before import statements
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/first.md
// https://github.com/import-js/eslint-plugin-import/blob/master/docs/rules/first.md
'import/first': 'error',
// disallow non-import statements appearing before import statements
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/imports-first.md
// https://github.com/import-js/eslint-plugin-import/blob/master/docs/rules/imports-first.md
// deprecated: use `import/first`
'import/imports-first': 'off',
// disallow duplicate imports
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-duplicates.md
// https://github.com/import-js/eslint-plugin-import/blob/master/docs/rules/no-duplicates.md
'import/no-duplicates': 'error',
// disallow namespace imports
// TODO: enable?
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-namespace.md
// https://github.com/import-js/eslint-plugin-import/blob/master/docs/rules/no-namespace.md
'import/no-namespace': 'off',
// Ensure consistent use of file extension within the import path
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/extensions.md
// https://github.com/import-js/eslint-plugin-import/blob/master/docs/rules/extensions.md
'import/extensions': ['error', 'ignorePackages', {
js: 'never',
mjs: 'never',
@@ -142,62 +144,62 @@ module.exports = {
}],
// ensure absolute imports are above relative imports and that unassigned imports are ignored
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/order.md
// https://github.com/import-js/eslint-plugin-import/blob/master/docs/rules/order.md
// TODO: enforce a stricter convention in module import order?
'import/order': ['error', { groups: [['builtin', 'external', 'internal']] }],
// Require a newline after the last import/require in a group
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/newline-after-import.md
// https://github.com/import-js/eslint-plugin-import/blob/master/docs/rules/newline-after-import.md
'import/newline-after-import': 'error',
// Require modules with a single export to use a default export
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/prefer-default-export.md
// https://github.com/import-js/eslint-plugin-import/blob/master/docs/rules/prefer-default-export.md
'import/prefer-default-export': 'error',
// Restrict which files can be imported in a given folder
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-restricted-paths.md
// https://github.com/import-js/eslint-plugin-import/blob/master/docs/rules/no-restricted-paths.md
'import/no-restricted-paths': 'off',
// Forbid modules to have too many dependencies
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/max-dependencies.md
// https://github.com/import-js/eslint-plugin-import/blob/master/docs/rules/max-dependencies.md
'import/max-dependencies': ['off', { max: 10 }],
// Forbid import of modules using absolute paths
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-absolute-path.md
// https://github.com/import-js/eslint-plugin-import/blob/master/docs/rules/no-absolute-path.md
'import/no-absolute-path': 'error',
// Forbid require() calls with expressions
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-dynamic-require.md
// https://github.com/import-js/eslint-plugin-import/blob/master/docs/rules/no-dynamic-require.md
'import/no-dynamic-require': 'error',
// prevent importing the submodules of other modules
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-internal-modules.md
// https://github.com/import-js/eslint-plugin-import/blob/master/docs/rules/no-internal-modules.md
'import/no-internal-modules': ['off', {
allow: [],
}],
// Warn if a module could be mistakenly parsed as a script by a consumer
// leveraging Unambiguous JavaScript Grammar
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/unambiguous.md
// https://github.com/import-js/eslint-plugin-import/blob/master/docs/rules/unambiguous.md
// this should not be enabled until this proposal has at least been *presented* to TC39.
// At the moment, it's not a thing.
'import/unambiguous': 'off',
// Forbid Webpack loader syntax in imports
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-webpack-loader-syntax.md
// https://github.com/import-js/eslint-plugin-import/blob/master/docs/rules/no-webpack-loader-syntax.md
'import/no-webpack-loader-syntax': 'error',
// Prevent unassigned imports
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-unassigned-import.md
// https://github.com/import-js/eslint-plugin-import/blob/master/docs/rules/no-unassigned-import.md
// importing for side effects is perfectly acceptable, if you need side effects.
'import/no-unassigned-import': 'off',
// Prevent importing the default as if it were named
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-named-default.md
// https://github.com/import-js/eslint-plugin-import/blob/master/docs/rules/no-named-default.md
'import/no-named-default': 'error',
// Reports if a module's default export is unnamed
// https://github.com/benmosher/eslint-plugin-import/blob/d9b712ac7fd1fddc391f7b234827925c160d956f/docs/rules/no-anonymous-default-export.md
// https://github.com/import-js/eslint-plugin-import/blob/d9b712ac7fd1fddc391f7b234827925c160d956f/docs/rules/no-anonymous-default-export.md
'import/no-anonymous-default-export': ['off', {
allowArray: false,
allowArrowFunction: false,
@@ -208,54 +210,74 @@ module.exports = {
}],
// This rule enforces that all exports are declared at the bottom of the file.
// https://github.com/benmosher/eslint-plugin-import/blob/98acd6afd04dcb6920b81330114e146dc8532ea4/docs/rules/exports-last.md
// https://github.com/import-js/eslint-plugin-import/blob/98acd6afd04dcb6920b81330114e146dc8532ea4/docs/rules/exports-last.md
// TODO: enable?
'import/exports-last': 'off',
// Reports when named exports are not grouped together in a single export declaration
// or when multiple assignments to CommonJS module.exports or exports object are present
// in a single file.
// https://github.com/benmosher/eslint-plugin-import/blob/44a038c06487964394b1e15b64f3bd34e5d40cde/docs/rules/group-exports.md
// https://github.com/import-js/eslint-plugin-import/blob/44a038c06487964394b1e15b64f3bd34e5d40cde/docs/rules/group-exports.md
'import/group-exports': 'off',
// forbid default exports. this is a terrible rule, do not use it.
// https://github.com/benmosher/eslint-plugin-import/blob/44a038c06487964394b1e15b64f3bd34e5d40cde/docs/rules/no-default-export.md
// https://github.com/import-js/eslint-plugin-import/blob/44a038c06487964394b1e15b64f3bd34e5d40cde/docs/rules/no-default-export.md
'import/no-default-export': 'off',
// Prohibit named exports. this is a terrible rule, do not use it.
// https://github.com/benmosher/eslint-plugin-import/blob/1ec80fa35fa1819e2d35a70e68fb6a149fb57c5e/docs/rules/no-named-export.md
// https://github.com/import-js/eslint-plugin-import/blob/1ec80fa35fa1819e2d35a70e68fb6a149fb57c5e/docs/rules/no-named-export.md
'import/no-named-export': 'off',
// Forbid a module from importing itself
// https://github.com/benmosher/eslint-plugin-import/blob/44a038c06487964394b1e15b64f3bd34e5d40cde/docs/rules/no-self-import.md
// https://github.com/import-js/eslint-plugin-import/blob/44a038c06487964394b1e15b64f3bd34e5d40cde/docs/rules/no-self-import.md
'import/no-self-import': 'error',
// Forbid cyclical dependencies between modules
// https://github.com/benmosher/eslint-plugin-import/blob/d81f48a2506182738409805f5272eff4d77c9348/docs/rules/no-cycle.md
'import/no-cycle': ['error', { maxDepth: Infinity }],
// https://github.com/import-js/eslint-plugin-import/blob/d81f48a2506182738409805f5272eff4d77c9348/docs/rules/no-cycle.md
'import/no-cycle': ['error', { maxDepth: '∞' }],
// Ensures that there are no useless path segments
// https://github.com/benmosher/eslint-plugin-import/blob/ebafcbf59ec9f653b2ac2a0156ca3bcba0a7cf57/docs/rules/no-useless-path-segments.md
'import/no-useless-path-segments': 'error',
// https://github.com/import-js/eslint-plugin-import/blob/ebafcbf59ec9f653b2ac2a0156ca3bcba0a7cf57/docs/rules/no-useless-path-segments.md
'import/no-useless-path-segments': ['error', { commonjs: true }],
// dynamic imports require a leading comment with a webpackChunkName
// https://github.com/benmosher/eslint-plugin-import/blob/ebafcbf59ec9f653b2ac2a0156ca3bcba0a7cf57/docs/rules/dynamic-import-chunkname.md
// https://github.com/import-js/eslint-plugin-import/blob/ebafcbf59ec9f653b2ac2a0156ca3bcba0a7cf57/docs/rules/dynamic-import-chunkname.md
'import/dynamic-import-chunkname': ['off', {
importFunctions: [],
webpackChunknameFormat: '[0-9a-zA-Z-_/.]+',
}],
// Use this rule to prevent imports to folders in relative parent paths.
// https://github.com/benmosher/eslint-plugin-import/blob/c34f14f67f077acd5a61b3da9c0b0de298d20059/docs/rules/no-relative-parent-imports.md
// https://github.com/import-js/eslint-plugin-import/blob/c34f14f67f077acd5a61b3da9c0b0de298d20059/docs/rules/no-relative-parent-imports.md
'import/no-relative-parent-imports': 'off',
// Reports modules without any exports, or with unused exports
// https://github.com/benmosher/eslint-plugin-import/blob/f63dd261809de6883b13b6b5b960e6d7f42a7813/docs/rules/no-unused-modules.md
// TODO: enable, semver-major
// https://github.com/import-js/eslint-plugin-import/blob/f63dd261809de6883b13b6b5b960e6d7f42a7813/docs/rules/no-unused-modules.md
// TODO: enable once it supports CJS
'import/no-unused-modules': ['off', {
ignoreExports: [],
missingExports: true,
unusedExports: true,
}],
// Reports the use of import declarations with CommonJS exports in any module except for the main module.
// https://github.com/import-js/eslint-plugin-import/blob/1012eb951767279ce3b540a4ec4f29236104bb5b/docs/rules/no-import-module-exports.md
'import/no-import-module-exports': ['error', {
exceptions: [],
}],
// Use this rule to prevent importing packages through relative paths.
// https://github.com/import-js/eslint-plugin-import/blob/1012eb951767279ce3b540a4ec4f29236104bb5b/docs/rules/no-relative-packages.md
'import/no-relative-packages': 'error',
// enforce a consistent style for type specifiers (inline or top-level)
// https://github.com/import-js/eslint-plugin-import/blob/d5fc8b670dc8e6903dbb7b0894452f60c03089f5/docs/rules/consistent-type-specifier-style.md
// TODO, semver-major: enable (just in case)
'import/consistent-type-specifier-style': ['off', 'prefer-inline'],
// Reports the use of empty named import blocks.
// https://github.com/import-js/eslint-plugin-import/blob/d5fc8b670dc8e6903dbb7b0894452f60c03089f5/docs/rules/no-empty-named-blocks.md
// TODO, semver-minor: enable
'import/no-empty-named-blocks': 'off',
},
};

View File

@@ -76,6 +76,9 @@ module.exports = {
// enforce newline at the end of file, with no multiple empty lines
'eol-last': ['error', 'always'],
// https://eslint.org/docs/rules/function-call-argument-newline
'function-call-argument-newline': ['error', 'consistent'],
// enforce spacing between functions and their invocations
// https://eslint.org/docs/rules/func-call-spacing
'func-call-spacing': ['error', 'never'],
@@ -97,13 +100,13 @@ module.exports = {
// TODO: enable
'func-style': ['off', 'expression'],
// enforce consistent line breaks inside function parentheses
// require line breaks inside function parentheses if there are line breaks between parameters
// https://eslint.org/docs/rules/function-paren-newline
'function-paren-newline': ['error', 'consistent'],
'function-paren-newline': ['error', 'multiline-arguments'],
// Blacklist certain identifiers to prevent them being used
// https://eslint.org/docs/rules/id-blacklist
'id-blacklist': 'off',
// disallow specified identifiers
// https://eslint.org/docs/rules/id-denylist
'id-denylist': 'off',
// this option enforces minimum and maximum identifier lengths
// (variable names, property names etc.)
@@ -139,7 +142,7 @@ module.exports = {
ImportDeclaration: 1,
flatTernaryExpressions: false,
// list derived from https://github.com/benjamn/ast-types/blob/HEAD/def/jsx.js
ignoredNodes: ['JSXElement', 'JSXElement > *', 'JSXAttribute', 'JSXIdentifier', 'JSXNamespacedName', 'JSXMemberExpression', 'JSXSpreadAttribute', 'JSXExpressionContainer', 'JSXOpeningElement', 'JSXClosingElement', 'JSXText', 'JSXEmptyExpression', 'JSXSpreadChild'],
ignoredNodes: ['JSXElement', 'JSXElement > *', 'JSXAttribute', 'JSXIdentifier', 'JSXNamespacedName', 'JSXMemberExpression', 'JSXSpreadAttribute', 'JSXExpressionContainer', 'JSXOpeningElement', 'JSXClosingElement', 'JSXFragment', 'JSXOpeningFragment', 'JSXClosingFragment', 'JSXText', 'JSXEmptyExpression', 'JSXSpreadChild'],
ignoreComments: false
}],
@@ -188,6 +191,13 @@ module.exports = {
after: 'always',
}],
// Require or disallow logical assignment logical operator shorthand
// https://eslint.org/docs/latest/rules/logical-assignment-operators
// TODO, semver-major: enable
'logical-assignment-operators': ['off', 'always', {
enforceForIfStatements: true,
}],
// specify the maximum depth that blocks can be nested
'max-depth': ['off', 4],
@@ -284,7 +294,7 @@ module.exports = {
// disallow un-paren'd mixes of different operators
// https://eslint.org/docs/rules/no-mixed-operators
'no-mixed-operators': ['error', {
// the list of arthmetic groups disallows mixing `%` and `**`
// the list of arithmetic groups disallows mixing `%` and `**`
// with other arithmetic operators.
groups: [
['%', '**'],
@@ -309,7 +319,7 @@ module.exports = {
// disallow multiple empty lines, only one newline at the end, and no new lines at the beginning
// https://eslint.org/docs/rules/no-multiple-empty-lines
'no-multiple-empty-lines': ['error', { max: 2, maxBOF: 1, maxEOF: 0 }],
'no-multiple-empty-lines': ['error', { max: 1, maxBOF: 0, maxEOF: 0 }],
// disallow negated conditions
// https://eslint.org/docs/rules/no-negated-condition
@@ -348,7 +358,8 @@ module.exports = {
],
// disallow space between function identifier and application
'no-spaced-func': 'error',
// deprecated in favor of func-call-spacing
'no-spaced-func': 'off',
// disallow tab characters entirely
'no-tabs': 'error',
@@ -430,6 +441,10 @@ module.exports = {
// https://eslint.org/docs/rules/padding-line-between-statements
'padding-line-between-statements': 'off',
// Disallow the use of Math.pow in favor of the ** operator
// https://eslint.org/docs/rules/prefer-exponentiation-operator
'prefer-exponentiation-operator': 'error',
// Prefer use of an object spread over Object.assign
// https://eslint.org/docs/rules/prefer-object-spread
'prefer-object-spread': 'error',
@@ -492,7 +507,7 @@ module.exports = {
'spaced-comment': ['error', 'always', {
line: {
exceptions: ['-', '+'],
markers: ['=', '!'], // space here to support sprockets directives
markers: ['=', '!', '/'], // space here to support sprockets directives, slash for TS /// comments
},
block: {
exceptions: ['-', '+'],

View File

@@ -16,7 +16,22 @@ module.exports = {
'no-label-var': 'error',
// disallow specific globals
'no-restricted-globals': ['error', 'isFinite', 'isNaN'].concat(confusingBrowserGlobals),
'no-restricted-globals': [
'error',
{
name: 'isFinite',
message:
'Use Number.isFinite instead https://github.com/airbnb/javascript#standard-library--isfinite',
},
{
name: 'isNaN',
message:
'Use Number.isNaN instead https://github.com/airbnb/javascript#standard-library--isnan',
},
].concat(confusingBrowserGlobals.map((g) => ({
name: g,
message: `Use window.${g} instead. https://github.com/facebook/create-react-app/blob/HEAD/packages/confusing-browser-globals/README.md`,
}))),
// disallow declaration of variables already declared in the outer scope
'no-shadow': 'error',

View File

@@ -6,9 +6,10 @@ import index from '..';
const files = { ...{ index } }; // object spread is to test parsing
fs.readdirSync(path.join(__dirname, '../rules')).forEach((name) => {
const rulesDir = path.join(__dirname, '../rules');
fs.readdirSync(rulesDir).forEach((name) => {
// eslint-disable-next-line import/no-dynamic-require
files[name] = require(`../rules/${name}`); // eslint-disable-line global-require
files[name] = require(path.join(rulesDir, name)); // eslint-disable-line global-require
});
Object.keys(files).forEach((

View File

@@ -0,0 +1,49 @@
#!/usr/bin/env node
const { isArray } = Array;
const { entries } = Object;
const { ESLint } = require('eslint');
const baseConfig = require('.');
const whitespaceRules = require('./whitespaceRules');
const severities = ['off', 'warn', 'error'];
function getSeverity(ruleConfig) {
if (isArray(ruleConfig)) {
return getSeverity(ruleConfig[0]);
}
if (typeof ruleConfig === 'number') {
return severities[ruleConfig];
}
return ruleConfig;
}
async function onlyErrorOnRules(rulesToError, config) {
const errorsOnly = { ...config };
const cli = new ESLint({
useEslintrc: false,
baseConfig: config
});
const baseRules = (await cli.calculateConfigForFile(require.resolve('./'))).rules;
entries(baseRules).forEach((rule) => {
const ruleName = rule[0];
const ruleConfig = rule[1];
const severity = getSeverity(ruleConfig);
if (rulesToError.indexOf(ruleName) === -1 && severity === 'error') {
if (isArray(ruleConfig)) {
errorsOnly.rules[ruleName] = ['warn'].concat(ruleConfig.slice(1));
} else if (typeof ruleConfig === 'number') {
errorsOnly.rules[ruleName] = 1;
} else {
errorsOnly.rules[ruleName] = 'warn';
}
}
});
return errorsOnly;
}
onlyErrorOnRules(whitespaceRules, baseConfig).then((config) => console.log(JSON.stringify(config)));

View File

@@ -1,78 +1,61 @@
const assign = require('object.assign');
const entries = require('object.entries');
const CLIEngine = require('eslint').CLIEngine;
/* eslint global-require: 0 */
const baseConfig = require('.');
const { isArray } = Array;
const { entries } = Object;
const { CLIEngine } = require('eslint');
function onlyErrorOnRules(rulesToError, config) {
const errorsOnly = assign({}, config);
const cli = new CLIEngine({ baseConfig: config, useEslintrc: false });
const baseRules = cli.getConfigForFile(require.resolve('./')).rules;
if (CLIEngine) {
/* eslint no-inner-declarations: 0 */
const whitespaceRules = require('./whitespaceRules');
entries(baseRules).forEach((rule) => {
const ruleName = rule[0];
const ruleConfig = rule[1];
const baseConfig = require('.');
if (rulesToError.indexOf(ruleName) === -1) {
if (Array.isArray(ruleConfig)) {
errorsOnly.rules[ruleName] = ['warn'].concat(ruleConfig.slice(1));
} else if (typeof ruleConfig === 'number') {
errorsOnly.rules[ruleName] = 1;
} else {
errorsOnly.rules[ruleName] = 'warn';
}
const severities = ['off', 'warn', 'error'];
function getSeverity(ruleConfig) {
if (isArray(ruleConfig)) {
return getSeverity(ruleConfig[0]);
}
});
if (typeof ruleConfig === 'number') {
return severities[ruleConfig];
}
return ruleConfig;
}
return errorsOnly;
function onlyErrorOnRules(rulesToError, config) {
const errorsOnly = { ...config };
const cli = new CLIEngine({ baseConfig: config, useEslintrc: false });
const baseRules = cli.getConfigForFile(require.resolve('./')).rules;
entries(baseRules).forEach((rule) => {
const ruleName = rule[0];
const ruleConfig = rule[1];
const severity = getSeverity(ruleConfig);
if (rulesToError.indexOf(ruleName) === -1 && severity === 'error') {
if (isArray(ruleConfig)) {
errorsOnly.rules[ruleName] = ['warn'].concat(ruleConfig.slice(1));
} else if (typeof ruleConfig === 'number') {
errorsOnly.rules[ruleName] = 1;
} else {
errorsOnly.rules[ruleName] = 'warn';
}
}
});
return errorsOnly;
}
module.exports = onlyErrorOnRules(whitespaceRules, baseConfig);
} else {
const path = require('path');
const { execSync } = require('child_process');
// NOTE: ESLint adds runtime statistics to the output (so it's no longer JSON) if TIMING is set
module.exports = JSON.parse(String(execSync(path.join(__dirname, 'whitespace-async.js'), {
env: {
...process.env,
TIMING: undefined,
}
})));
}
module.exports = onlyErrorOnRules([
'array-bracket-newline',
'array-bracket-spacing',
'array-element-newline',
'arrow-spacing',
'block-spacing',
'comma-spacing',
'computed-property-spacing',
'dot-location',
'eol-last',
'func-call-spacing',
'function-paren-newline',
'generator-star-spacing',
'implicit-arrow-linebreak',
'indent',
'key-spacing',
'keyword-spacing',
'line-comment-position',
'linebreak-style',
'multiline-ternary',
'newline-per-chained-call',
'no-irregular-whitespace',
'no-mixed-spaces-and-tabs',
'no-multi-spaces',
'no-regex-spaces',
'no-spaced-func',
'no-trailing-spaces',
'no-whitespace-before-property',
'nonblock-statement-body-position',
'object-curly-newline',
'object-curly-spacing',
'object-property-newline',
'one-var-declaration-per-line',
'operator-linebreak',
'padded-blocks',
'padding-line-between-statements',
'rest-spread-spacing',
'semi-spacing',
'semi-style',
'space-before-blocks',
'space-before-function-paren',
'space-in-parens',
'space-infix-ops',
'space-unary-ops',
'spaced-comment',
'switch-colon-spacing',
'template-tag-spacing',
'import/newline-after-import',
], baseConfig);

View File

@@ -0,0 +1,49 @@
module.exports = [
'array-bracket-newline',
'array-bracket-spacing',
'array-element-newline',
'arrow-spacing',
'block-spacing',
'comma-spacing',
'computed-property-spacing',
'dot-location',
'eol-last',
'func-call-spacing',
'function-paren-newline',
'generator-star-spacing',
'implicit-arrow-linebreak',
'indent',
'key-spacing',
'keyword-spacing',
'line-comment-position',
'linebreak-style',
'multiline-ternary',
'newline-per-chained-call',
'no-irregular-whitespace',
'no-mixed-spaces-and-tabs',
'no-multi-spaces',
'no-regex-spaces',
'no-spaced-func',
'no-trailing-spaces',
'no-whitespace-before-property',
'nonblock-statement-body-position',
'object-curly-newline',
'object-curly-spacing',
'object-property-newline',
'one-var-declaration-per-line',
'operator-linebreak',
'padded-blocks',
'padding-line-between-statements',
'rest-spread-spacing',
'semi-spacing',
'semi-style',
'space-before-blocks',
'space-before-function-paren',
'space-in-parens',
'space-infix-ops',
'space-unary-ops',
'spaced-comment',
'switch-colon-spacing',
'template-tag-spacing',
'import/newline-after-import'
];

View File

@@ -4,7 +4,5 @@
// disable requiring trailing commas because it might be nice to revert to
// being JSON at some point, and I don't want to make big changes now.
"comma-dangle": 0,
// we support node 4
"prefer-destructuring": 0,
},
}

View File

@@ -1,3 +1,73 @@
19.0.4 / 2021-12-25
==================
- republish to fix #2529
19.0.3 / 2021-12-24
==================
- [patch] set `namedComponents` option to match style guide
- [deps] update `eslint-plugin-react`
19.0.2 / 2021-12-02
==================
- [meta] fix "exports" path (#2525)
- [Tests] re-enable tests disabled for the eslint 8 upgrade
19.0.1 / 2021-11-22
==================
- [fix] `whitespace`: update to support eslint 8 (#2517)
- [deps] update `eslint-plugin-react`
- [dev deps] update `tape`
19.0.0 / 2021-11-10
==================
- [breaking] support `eslint` 8; drop `eslint` < 7
- [patch] Explain why `react/jsx-key` is turned off (#2474)
- [fix] bump eslint-plugin-react-hooks peer dependency version (#2356)
- [patch] Alphabetize the rules for react-a11y.js (#2407)
- [Docs] HTTP => HTTPS (#2489)
- [readme] clarify hooks requirement (#2482)
- [deps] update `eslint-config-airbnb-base`, `eslint-plugin-jsx-a11y`, `eslint-plugin-react`, `eslint-plugin-react-hooks`, `safe-publish-latest`, `eslint-plugin-import`, `object.entries`
- [meta] add `--no-save` to link scripts
- [meta] use `prepublishOnly` script for npm 7+
- [dev deps] update `@babel/runtime`, `tape`
18.2.1 / 2020-11-06
==================
- [patch] remove deprecated `jsx-a11y/accessible-emoji` rule (#2322)
- [patch] Fix ignoreNonDOM typo in jsx-a11y/aria-role rule (#2318)
- [patch] Fixed `handle` and `on` ordering in `sort-comp` rule (#2287)
- [deps] update `eslint-plugin-jsx-a11y`, `eslint-plugin-react`
- [deps] update `eslint-config-airbnb-base`, `object.assign`
- [dev deps] update `@babel/runtime`, `eslint-find-rules`, `eslint-plugin-import`, `eslint-plugin-jsx-a11y`, `eslint-plugin-react`
18.2.0 / 2020-06-18
==================
- [new] add `eslint` `v7` (#2240)
- [minor] Allow using `eslint-plugin-react-hooks` v3 and v4 (#2235, #2207)
- [minor] Fix typo in no-multiple-empty-lines rule (#2168)
- [patch] set `explicitSpread` to ignore for `react/jsx-props-no-spreading` (#2237)
- [patch] relax `eslint-plugin-react-hooks` down to v2.3, due to a controversial change in v2.5
- [readme] fix typo (#2194)
- [deps] update `eslint-config-airbnb-base`, `eslint-plugin-jsx-a11y`, `eslint-plugin-import`, `eslint-plugin-react`, `babel-preset-airbnb`, `eslint-find-rules`, `in-publish`, `tape`, `object.entries`
- [tests] fix for eslint 7
18.1.0 / 2020-03-12
==================
- [minor] Support eslint-plugin-react-hooks@2 (#2090)
- [minor] add new disabled rules, update eslint
- [fix] `whitespace`: only set erroring rules to "warn"
- [patch] Remove duplicate `componentDidCatch` (#2108)
- [patch] Add `static-variables` to `sort-comp` rule (#2109)
- [readme] clarify hooks section in readme (#2074)
- [deps] update `eslint`, `eslint-plugin-react`, `eslint-plugin-react-hooks`, `eslint-config-airbnb-base`, `eslint-plugin-import`, `object.entries`
- [dev deps] update `@babel/runtime`, `babel-preset-airbnb`, `safe-publish-latest`, `tape`
- [tests] re-enable eslint rule `prefer-destructuring` internally (#2110)
- [tests] fix eslint errors from c66cfc3 (#2112)
18.0.1 / 2019-08-13
==================
- [patch] `react/state-in-constructor`: fix incorrect configuration
18.0.0 / 2019-08-10
==================
- [breaking] add eslint v6, drop eslint v4
@@ -397,11 +467,11 @@
[space-in-parens]: https://eslint.org/docs/rules/space-in-parens
[template-curly-spacing]: https://eslint.org/docs/rules/template-curly-spacing
[react/jsx-space-before-closing]: https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-space-before-closing.md
[react/sort-comp]: https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/sort-comp.md
[react/display-name]: https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/display-name.md
[react/jsx-no-bind]: https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-no-bind.md
[react/no-is-mounted]: https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/no-is-mounted.md
[react/prefer-es6-class]: https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/prefer-es6-class.md
[react/jsx-quotes]: https://github.com/yannickcr/eslint-plugin-react/blob/f817e37beddddc84b4788969f07c524fa7f0823b/docs/rules/jsx-quotes.md
[react/prefer-stateless-function]: https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/prefer-stateless-function.md
[react/jsx-space-before-closing]: https://github.com/jsx-eslint/eslint-plugin-react/blob/HEAD/docs/rules/jsx-space-before-closing.md
[react/sort-comp]: https://github.com/jsx-eslint/eslint-plugin-react/blob/HEAD/docs/rules/sort-comp.md
[react/display-name]: https://github.com/jsx-eslint/eslint-plugin-react/blob/HEAD/docs/rules/display-name.md
[react/jsx-no-bind]: https://github.com/jsx-eslint/eslint-plugin-react/blob/HEAD/docs/rules/jsx-no-bind.md
[react/no-is-mounted]: https://github.com/jsx-eslint/eslint-plugin-react/blob/HEAD/docs/rules/no-is-mounted.md
[react/prefer-es6-class]: https://github.com/jsx-eslint/eslint-plugin-react/blob/HEAD/docs/rules/prefer-es6-class.md
[react/jsx-quotes]: https://github.com/jsx-eslint/eslint-plugin-react/blob/f817e37beddddc84b4788969f07c524fa7f0823b/docs/rules/jsx-quotes.md
[react/prefer-stateless-function]: https://github.com/jsx-eslint/eslint-plugin-react/blob/HEAD/docs/rules/prefer-stateless-function.md

View File

@@ -1,6 +1,6 @@
# eslint-config-airbnb
[![npm version](https://badge.fury.io/js/eslint-config-airbnb.svg)](http://badge.fury.io/js/eslint-config-airbnb)
[![npm version](https://badge.fury.io/js/eslint-config-airbnb.svg)](https://badge.fury.io/js/eslint-config-airbnb)
This package provides Airbnb's .eslintrc as an extensible shared config.
@@ -10,7 +10,9 @@ We export three ESLint configurations for your usage.
### eslint-config-airbnb
Our default export contains all of our ESLint rules, including ECMAScript 6+ and React. It requires `eslint`, `eslint-plugin-import`, `eslint-plugin-react`, `eslint-plugin-react-hooks`, and `eslint-plugin-jsx-a11y`. If you don't need React, see [eslint-config-airbnb-base](https://npmjs.com/eslint-config-airbnb-base).
Our default export contains most of our ESLint rules, including ECMAScript 6+ and React. It requires `eslint`, `eslint-plugin-import`, `eslint-plugin-react`, `eslint-plugin-react-hooks`, and `eslint-plugin-jsx-a11y`. Note that it does not enable our React Hooks rules. To enable those, see the [`eslint-config-airbnb/hooks` section](#eslint-config-airbnbhooks).
If you don't need React, see [eslint-config-airbnb-base](https://npmjs.com/eslint-config-airbnb-base).
1. Install the correct versions of each package, which are listed by the command:
@@ -56,9 +58,9 @@ Our default export contains all of our ESLint rules, including ECMAScript 6+ and
2. Add `"extends": "airbnb"` to your `.eslintrc`
### eslint-config/airbnb/hooks
### eslint-config-airbnb/hooks
This entry point enables the linting rules for React hooks (requires v16.8+). To use, add `"extends": "airbnb/hooks"` to your `.eslintrc`
This entry point enables the linting rules for React hooks (requires v16.8+). To use, add `"extends": ["airbnb", "airbnb/hooks"]` to your `.eslintrc`.
### eslint-config-airbnb/whitespace

View File

@@ -1,18 +1,30 @@
{
"name": "eslint-config-airbnb",
"version": "18.0.0",
"version": "19.0.4",
"description": "Airbnb's ESLint config, following our styleguide",
"main": "index.js",
"exports": {
".": "./index.js",
"./base": "./base.js",
"./hooks": "./hooks.js",
"./legacy": "./legacy.js",
"./whitespace": "./whitespace.js",
"./rules/react": "./rules/react.js",
"./rules/react-a11y": "./rules/react-a11y.js",
"./rules/react-hooks": "./rules/react-hooks.js",
"./package.json": "./package.json"
},
"scripts": {
"prelint": "eclint check * rules/* test/*",
"prelint": "eclint check $(git ls-files | xargs find 2> /dev/null | grep -vE 'node_modules|\\.git')",
"lint": "eslint .",
"pretests-only": "node ./test/requires",
"tests-only": "babel-tape-runner ./test/test-*.js",
"prepublish": "(in-install || eslint-find-rules --unused) && (not-in-publish || npm test) && safe-publish-latest",
"prepublishOnly": "eslint-find-rules --unused && npm test && safe-publish-latest",
"prepublish": "not-in-publish || npm run prepublishOnly",
"pretest": "npm run --silent lint",
"test": "npm run --silent tests-only",
"link:eslint": "cd node_modules/eslint && npm link --production && cd -",
"pretravis": "npm run link:eslint && cd ../eslint-config-airbnb-base && npm link eslint && npm install && npm link && cd - && npm link --no-save eslint-config-airbnb-base",
"pretravis": "npm run link:eslint && cd ../eslint-config-airbnb-base && npm link --no-save eslint && npm install && npm link && cd - && npm link --no-save eslint-config-airbnb-base",
"travis": "npm run --silent tests-only",
"posttravis": "npm unlink --no-save eslint-config-airbnb-base eslint >/dev/null &"
},
@@ -54,34 +66,32 @@
},
"homepage": "https://github.com/airbnb/javascript",
"dependencies": {
"eslint-config-airbnb-base": "^14.0.0",
"object.assign": "^4.1.0",
"object.entries": "^1.1.0"
"eslint-config-airbnb-base": "^15.0.0"
},
"devDependencies": {
"@babel/runtime": "^7.5.5",
"babel-preset-airbnb": "^4.0.1",
"@babel/runtime": "^7.25.6",
"babel-preset-airbnb": "^4.5.0",
"babel-tape-runner": "^3.0.0",
"eclint": "^2.8.1",
"eslint": "^5.16.0 || ^6.1.0",
"eslint-find-rules": "^3.4.0",
"eslint-plugin-import": "^2.18.2",
"eslint-plugin-jsx-a11y": "^6.2.3",
"eslint-plugin-react": "^7.14.3",
"eslint-plugin-react-hooks": "^1.7.0",
"in-publish": "^2.0.0",
"eslint": "^7.32.0 || ^8.2.0",
"eslint-find-rules": "^4.1.0",
"eslint-plugin-import": "^2.30.0",
"eslint-plugin-jsx-a11y": "^6.10.0",
"eslint-plugin-react": "^7.36.1",
"eslint-plugin-react-hooks": "^5.1.0",
"in-publish": "^2.0.1",
"react": ">= 0.13.0",
"safe-publish-latest": "^1.1.2",
"tape": "^4.11.0"
"safe-publish-latest": "^2.0.0",
"tape": "^5.9.0"
},
"peerDependencies": {
"eslint": "^5.16.0 || ^6.1.0",
"eslint-plugin-import": "^2.18.2",
"eslint-plugin-jsx-a11y": "^6.2.3",
"eslint-plugin-react": "^7.14.3",
"eslint-plugin-react-hooks": "^1.7.0"
"eslint": "^7.32.0 || ^8.2.0",
"eslint-plugin-import": "^2.30.0",
"eslint-plugin-jsx-a11y": "^6.10.0",
"eslint-plugin-react": "^7.36.1",
"eslint-plugin-react-hooks": "^5.1.0"
},
"engines": {
"node": ">= 6"
"node": "^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0"
}
}

View File

@@ -11,29 +11,13 @@ module.exports = {
},
rules: {
// Enforce that anchors have content
// https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/anchor-has-content.md
'jsx-a11y/anchor-has-content': ['error', { components: [] }],
// Require ARIA roles to be valid and non-abstract
// https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/aria-role.md
'jsx-a11y/aria-role': ['error', { ignoreNonDom: false }],
// Enforce all aria-* props are valid.
// https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/aria-props.md
'jsx-a11y/aria-props': 'error',
// Enforce ARIA state and property values are valid.
// https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/aria-proptypes.md
'jsx-a11y/aria-proptypes': 'error',
// Enforce that elements that do not support ARIA roles, states, and
// properties do not have those attributes.
// https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/aria-unsupported-elements.md
'jsx-a11y/aria-unsupported-elements': 'error',
// ensure emoji are accessible
// https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/master/docs/rules/accessible-emoji.md
// disabled; rule is deprecated
'jsx-a11y/accessible-emoji': 'off',
// Enforce that all elements that require alternative text have meaningful information
// https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/alt-text.md
// https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/master/docs/rules/alt-text.md
'jsx-a11y/alt-text': ['error', {
elements: ['img', 'object', 'area', 'input[type="image"]'],
img: [],
@@ -42,33 +26,51 @@ module.exports = {
'input[type="image"]': [],
}],
// Prevent img alt text from containing redundant words like "image", "picture", or "photo"
// https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/img-redundant-alt.md
'jsx-a11y/img-redundant-alt': 'error',
// Enforce that anchors have content
// https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/master/docs/rules/anchor-has-content.md
'jsx-a11y/anchor-has-content': ['error', { components: [] }],
// require that JSX labels use "htmlFor"
// https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/label-has-for.md
// deprecated: replaced by `label-has-associated-control` rule
'jsx-a11y/label-has-for': ['off', {
components: [],
required: {
every: ['nesting', 'id'],
},
allowChildren: false,
// ensure <a> tags are valid
// https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/0745af376cdc8686d85a361ce36952b1fb1ccf6e/docs/rules/anchor-is-valid.md
'jsx-a11y/anchor-is-valid': ['error', {
components: ['Link'],
specialLink: ['to'],
aspects: ['noHref', 'invalidHref', 'preferButton'],
}],
// Enforce that a label tag has a text label and an associated control.
// https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/b800f40a2a69ad48015ae9226fbe879f946757ed/docs/rules/label-has-associated-control.md
'jsx-a11y/label-has-associated-control': ['error', {
labelComponents: [],
labelAttributes: [],
controlComponents: [],
assert: 'both',
depth: 25
// elements with aria-activedescendant must be tabbable
// https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/master/docs/rules/aria-activedescendant-has-tabindex.md
'jsx-a11y/aria-activedescendant-has-tabindex': 'error',
// Enforce all aria-* props are valid.
// https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/master/docs/rules/aria-props.md
'jsx-a11y/aria-props': 'error',
// Enforce ARIA state and property values are valid.
// https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/master/docs/rules/aria-proptypes.md
'jsx-a11y/aria-proptypes': 'error',
// Require ARIA roles to be valid and non-abstract
// https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/master/docs/rules/aria-role.md
'jsx-a11y/aria-role': ['error', { ignoreNonDOM: false }],
// Enforce that elements that do not support ARIA roles, states, and
// properties do not have those attributes.
// https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/master/docs/rules/aria-unsupported-elements.md
'jsx-a11y/aria-unsupported-elements': 'error',
// Ensure the autocomplete attribute is correct and suitable for the form field it is used with
// https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/29c68596b15c4ff0a40daae6d4a2670e36e37d35/docs/rules/autocomplete-valid.md
'jsx-a11y/autocomplete-valid': ['off', {
inputComponents: [],
}],
// require onClick be accompanied by onKeyUp/onKeyDown/onKeyPress
// https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/master/docs/rules/click-events-have-key-events.md
'jsx-a11y/click-events-have-key-events': 'error',
// Enforce that a control (an interactive element) has a text label.
// https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/control-has-associated-label.md
// https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/master/docs/rules/control-has-associated-label.md
'jsx-a11y/control-has-associated-label': ['error', {
labelAttributes: ['label'],
controlComponents: [],
@@ -96,77 +98,74 @@ module.exports = {
depth: 5,
}],
// require that mouseover/out come with focus/blur, for keyboard-only users
// https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/mouse-events-have-key-events.md
'jsx-a11y/mouse-events-have-key-events': 'error',
// Prevent use of `accessKey`
// https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/no-access-key.md
'jsx-a11y/no-access-key': 'error',
// require onBlur instead of onChange
// https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/no-onchange.md
'jsx-a11y/no-onchange': 'off',
// Elements with an interactive role and interaction handlers must be focusable
// https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/interactive-supports-focus.md
'jsx-a11y/interactive-supports-focus': 'error',
// Enforce that elements with ARIA roles must have all required attributes
// for that role.
// https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/role-has-required-aria-props.md
'jsx-a11y/role-has-required-aria-props': 'error',
// Enforce that elements with explicit or implicit roles defined contain
// only aria-* properties supported by that role.
// https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/role-supports-aria-props.md
'jsx-a11y/role-supports-aria-props': 'error',
// Enforce tabIndex value is not greater than zero.
// https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/tabindex-no-positive.md
'jsx-a11y/tabindex-no-positive': 'error',
// ensure <hX> tags have content and are not aria-hidden
// https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/heading-has-content.md
// https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/master/docs/rules/heading-has-content.md
'jsx-a11y/heading-has-content': ['error', { components: [''] }],
// require HTML elements to have a "lang" prop
// https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/html-has-lang.md
// https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/master/docs/rules/html-has-lang.md
'jsx-a11y/html-has-lang': 'error',
// ensure iframe elements have a unique title
// https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/master/docs/rules/iframe-has-title.md
'jsx-a11y/iframe-has-title': 'error',
// Prevent img alt text from containing redundant words like "image", "picture", or "photo"
// https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/master/docs/rules/img-redundant-alt.md
'jsx-a11y/img-redundant-alt': 'error',
// Elements with an interactive role and interaction handlers must be focusable
// https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/master/docs/rules/interactive-supports-focus.md
'jsx-a11y/interactive-supports-focus': 'error',
// Enforce that a label tag has a text label and an associated control.
// https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/b800f40a2a69ad48015ae9226fbe879f946757ed/docs/rules/label-has-associated-control.md
'jsx-a11y/label-has-associated-control': ['error', {
labelComponents: [],
labelAttributes: [],
controlComponents: [],
assert: 'both',
depth: 25
}],
// require HTML element's lang prop to be valid
// https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/lang.md
// https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/master/docs/rules/lang.md
'jsx-a11y/lang': 'error',
// media elements must have captions
// https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/master/docs/rules/media-has-caption.md
'jsx-a11y/media-has-caption': ['error', {
audio: [],
video: [],
track: [],
}],
// require that mouseover/out come with focus/blur, for keyboard-only users
// https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/master/docs/rules/mouse-events-have-key-events.md
'jsx-a11y/mouse-events-have-key-events': 'error',
// Prevent use of `accessKey`
// https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/master/docs/rules/no-access-key.md
'jsx-a11y/no-access-key': 'error',
// prohibit autoFocus prop
// https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/master/docs/rules/no-autofocus.md
'jsx-a11y/no-autofocus': ['error', { ignoreNonDOM: true }],
// prevent distracting elements, like <marquee> and <blink>
// https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/no-distracting-elements.md
// https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/master/docs/rules/no-distracting-elements.md
'jsx-a11y/no-distracting-elements': ['error', {
elements: ['marquee', 'blink'],
}],
// only allow <th> to have the "scope" attr
// https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/scope.md
'jsx-a11y/scope': 'error',
// require onClick be accompanied by onKeyUp/onKeyDown/onKeyPress
// https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/click-events-have-key-events.md
'jsx-a11y/click-events-have-key-events': 'error',
// Enforce that DOM elements without semantic behavior not have interaction handlers
// https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/no-static-element-interactions.md
'jsx-a11y/no-static-element-interactions': ['error', {
handlers: [
'onClick',
'onMouseDown',
'onMouseUp',
'onKeyPress',
'onKeyDown',
'onKeyUp',
]
// WAI-ARIA roles should not be used to convert an interactive element to non-interactive
// https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/master/docs/rules/no-interactive-element-to-noninteractive-role.md
'jsx-a11y/no-interactive-element-to-noninteractive-role': ['error', {
tr: ['none', 'presentation'],
}],
// A non-interactive element does not support event handlers (mouse and key handlers)
// https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/no-noninteractive-element-interactions.md
// https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/master/docs/rules/no-noninteractive-element-interactions.md
'jsx-a11y/no-noninteractive-element-interactions': ['error', {
handlers: [
'onClick',
@@ -178,42 +177,8 @@ module.exports = {
]
}],
// ensure emoji are accessible
// https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/accessible-emoji.md
'jsx-a11y/accessible-emoji': 'error',
// elements with aria-activedescendant must be tabbable
// https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/aria-activedescendant-has-tabindex.md
'jsx-a11y/aria-activedescendant-has-tabindex': 'error',
// ensure iframe elements have a unique title
// https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/iframe-has-title.md
'jsx-a11y/iframe-has-title': 'error',
// prohibit autoFocus prop
// https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/no-autofocus.md
'jsx-a11y/no-autofocus': ['error', { ignoreNonDOM: true }],
// ensure HTML elements do not specify redundant ARIA roles
// https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/no-redundant-roles.md
'jsx-a11y/no-redundant-roles': 'error',
// media elements must have captions
// https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/media-has-caption.md
'jsx-a11y/media-has-caption': ['error', {
audio: [],
video: [],
track: [],
}],
// WAI-ARIA roles should not be used to convert an interactive element to non-interactive
// https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/no-interactive-element-to-noninteractive-role.md
'jsx-a11y/no-interactive-element-to-noninteractive-role': ['error', {
tr: ['none', 'presentation'],
}],
// WAI-ARIA roles should not be used to convert a non-interactive element to interactive
// https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/no-noninteractive-element-to-interactive-role.md
// https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/master/docs/rules/no-noninteractive-element-to-interactive-role.md
'jsx-a11y/no-noninteractive-element-to-interactive-role': ['error', {
ul: ['listbox', 'menu', 'menubar', 'radiogroup', 'tablist', 'tree', 'treegrid'],
ol: ['listbox', 'menu', 'menubar', 'radiogroup', 'tablist', 'tree', 'treegrid'],
@@ -223,18 +188,82 @@ module.exports = {
}],
// Tab key navigation should be limited to elements on the page that can be interacted with.
// https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/no-noninteractive-tabindex.md
// https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/master/docs/rules/no-noninteractive-tabindex.md
'jsx-a11y/no-noninteractive-tabindex': ['error', {
tags: [],
roles: ['tabpanel'],
allowExpressionValues: true,
}],
// ensure <a> tags are valid
// https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/0745af376cdc8686d85a361ce36952b1fb1ccf6e/docs/rules/anchor-is-valid.md
'jsx-a11y/anchor-is-valid': ['error', {
components: ['Link'],
specialLink: ['to'],
aspects: ['noHref', 'invalidHref', 'preferButton'],
// require onBlur instead of onChange
// https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/master/docs/rules/no-onchange.md
'jsx-a11y/no-onchange': 'off',
// ensure HTML elements do not specify redundant ARIA roles
// https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/master/docs/rules/no-redundant-roles.md
'jsx-a11y/no-redundant-roles': ['error', {
nav: ['navigation'],
}],
// Enforce that DOM elements without semantic behavior not have interaction handlers
// https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/master/docs/rules/no-static-element-interactions.md
'jsx-a11y/no-static-element-interactions': ['error', {
handlers: [
'onClick',
'onMouseDown',
'onMouseUp',
'onKeyPress',
'onKeyDown',
'onKeyUp',
]
}],
// Enforce that elements with ARIA roles must have all required attributes
// for that role.
// https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/master/docs/rules/role-has-required-aria-props.md
'jsx-a11y/role-has-required-aria-props': 'error',
// Enforce that elements with explicit or implicit roles defined contain
// only aria-* properties supported by that role.
// https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/master/docs/rules/role-supports-aria-props.md
'jsx-a11y/role-supports-aria-props': 'error',
// only allow <th> to have the "scope" attr
// https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/master/docs/rules/scope.md
'jsx-a11y/scope': 'error',
// Enforce tabIndex value is not greater than zero.
// https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/master/docs/rules/tabindex-no-positive.md
'jsx-a11y/tabindex-no-positive': 'error',
// ----------------------------------------------------
// Rules that no longer exist in eslint-plugin-jsx-a11y
// ----------------------------------------------------
// require that JSX labels use "htmlFor"
// https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/master/docs/rules/label-has-for.md
// deprecated: replaced by `label-has-associated-control` rule
'jsx-a11y/label-has-for': ['off', {
components: [],
required: {
every: ['nesting', 'id'],
},
allowChildren: false,
}],
// Ensures anchor text is not ambiguous
// https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/93f78856655696a55309440593e0948c6fb96134/docs/rules/anchor-ambiguous-text.md
// TODO: semver-major, enable
'jsx-a11y/anchor-ambiguous-text': 'off',
// Enforce that aria-hidden="true" is not set on focusable elements.
// https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/93f78856655696a55309440593e0948c6fb96134/docs/rules/no-aria-hidden-on-focusable.md
// TODO: semver-major, enable
'jsx-a11y/no-aria-hidden-on-focusable': 'off',
// Enforces using semantic DOM elements over the ARIA role property.
// https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/93f78856655696a55309440593e0948c6fb96134/docs/rules/prefer-tag-over-role.md
// TODO: semver-major, enable
'jsx-a11y/prefer-tag-over-role': 'off',
},
};

View File

@@ -1,4 +1,3 @@
const assign = require('object.assign');
const baseStyleRules = require('eslint-config-airbnb-base/rules/style').rules;
const dangleRules = baseStyleRules['no-underscore-dangle'];
@@ -15,11 +14,12 @@ module.exports = {
},
// View link below for react rules documentation
// https://github.com/yannickcr/eslint-plugin-react#list-of-supported-rules
// https://github.com/jsx-eslint/eslint-plugin-react#list-of-supported-rules
rules: {
'no-underscore-dangle': [dangleRules[0], assign({}, dangleRules[1], {
'no-underscore-dangle': [dangleRules[0], {
...dangleRules[1],
allow: dangleRules[1].allow.concat(['__REDUX_DEVTOOLS_EXTENSION_COMPOSE__']),
})],
}],
// Specify whether double or single quotes should be used in JSX attributes
// https://eslint.org/docs/rules/jsx-quotes
@@ -46,12 +46,19 @@ module.exports = {
],
}],
// This rule enforces onChange or readonly attribute for checked property of input elements.
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/checked-requires-onchange-or-readonly.md
'react/checked-requires-onchange-or-readonly': ['off', {
ignoreMissingProperties: false,
ignoreExclusiveCheckedAttribute: false
}],
// Prevent missing displayName in a React component definition
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/display-name.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/display-name.md
'react/display-name': ['off', { ignoreTranspilerName: false }],
// Forbid certain propTypes (any, array, object)
// https://github.com/yannickcr/eslint-plugin-react/blob/843d71a432baf0f01f598d7cf1eea75ad6896e4b/docs/rules/forbid-prop-types.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/843d71a432baf0f01f598d7cf1eea75ad6896e4b/docs/rules/forbid-prop-types.md
'react/forbid-prop-types': ['error', {
forbid: ['any', 'array', 'object'],
checkContextTypes: true,
@@ -59,46 +66,47 @@ module.exports = {
}],
// Forbid certain props on DOM Nodes
// https://github.com/yannickcr/eslint-plugin-react/blob/843d71a432baf0f01f598d7cf1eea75ad6896e4b/docs/rules/forbid-dom-props.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/843d71a432baf0f01f598d7cf1eea75ad6896e4b/docs/rules/forbid-dom-props.md
'react/forbid-dom-props': ['off', { forbid: [] }],
// Enforce boolean attributes notation in JSX
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-boolean-value.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-boolean-value.md
'react/jsx-boolean-value': ['error', 'never', { always: [] }],
// Validate closing bracket location in JSX
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-closing-bracket-location.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-closing-bracket-location.md
'react/jsx-closing-bracket-location': ['error', 'line-aligned'],
// Validate closing tag location in JSX
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-closing-tag-location.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-closing-tag-location.md
'react/jsx-closing-tag-location': 'error',
// Enforce or disallow spaces inside of curly braces in JSX attributes
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-curly-spacing.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-curly-spacing.md
'react/jsx-curly-spacing': ['error', 'never', { allowMultiline: true }],
// Enforce event handler naming conventions in JSX
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-handler-names.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-handler-names.md
'react/jsx-handler-names': ['off', {
eventHandlerPrefix: 'handle',
eventHandlerPropPrefix: 'on',
}],
// Validate props indentation in JSX
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-indent-props.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-indent-props.md
'react/jsx-indent-props': ['error', 2],
// Validate JSX has key prop when in array or iterator
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-key.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-key.md
// Turned off because it has too many false positives
'react/jsx-key': 'off',
// Limit maximum of props on a single line in JSX
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-max-props-per-line.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-max-props-per-line.md
'react/jsx-max-props-per-line': ['error', { maximum: 1, when: 'multiline' }],
// Prevent usage of .bind() in JSX props
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-no-bind.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-no-bind.md
'react/jsx-no-bind': ['error', {
ignoreRefs: true,
allowArrowFunctions: true,
@@ -108,26 +116,26 @@ module.exports = {
}],
// Prevent duplicate props in JSX
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-no-duplicate-props.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-no-duplicate-props.md
'react/jsx-no-duplicate-props': ['error', { ignoreCase: true }],
// Prevent usage of unwrapped JSX strings
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-no-literals.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-no-literals.md
'react/jsx-no-literals': ['off', { noStrings: true }],
// Disallow undeclared variables in JSX
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-no-undef.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-no-undef.md
'react/jsx-no-undef': 'error',
// Enforce PascalCase for user-defined JSX components
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-pascal-case.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-pascal-case.md
'react/jsx-pascal-case': ['error', {
allowAllCaps: true,
ignore: [],
}],
// Enforce propTypes declarations alphabetical sorting
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/sort-prop-types.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/sort-prop-types.md
'react/sort-prop-types': ['off', {
ignoreCase: true,
callbacksLast: false,
@@ -139,7 +147,7 @@ module.exports = {
'react/jsx-sort-prop-types': 'off',
// Enforce props alphabetical sorting
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-sort-props.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-sort-props.md
'react/jsx-sort-props': ['off', {
ignoreCase: true,
callbacksLast: false,
@@ -150,74 +158,74 @@ module.exports = {
}],
// Enforce defaultProps declarations alphabetical sorting
// https://github.com/yannickcr/eslint-plugin-react/blob/843d71a432baf0f01f598d7cf1eea75ad6896e4b/docs/rules/jsx-sort-default-props.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/843d71a432baf0f01f598d7cf1eea75ad6896e4b/docs/rules/jsx-sort-default-props.md
'react/jsx-sort-default-props': ['off', {
ignoreCase: true,
}],
// Prevent React to be incorrectly marked as unused
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-uses-react.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-uses-react.md
'react/jsx-uses-react': ['error'],
// Prevent variables used in JSX to be incorrectly marked as unused
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-uses-vars.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-uses-vars.md
'react/jsx-uses-vars': 'error',
// Prevent usage of dangerous JSX properties
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/no-danger.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-danger.md
'react/no-danger': 'warn',
// Prevent usage of deprecated methods
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/no-deprecated.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-deprecated.md
'react/no-deprecated': ['error'],
// Prevent usage of setState in componentDidMount
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/no-did-mount-set-state.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-did-mount-set-state.md
// this is necessary for server-rendering
'react/no-did-mount-set-state': 'off',
// Prevent usage of setState in componentDidUpdate
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/no-did-update-set-state.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-did-update-set-state.md
'react/no-did-update-set-state': 'error',
// Prevent usage of setState in componentWillUpdate
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/no-will-update-set-state.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-will-update-set-state.md
'react/no-will-update-set-state': 'error',
// Prevent direct mutation of this.state
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/no-direct-mutation-state.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-direct-mutation-state.md
'react/no-direct-mutation-state': 'off',
// Prevent usage of isMounted
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/no-is-mounted.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-is-mounted.md
'react/no-is-mounted': 'error',
// Prevent multiple component definition per file
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/no-multi-comp.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-multi-comp.md
'react/no-multi-comp': 'off',
// Prevent usage of setState
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/no-set-state.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-set-state.md
'react/no-set-state': 'off',
// Prevent using string references
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/no-string-refs.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-string-refs.md
'react/no-string-refs': 'error',
// Prevent usage of unknown DOM property
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/no-unknown-property.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-unknown-property.md
'react/no-unknown-property': 'error',
// Require ES6 class declarations over React.createClass
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/prefer-es6-class.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/prefer-es6-class.md
'react/prefer-es6-class': ['error', 'always'],
// Require stateless functions when not using lifecycle methods, setState or ref
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/prefer-stateless-function.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/prefer-stateless-function.md
'react/prefer-stateless-function': ['error', { ignorePureComponents: true }],
// Prevent missing props validation in a React component definition
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/prop-types.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/prop-types.md
'react/prop-types': ['error', {
ignore: [],
customValidators: [],
@@ -225,24 +233,26 @@ module.exports = {
}],
// Prevent missing React when using JSX
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/react-in-jsx-scope.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/react-in-jsx-scope.md
'react/react-in-jsx-scope': 'error',
// Require render() methods to return something
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/require-render-return.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/require-render-return.md
'react/require-render-return': 'error',
// Prevent extra closing tags for components without children
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/self-closing-comp.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/self-closing-comp.md
'react/self-closing-comp': 'error',
// Enforce component methods order
// https://github.com/yannickcr/eslint-plugin-react/blob/843d71a432baf0f01f598d7cf1eea75ad6896e4b/docs/rules/sort-comp.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/843d71a432baf0f01f598d7cf1eea75ad6896e4b/docs/rules/sort-comp.md
'react/sort-comp': ['error', {
order: [
'static-variables',
'static-methods',
'instance-variables',
'lifecycle',
'/^handle.+$/',
'/^on.+$/',
'getters',
'setters',
@@ -277,8 +287,7 @@ module.exports = {
'getSnapshotBeforeUpdate',
'componentDidUpdate',
'componentDidCatch',
'componentWillUnmount',
'componentDidCatch'
'componentWillUnmount'
],
rendering: [
'/^render.+$/',
@@ -288,7 +297,7 @@ module.exports = {
}],
// Prevent missing parentheses around multilines JSX
// https://github.com/yannickcr/eslint-plugin-react/blob/843d71a432baf0f01f598d7cf1eea75ad6896e4b/docs/rules/jsx-wrap-multilines.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/843d71a432baf0f01f598d7cf1eea75ad6896e4b/docs/rules/jsx-wrap-multilines.md
'react/jsx-wrap-multilines': ['error', {
declaration: 'parens-new-line',
assignment: 'parens-new-line',
@@ -300,55 +309,55 @@ module.exports = {
}],
// Require that the first prop in a JSX element be on a new line when the element is multiline
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-first-prop-new-line.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-first-prop-new-line.md
'react/jsx-first-prop-new-line': ['error', 'multiline-multiprop'],
// Enforce spacing around jsx equals signs
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-equals-spacing.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-equals-spacing.md
'react/jsx-equals-spacing': ['error', 'never'],
// Enforce JSX indentation
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-indent.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-indent.md
'react/jsx-indent': ['error', 2],
// Disallow target="_blank" on links
// https://github.com/yannickcr/eslint-plugin-react/blob/ac102885765be5ff37847a871f239c6703e1c7cc/docs/rules/jsx-no-target-blank.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/ac102885765be5ff37847a871f239c6703e1c7cc/docs/rules/jsx-no-target-blank.md
'react/jsx-no-target-blank': ['error', { enforceDynamicLinks: 'always' }],
// only .jsx files may have JSX
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-filename-extension.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-filename-extension.md
'react/jsx-filename-extension': ['error', { extensions: ['.jsx'] }],
// prevent accidental JS comments from being injected into JSX as text
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-no-comment-textnodes.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-no-comment-textnodes.md
'react/jsx-no-comment-textnodes': 'error',
// disallow using React.render/ReactDOM.render's return value
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/no-render-return-value.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-render-return-value.md
'react/no-render-return-value': 'error',
// require a shouldComponentUpdate method, or PureRenderMixin
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/require-optimization.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/require-optimization.md
'react/require-optimization': ['off', { allowDecorators: [] }],
// warn against using findDOMNode()
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/no-find-dom-node.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-find-dom-node.md
'react/no-find-dom-node': 'error',
// Forbid certain props on Components
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/forbid-component-props.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/forbid-component-props.md
'react/forbid-component-props': ['off', { forbid: [] }],
// Forbid certain elements
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/forbid-elements.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/forbid-elements.md
'react/forbid-elements': ['off', { forbid: [], }],
// Prevent problem with children and props.dangerouslySetInnerHTML
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/no-danger-with-children.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-danger-with-children.md
'react/no-danger-with-children': 'error',
// Prevent unused propType definitions
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/no-unused-prop-types.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-unused-prop-types.md
'react/no-unused-prop-types': ['error', {
customValidators: [
],
@@ -356,19 +365,19 @@ module.exports = {
}],
// Require style prop value be an object or var
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/style-prop-object.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/style-prop-object.md
'react/style-prop-object': 'error',
// Prevent invalid characters from appearing in markup
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/no-unescaped-entities.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-unescaped-entities.md
'react/no-unescaped-entities': 'error',
// Prevent passing of children as props
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/no-children-prop.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-children-prop.md
'react/no-children-prop': 'error',
// Validate whitespace in and around the JSX opening and closing brackets
// https://github.com/yannickcr/eslint-plugin-react/blob/843d71a432baf0f01f598d7cf1eea75ad6896e4b/docs/rules/jsx-tag-spacing.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/843d71a432baf0f01f598d7cf1eea75ad6896e4b/docs/rules/jsx-tag-spacing.md
'react/jsx-tag-spacing': ['error', {
closingSlash: 'never',
beforeSelfClosing: 'always',
@@ -377,44 +386,44 @@ module.exports = {
}],
// Enforce spaces before the closing bracket of self-closing JSX elements
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-space-before-closing.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-space-before-closing.md
// Deprecated in favor of jsx-tag-spacing
'react/jsx-space-before-closing': ['off', 'always'],
// Prevent usage of Array index in keys
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/no-array-index-key.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-array-index-key.md
'react/no-array-index-key': 'error',
// Enforce a defaultProps definition for every prop that is not a required prop
// https://github.com/yannickcr/eslint-plugin-react/blob/843d71a432baf0f01f598d7cf1eea75ad6896e4b/docs/rules/require-default-props.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/843d71a432baf0f01f598d7cf1eea75ad6896e4b/docs/rules/require-default-props.md
'react/require-default-props': ['error', {
forbidDefaultForRequired: true,
}],
// Forbids using non-exported propTypes
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/forbid-foreign-prop-types.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/forbid-foreign-prop-types.md
// this is intentionally set to "warn". it would be "error",
// but it's only critical if you're stripping propTypes in production.
'react/forbid-foreign-prop-types': ['warn', { allowInPropTypes: true }],
// Prevent void DOM elements from receiving children
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/void-dom-elements-no-children.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/void-dom-elements-no-children.md
'react/void-dom-elements-no-children': 'error',
// Enforce all defaultProps have a corresponding non-required PropType
// https://github.com/yannickcr/eslint-plugin-react/blob/9e13ae2c51e44872b45cc15bf1ac3a72105bdd0e/docs/rules/default-props-match-prop-types.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/9e13ae2c51e44872b45cc15bf1ac3a72105bdd0e/docs/rules/default-props-match-prop-types.md
'react/default-props-match-prop-types': ['error', { allowRequiredDefaults: false }],
// Prevent usage of shouldComponentUpdate when extending React.PureComponent
// https://github.com/yannickcr/eslint-plugin-react/blob/9e13ae2c51e44872b45cc15bf1ac3a72105bdd0e/docs/rules/no-redundant-should-component-update.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/9e13ae2c51e44872b45cc15bf1ac3a72105bdd0e/docs/rules/no-redundant-should-component-update.md
'react/no-redundant-should-component-update': 'error',
// Prevent unused state values
// https://github.com/yannickcr/eslint-plugin-react/pull/1103/
// https://github.com/jsx-eslint/eslint-plugin-react/pull/1103/
'react/no-unused-state': 'error',
// Enforces consistent naming for boolean props
// https://github.com/yannickcr/eslint-plugin-react/blob/843d71a432baf0f01f598d7cf1eea75ad6896e4b/docs/rules/boolean-prop-naming.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/843d71a432baf0f01f598d7cf1eea75ad6896e4b/docs/rules/boolean-prop-naming.md
'react/boolean-prop-naming': ['off', {
propTypeNames: ['bool', 'mutuallyExclusiveTrueProps'],
rule: '^(is|has)[A-Z]([A-Za-z0-9]?)+',
@@ -422,27 +431,27 @@ module.exports = {
}],
// Prevents common casing typos
// https://github.com/yannickcr/eslint-plugin-react/blob/73abadb697034b5ccb514d79fb4689836fe61f91/docs/rules/no-typos.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/73abadb697034b5ccb514d79fb4689836fe61f91/docs/rules/no-typos.md
'react/no-typos': 'error',
// Enforce curly braces or disallow unnecessary curly braces in JSX props and/or children
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-curly-brace-presence.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-curly-brace-presence.md
'react/jsx-curly-brace-presence': ['error', { props: 'never', children: 'never' }],
// One JSX Element Per Line
// https://github.com/yannickcr/eslint-plugin-react/blob/843d71a432baf0f01f598d7cf1eea75ad6896e4b/docs/rules/jsx-one-expression-per-line.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/843d71a432baf0f01f598d7cf1eea75ad6896e4b/docs/rules/jsx-one-expression-per-line.md
'react/jsx-one-expression-per-line': ['error', { allow: 'single-child' }],
// Enforce consistent usage of destructuring assignment of props, state, and context
// https://github.com/yannickcr/eslint-plugin-react/blob/843d71a432baf0f01f598d7cf1eea75ad6896e4b/docs/rules/destructuring-assignment.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/843d71a432baf0f01f598d7cf1eea75ad6896e4b/docs/rules/destructuring-assignment.md
'react/destructuring-assignment': ['error', 'always'],
// Prevent using this.state within a this.setState
// https://github.com/yannickcr/eslint-plugin-react/blob/843d71a432baf0f01f598d7cf1eea75ad6896e4b/docs/rules/no-access-state-in-setstate.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/843d71a432baf0f01f598d7cf1eea75ad6896e4b/docs/rules/no-access-state-in-setstate.md
'react/no-access-state-in-setstate': 'error',
// Prevent usage of button elements without an explicit type attribute
// https://github.com/yannickcr/eslint-plugin-react/blob/843d71a432baf0f01f598d7cf1eea75ad6896e4b/docs/rules/button-has-type.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/843d71a432baf0f01f598d7cf1eea75ad6896e4b/docs/rules/button-has-type.md
'react/button-has-type': ['error', {
button: true,
submit: true,
@@ -453,53 +462,144 @@ module.exports = {
'react/jsx-child-element-spacing': 'off',
// Prevent this from being used in stateless functional components
// https://github.com/yannickcr/eslint-plugin-react/blob/843d71a432baf0f01f598d7cf1eea75ad6896e4b/docs/rules/no-this-in-sfc.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/843d71a432baf0f01f598d7cf1eea75ad6896e4b/docs/rules/no-this-in-sfc.md
'react/no-this-in-sfc': 'error',
// Validate JSX maximum depth
// https://github.com/yannickcr/eslint-plugin-react/blob/abe8381c0d6748047224c430ce47f02e40160ed0/docs/rules/jsx-max-depth.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/abe8381c0d6748047224c430ce47f02e40160ed0/docs/rules/jsx-max-depth.md
'react/jsx-max-depth': 'off',
// Disallow multiple spaces between inline JSX props
// https://github.com/yannickcr/eslint-plugin-react/blob/ac102885765be5ff37847a871f239c6703e1c7cc/docs/rules/jsx-props-no-multi-spaces.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/ac102885765be5ff37847a871f239c6703e1c7cc/docs/rules/jsx-props-no-multi-spaces.md
'react/jsx-props-no-multi-spaces': 'error',
// Prevent usage of UNSAFE_ methods
// https://github.com/yannickcr/eslint-plugin-react/blob/157cc932be2cfaa56b3f5b45df6f6d4322a2f660/docs/rules/no-unsafe.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/157cc932be2cfaa56b3f5b45df6f6d4322a2f660/docs/rules/no-unsafe.md
'react/no-unsafe': 'off',
// Enforce shorthand or standard form for React fragments
// https://github.com/yannickcr/eslint-plugin-react/blob/bc976b837abeab1dffd90ac6168b746a83fc83cc/docs/rules/jsx-fragments.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/bc976b837abeab1dffd90ac6168b746a83fc83cc/docs/rules/jsx-fragments.md
'react/jsx-fragments': ['error', 'syntax'],
// Enforce linebreaks in curly braces in JSX attributes and expressions.
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-curly-newline.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-curly-newline.md
'react/jsx-curly-newline': ['error', {
multiline: 'consistent',
singleline: 'consistent',
}],
// Enforce state initialization style
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/state-in-constructor.md
// TODO: set to "always" once babel-preset-airbnb supports public class fields
'react/state-in-constructor': ['error', 'never'],
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/state-in-constructor.md
// TODO: set to "never" once babel-preset-airbnb supports public class fields
'react/state-in-constructor': ['error', 'always'],
// Enforces where React component static properties should be positioned
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/static-property-placement.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/static-property-placement.md
// TODO: set to "static public field" once babel-preset-airbnb supports public class fields
'react/static-property-placement': ['error', 'property assignment'],
// Disallow JSX props spreading
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-props-no-spreading.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-props-no-spreading.md
'react/jsx-props-no-spreading': ['error', {
html: 'enforce',
custom: 'enforce',
explicitSpread: 'ignore',
exceptions: [],
}],
// Enforce that props are read-only
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/prefer-read-only-props.md
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/prefer-read-only-props.md
'react/prefer-read-only-props': 'off',
// Prevent usage of `javascript:` URLs
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-no-script-url.md
'react/jsx-no-script-url': ['error', [
{
name: 'Link',
props: ['to'],
},
]],
// Disallow unnecessary fragments
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-no-useless-fragment.md
'react/jsx-no-useless-fragment': 'error',
// Prevent adjacent inline elements not separated by whitespace
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-adjacent-inline-elements.md
// TODO: enable? semver-major
'react/no-adjacent-inline-elements': 'off',
// Enforce a specific function type for function components
// https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/function-component-definition.md
'react/function-component-definition': ['error', {
namedComponents: ['function-declaration', 'function-expression'],
unnamedComponents: 'function-expression',
}],
// Enforce a new line after jsx elements and expressions
// https://github.com/jsx-eslint/eslint-plugin-react/blob/e2eaadae316f9506d163812a09424eb42698470a/docs/rules/jsx-newline.md
'react/jsx-newline': 'off',
// Prevent react contexts from taking non-stable values
// https://github.com/jsx-eslint/eslint-plugin-react/blob/e2eaadae316f9506d163812a09424eb42698470a/docs/rules/jsx-no-constructed-context-values.md
'react/jsx-no-constructed-context-values': 'error',
// Prevent creating unstable components inside components
// https://github.com/jsx-eslint/eslint-plugin-react/blob/c2a790a3472eea0f6de984bdc3ee2a62197417fb/docs/rules/no-unstable-nested-components.md
'react/no-unstable-nested-components': 'error',
// Enforce that namespaces are not used in React elements
// https://github.com/jsx-eslint/eslint-plugin-react/blob/8785c169c25b09b33c95655bf508cf46263bc53f/docs/rules/no-namespace.md
'react/no-namespace': 'error',
// Prefer exact proptype definitions
// https://github.com/jsx-eslint/eslint-plugin-react/blob/8785c169c25b09b33c95655bf508cf46263bc53f/docs/rules/prefer-exact-props.md
'react/prefer-exact-props': 'error',
// Lifecycle methods should be methods on the prototype, not class fields
// https://github.com/jsx-eslint/eslint-plugin-react/blob/21e01b61af7a38fc86d94f27eb66cda8054582ed/docs/rules/no-arrow-function-lifecycle.md
'react/no-arrow-function-lifecycle': 'error',
// Prevent usage of invalid attributes
// https://github.com/jsx-eslint/eslint-plugin-react/blob/21e01b61af7a38fc86d94f27eb66cda8054582ed/docs/rules/no-invalid-html-attribute.md
'react/no-invalid-html-attribute': 'error',
// Prevent declaring unused methods of component class
// https://github.com/jsx-eslint/eslint-plugin-react/blob/21e01b61af7a38fc86d94f27eb66cda8054582ed/docs/rules/no-unused-class-component-methods.md
'react/no-unused-class-component-methods': 'error',
// Ensure destructuring and symmetric naming of useState hook value and setter variables
// https://github.com/jsx-eslint/eslint-plugin-react/blob/c8833f301314dab3e79ef7ac4cf863e4d5fa0019/docs/rules/hook-use-state.md
// TODO: semver-major, enable
'react/hook-use-state': 'off',
// Enforce sandbox attribute on iframe elements
// https://github.com/jsx-eslint/eslint-plugin-react/blob/c8833f301314dab3e79ef7ac4cf863e4d5fa0019/docs/rules/iframe-missing-sandbox.md
// TODO: semver-major, enable
'react/iframe-missing-sandbox': 'off',
// Prevent problematic leaked values from being rendered
// https://github.com/jsx-eslint/eslint-plugin-react/blob/c42b624d0fb9ad647583a775ab9751091eec066f/docs/rules/jsx-no-leaked-render.md
// TODO: semver-major, enable
'react/jsx-no-leaked-render': 'off',
// https://github.com/jsx-eslint/eslint-plugin-react/blob/66b58dd4864678eb869a7bf434c72ff7ac530eb1/docs/rules/no-object-type-as-default-prop.md
// TODO: semver-major, enable
'react/no-object-type-as-default-prop': 'off',
// https://github.com/jsx-eslint/eslint-plugin-react/blob/66b58dd4864678eb869a7bf434c72ff7ac530eb1/docs/rules/sort-default-props.md
// TODO: semver-major, enable?
'react/sort-default-props': ['off', {
ignoreCase: false
}],
// https://github.com/jsx-eslint/eslint-plugin-react/blob/9668ee0762acd5c23f53cd3a372e2d8d9563944d/docs/rules/forward-ref-uses-ref.md
// TODO: semver-major, enable
'react/forward-ref-uses-ref': 'off',
// https://github.com/jsx-eslint/eslint-plugin-react/blob/9668ee0762acd5c23f53cd3a372e2d8d9563944d/docs/rules/jsx-props-no-spread-multi.md
// TODO: semver-major, enable
'react/jsx-props-no-spread-multi': 'off',
},
settings: {

View File

@@ -6,13 +6,14 @@ const base = require('../base');
const files = { base };
fs.readdirSync(path.join(__dirname, '../rules')).forEach((name) => {
const rulesDir = path.join(__dirname, '../rules');
fs.readdirSync(rulesDir).forEach((name) => {
if (name === 'react.js' || name === 'react-a11y.js') {
return;
}
// eslint-disable-next-line import/no-dynamic-require
files[name] = require(`../rules/${name}`); // eslint-disable-line global-require
files[name] = require(path.join(rulesDir, name)); // eslint-disable-line global-require
});
Object.keys(files).forEach((name) => {

View File

@@ -1,68 +1,68 @@
import test from 'tape';
import { CLIEngine } from 'eslint';
import { CLIEngine, ESLint } from 'eslint';
import eslintrc from '..';
import reactRules from '../rules/react';
import reactA11yRules from '../rules/react-a11y';
const cli = new CLIEngine({
const rules = {
// It is okay to import devDependencies in tests.
'import/no-extraneous-dependencies': [2, { devDependencies: true }],
// this doesn't matter for tests
'lines-between-class-members': 0,
// otherwise we need some junk in our fixture code
'react/no-unused-class-component-methods': 0,
};
const cli = new (CLIEngine || ESLint)({
useEslintrc: false,
baseConfig: eslintrc,
rules: {
// It is okay to import devDependencies in tests.
'import/no-extraneous-dependencies': [2, { devDependencies: true }],
// this doesn't matter for tests
'lines-between-class-members': 0,
},
...(CLIEngine ? { rules } : { overrideConfig: { rules } }),
});
function lint(text) {
async function lint(text) {
// @see https://eslint.org/docs/developer-guide/nodejs-api.html#executeonfiles
// @see https://eslint.org/docs/developer-guide/nodejs-api.html#executeontext
const linter = cli.executeOnText(text);
return linter.results[0];
const linter = CLIEngine ? cli.executeOnText(text) : await cli.lintText(text);
return (CLIEngine ? linter.results : linter)[0];
}
function wrapComponent(body) {
return `
return `\
import React from 'react';
export default class MyComponent extends React.Component {
/* eslint no-empty-function: 0, class-methods-use-this: 0 */
${body}
}
${body}}
`;
}
test('validate react prop order', (t) => {
test('validate react methods order', (t) => {
t.test('make sure our eslintrc has React and JSX linting dependencies', (t) => {
t.plan(2);
t.deepEqual(reactRules.plugins, ['react']);
t.deepEqual(reactA11yRules.plugins, ['jsx-a11y', 'react']);
});
t.test('passes a good component', (t) => {
t.plan(3);
const result = lint(wrapComponent(`
componentWillMount() {}
t.test('passes a good component', async (t) => {
const result = await lint(wrapComponent(`
componentDidMount() {}
handleSubmit() {}
onButtonAClick() {}
setFoo() {}
getFoo() {}
setBar() {}
someMethod() {}
renderDogs() {}
render() { return <div />; }`));
render() { return <div />; }
`));
t.notOk(result.warningCount, 'no warnings');
t.notOk(result.errorCount, 'no errors');
t.deepEquals(result.messages, [], 'no messages in results');
t.notOk(result.errorCount, 'no errors');
});
t.test('order: when random method is first', (t) => {
t.plan(2);
const result = lint(wrapComponent(`
t.test('order: when random method is first', async (t) => {
const result = await lint(wrapComponent(`
someMethod() {}
componentWillMount() {}
componentDidMount() {}
setFoo() {}
getFoo() {}
@@ -72,13 +72,11 @@ test('validate react prop order', (t) => {
`));
t.ok(result.errorCount, 'fails');
t.equal(result.messages[0].ruleId, 'react/sort-comp', 'fails due to sort');
t.deepEqual(result.messages.map((msg) => msg.ruleId), ['react/sort-comp'], 'fails due to sort');
});
t.test('order: when random method after lifecycle methods', (t) => {
t.plan(2);
const result = lint(wrapComponent(`
componentWillMount() {}
t.test('order: when random method after lifecycle methods', async (t) => {
const result = await lint(wrapComponent(`
componentDidMount() {}
someMethod() {}
setFoo() {}
@@ -89,6 +87,46 @@ test('validate react prop order', (t) => {
`));
t.ok(result.errorCount, 'fails');
t.equal(result.messages[0].ruleId, 'react/sort-comp', 'fails due to sort');
t.deepEqual(result.messages.map((msg) => msg.ruleId), ['react/sort-comp'], 'fails due to sort');
});
t.test('order: when handler method with `handle` prefix after method with `on` prefix', async (t) => {
const result = await lint(wrapComponent(`
componentDidMount() {}
onButtonAClick() {}
handleSubmit() {}
setFoo() {}
getFoo() {}
render() { return <div />; }
`));
t.ok(result.errorCount, 'fails');
t.deepEqual(result.messages.map((msg) => msg.ruleId), ['react/sort-comp'], 'fails due to sort');
});
t.test('order: when lifecycle methods after event handler methods', async (t) => {
const result = await lint(wrapComponent(`
handleSubmit() {}
componentDidMount() {}
setFoo() {}
getFoo() {}
render() { return <div />; }
`));
t.ok(result.errorCount, 'fails');
t.deepEqual(result.messages.map((msg) => msg.ruleId), ['react/sort-comp'], 'fails due to sort');
});
t.test('order: when event handler methods after getters and setters', async (t) => {
const result = await lint(wrapComponent(`
componentDidMount() {}
setFoo() {}
getFoo() {}
handleSubmit() {}
render() { return <div />; }
`));
t.ok(result.errorCount, 'fails');
t.deepEqual(result.messages.map((msg) => msg.ruleId), ['react/sort-comp'], 'fails due to sort');
});
});

View File

@@ -0,0 +1,49 @@
#!/usr/bin/env node
const { isArray } = Array;
const { entries } = Object;
const { ESLint } = require('eslint');
const baseConfig = require('.');
const whitespaceRules = require('./whitespaceRules');
const severities = ['off', 'warn', 'error'];
function getSeverity(ruleConfig) {
if (isArray(ruleConfig)) {
return getSeverity(ruleConfig[0]);
}
if (typeof ruleConfig === 'number') {
return severities[ruleConfig];
}
return ruleConfig;
}
async function onlyErrorOnRules(rulesToError, config) {
const errorsOnly = { ...config };
const cli = new ESLint({
useEslintrc: false,
baseConfig: config
});
const baseRules = (await cli.calculateConfigForFile(require.resolve('./'))).rules;
entries(baseRules).forEach((rule) => {
const ruleName = rule[0];
const ruleConfig = rule[1];
const severity = getSeverity(ruleConfig);
if (rulesToError.indexOf(ruleName) === -1 && severity === 'error') {
if (isArray(ruleConfig)) {
errorsOnly.rules[ruleName] = ['warn'].concat(ruleConfig.slice(1));
} else if (typeof ruleConfig === 'number') {
errorsOnly.rules[ruleName] = 1;
} else {
errorsOnly.rules[ruleName] = 'warn';
}
}
});
return errorsOnly;
}
onlyErrorOnRules(whitespaceRules, baseConfig).then((config) => console.log(JSON.stringify(config)));

View File

@@ -1,92 +1,61 @@
const assign = require('object.assign');
const entries = require('object.entries');
const CLIEngine = require('eslint').CLIEngine;
/* eslint global-require: 0 */
const baseConfig = require('.');
const { isArray } = Array;
const { entries } = Object;
const { CLIEngine } = require('eslint');
function onlyErrorOnRules(rulesToError, config) {
const errorsOnly = assign({}, config);
const cli = new CLIEngine({ baseConfig: config, useEslintrc: false });
const baseRules = cli.getConfigForFile(require.resolve('./')).rules;
if (CLIEngine) {
/* eslint no-inner-declarations: 0 */
const whitespaceRules = require('./whitespaceRules');
entries(baseRules).forEach((rule) => {
const ruleName = rule[0];
const ruleConfig = rule[1];
const baseConfig = require('.');
if (rulesToError.indexOf(ruleName) === -1) {
if (Array.isArray(ruleConfig)) {
errorsOnly.rules[ruleName] = ['warn'].concat(ruleConfig.slice(1));
} else if (typeof ruleConfig === 'number') {
errorsOnly.rules[ruleName] = 1;
} else {
errorsOnly.rules[ruleName] = 'warn';
}
const severities = ['off', 'warn', 'error'];
function getSeverity(ruleConfig) {
if (isArray(ruleConfig)) {
return getSeverity(ruleConfig[0]);
}
});
if (typeof ruleConfig === 'number') {
return severities[ruleConfig];
}
return ruleConfig;
}
return errorsOnly;
function onlyErrorOnRules(rulesToError, config) {
const errorsOnly = { ...config };
const cli = new CLIEngine({ baseConfig: config, useEslintrc: false });
const baseRules = cli.getConfigForFile(require.resolve('./')).rules;
entries(baseRules).forEach((rule) => {
const ruleName = rule[0];
const ruleConfig = rule[1];
const severity = getSeverity(ruleConfig);
if (rulesToError.indexOf(ruleName) === -1 && severity === 'error') {
if (isArray(ruleConfig)) {
errorsOnly.rules[ruleName] = ['warn'].concat(ruleConfig.slice(1));
} else if (typeof ruleConfig === 'number') {
errorsOnly.rules[ruleName] = 1;
} else {
errorsOnly.rules[ruleName] = 'warn';
}
}
});
return errorsOnly;
}
module.exports = onlyErrorOnRules(whitespaceRules, baseConfig);
} else {
const path = require('path');
const { execSync } = require('child_process');
// NOTE: ESLint adds runtime statistics to the output (so it's no longer JSON) if TIMING is set
module.exports = JSON.parse(String(execSync(path.join(__dirname, 'whitespace-async.js'), {
env: {
...process.env,
TIMING: undefined,
}
})));
}
module.exports = onlyErrorOnRules([
'array-bracket-newline',
'array-bracket-spacing',
'array-element-newline',
'arrow-spacing',
'block-spacing',
'comma-spacing',
'computed-property-spacing',
'dot-location',
'eol-last',
'func-call-spacing',
'function-paren-newline',
'generator-star-spacing',
'implicit-arrow-linebreak',
'indent',
'key-spacing',
'keyword-spacing',
'line-comment-position',
'linebreak-style',
'multiline-ternary',
'newline-per-chained-call',
'no-irregular-whitespace',
'no-mixed-spaces-and-tabs',
'no-multi-spaces',
'no-regex-spaces',
'no-spaced-func',
'no-trailing-spaces',
'no-whitespace-before-property',
'nonblock-statement-body-position',
'object-curly-newline',
'object-curly-spacing',
'object-property-newline',
'one-var-declaration-per-line',
'operator-linebreak',
'padded-blocks',
'padding-line-between-statements',
'rest-spread-spacing',
'semi-spacing',
'semi-style',
'space-before-blocks',
'space-before-function-paren',
'space-in-parens',
'space-infix-ops',
'space-unary-ops',
'spaced-comment',
'switch-colon-spacing',
'template-tag-spacing',
'import/newline-after-import',
// eslint-plugin-react rules
'react/jsx-child-element-spacing',
'react/jsx-closing-bracket-location',
'react/jsx-closing-tag-location',
'react/jsx-curly-spacing',
'react/jsx-equals-spacing',
'react/jsx-first-prop-newline',
'react/jsx-indent',
'react/jsx-indent-props',
'react/jsx-max-props-per-line',
'react/jsx-one-expression-per-line',
'react/jsx-space-before-closing',
'react/jsx-tag-spacing',
'react/jsx-wrap-multilines',
], baseConfig);

View File

@@ -0,0 +1,64 @@
module.exports = [
'array-bracket-newline',
'array-bracket-spacing',
'array-element-newline',
'arrow-spacing',
'block-spacing',
'comma-spacing',
'computed-property-spacing',
'dot-location',
'eol-last',
'func-call-spacing',
'function-paren-newline',
'generator-star-spacing',
'implicit-arrow-linebreak',
'indent',
'key-spacing',
'keyword-spacing',
'line-comment-position',
'linebreak-style',
'multiline-ternary',
'newline-per-chained-call',
'no-irregular-whitespace',
'no-mixed-spaces-and-tabs',
'no-multi-spaces',
'no-regex-spaces',
'no-spaced-func',
'no-trailing-spaces',
'no-whitespace-before-property',
'nonblock-statement-body-position',
'object-curly-newline',
'object-curly-spacing',
'object-property-newline',
'one-var-declaration-per-line',
'operator-linebreak',
'padded-blocks',
'padding-line-between-statements',
'rest-spread-spacing',
'semi-spacing',
'semi-style',
'space-before-blocks',
'space-before-function-paren',
'space-in-parens',
'space-infix-ops',
'space-unary-ops',
'spaced-comment',
'switch-colon-spacing',
'template-tag-spacing',
'import/newline-after-import',
// eslint-plugin-react rules
'react/jsx-child-element-spacing',
'react/jsx-closing-bracket-location',
'react/jsx-closing-tag-location',
'react/jsx-curly-spacing',
'react/jsx-equals-spacing',
'react/jsx-first-prop-newline',
'react/jsx-indent',
'react/jsx-indent-props',
'react/jsx-max-props-per-line',
'react/jsx-one-expression-per-line',
'react/jsx-space-before-closing',
'react/jsx-tag-spacing',
'react/jsx-wrap-multilines',
];

View File

@@ -25,14 +25,14 @@ This style guide is mostly based on the standards that are currently prevalent i
## Basic Rules
- Only include one React component per file.
- However, multiple [Stateless, or Pure, Components](https://facebook.github.io/react/docs/reusable-components.html#stateless-functions) are allowed per file. eslint: [`react/no-multi-comp`](https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/no-multi-comp.md#ignorestateless).
- However, multiple [Stateless, or Pure, Components](https://facebook.github.io/react/docs/reusable-components.html#stateless-functions) are allowed per file. eslint: [`react/no-multi-comp`](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-multi-comp.md#ignorestateless).
- Always use JSX syntax.
- Do not use `React.createElement` unless youre initializing the app from a file that is not JSX.
- [`react/forbid-prop-types`](https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/forbid-prop-types.md) will allow `arrays` and `objects` only if it is explicitly noted what `array` and `object` contains, using `arrayOf`, `objectOf`, or `shape`.
- [`react/forbid-prop-types`](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/forbid-prop-types.md) will allow `arrays` and `objects` only if it is explicitly noted what `array` and `object` contains, using `arrayOf`, `objectOf`, or `shape`.
## Class vs `React.createClass` vs stateless
- If you have internal state and/or refs, prefer `class extends React.Component` over `React.createClass`. eslint: [`react/prefer-es6-class`](https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/prefer-es6-class.md) [`react/prefer-stateless-function`](https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/prefer-stateless-function.md)
- If you have internal state and/or refs, prefer `class extends React.Component` over `React.createClass`. eslint: [`react/prefer-es6-class`](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/prefer-es6-class.md) [`react/prefer-stateless-function`](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/prefer-stateless-function.md)
```jsx
// bad
@@ -81,9 +81,9 @@ This style guide is mostly based on the standards that are currently prevalent i
## Naming
- **Extensions**: Use `.jsx` extension for React components. eslint: [`react/jsx-filename-extension`](https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-filename-extension.md)
- **Extensions**: Use `.jsx` extension for React components. eslint: [`react/jsx-filename-extension`](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-filename-extension.md)
- **Filename**: Use PascalCase for filenames. E.g., `ReservationCard.jsx`.
- **Reference Naming**: Use PascalCase for React components and camelCase for their instances. eslint: [`react/jsx-pascal-case`](https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-pascal-case.md)
- **Reference Naming**: Use PascalCase for React components and camelCase for their instances. eslint: [`react/jsx-pascal-case`](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-pascal-case.md)
```jsx
// bad
@@ -111,6 +111,7 @@ This style guide is mostly based on the standards that are currently prevalent i
// good
import Footer from './Footer';
```
- **Higher-order Component Naming**: Use a composite of the higher-order components name and the passed-in components name as the `displayName` on the generated component. For example, the higher-order component `withFoo()`, when passed a component `Bar` should produce a component with a `displayName` of `withFoo(Bar)`.
> Why? A components `displayName` may be used by developer tools or in error messages, and having a value that clearly expresses this relationship helps people understand what is happening.
@@ -171,7 +172,7 @@ This style guide is mostly based on the standards that are currently prevalent i
## Alignment
- Follow these alignment styles for JSX syntax. eslint: [`react/jsx-closing-bracket-location`](https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-closing-bracket-location.md) [`react/jsx-closing-tag-location`](https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-closing-tag-location.md)
- Follow these alignment styles for JSX syntax. eslint: [`react/jsx-closing-bracket-location`](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-closing-bracket-location.md) [`react/jsx-closing-tag-location`](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-closing-tag-location.md)
```jsx
// bad
@@ -213,6 +214,27 @@ This style guide is mostly based on the standards that are currently prevalent i
// good
{showButton && <Button />}
// good
{someReallyLongConditional
&& anotherLongConditional
&& (
<Foo
superLongParam="bar"
anotherSuperLongParam="baz"
/>
)
}
// good
{someConditional ? (
<Foo />
) : (
<Foo
superLongParam="bar"
anotherSuperLongParam="baz"
/>
)}
```
## Quotes
@@ -237,7 +259,7 @@ This style guide is mostly based on the standards that are currently prevalent i
## Spacing
- Always include a single space in your self-closing tag. eslint: [`no-multi-spaces`](https://eslint.org/docs/rules/no-multi-spaces), [`react/jsx-tag-spacing`](https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-tag-spacing.md)
- Always include a single space in your self-closing tag. eslint: [`no-multi-spaces`](https://eslint.org/docs/rules/no-multi-spaces), [`react/jsx-tag-spacing`](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-tag-spacing.md)
```jsx
// bad
@@ -254,7 +276,7 @@ This style guide is mostly based on the standards that are currently prevalent i
<Foo />
```
- Do not pad JSX curly braces with spaces. eslint: [`react/jsx-curly-spacing`](https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-curly-spacing.md)
- Do not pad JSX curly braces with spaces. eslint: [`react/jsx-curly-spacing`](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-curly-spacing.md)
```jsx
// bad
@@ -266,7 +288,7 @@ This style guide is mostly based on the standards that are currently prevalent i
## Props
- Always use camelCase for prop names.
- Always use camelCase for prop names, or PascalCase if the prop value is a React component.
```jsx
// bad
@@ -279,10 +301,11 @@ This style guide is mostly based on the standards that are currently prevalent i
<Foo
userName="hello"
phoneNumber={12345678}
Component={SomeComponent}
/>
```
- Omit the value of the prop when it is explicitly `true`. eslint: [`react/jsx-boolean-value`](https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-boolean-value.md)
- Omit the value of the prop when it is explicitly `true`. eslint: [`react/jsx-boolean-value`](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-boolean-value.md)
```jsx
// bad
@@ -299,7 +322,7 @@ This style guide is mostly based on the standards that are currently prevalent i
<Foo hidden />
```
- Always include an `alt` prop on `<img>` tags. If the image is presentational, `alt` can be an empty string or the `<img>` must have `role="presentation"`. eslint: [`jsx-a11y/alt-text`](https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/alt-text.md)
- Always include an `alt` prop on `<img>` tags. If the image is presentational, `alt` can be an empty string or the `<img>` must have `role="presentation"`. eslint: [`jsx-a11y/alt-text`](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/master/docs/rules/alt-text.md)
```jsx
// bad
@@ -315,7 +338,7 @@ This style guide is mostly based on the standards that are currently prevalent i
<img src="hello.jpg" role="presentation" />
```
- Do not use words like "image", "photo", or "picture" in `<img>` `alt` props. eslint: [`jsx-a11y/img-redundant-alt`](https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/img-redundant-alt.md)
- Do not use words like "image", "photo", or "picture" in `<img>` `alt` props. eslint: [`jsx-a11y/img-redundant-alt`](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/master/docs/rules/img-redundant-alt.md)
> Why? Screenreaders already announce `img` elements as images, so there is no need to include this information in the alt text.
@@ -327,7 +350,7 @@ This style guide is mostly based on the standards that are currently prevalent i
<img src="hello.jpg" alt="Me waving hello" />
```
- Use only valid, non-abstract [ARIA roles](https://www.w3.org/TR/wai-aria/#usage_intro). eslint: [`jsx-a11y/aria-role`](https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/aria-role.md)
- Use only valid, non-abstract [ARIA roles](https://www.w3.org/TR/wai-aria/#usage_intro). eslint: [`jsx-a11y/aria-role`](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/master/docs/rules/aria-role.md)
```jsx
// bad - not an ARIA role
@@ -340,7 +363,7 @@ This style guide is mostly based on the standards that are currently prevalent i
<div role="button" />
```
- Do not use `accessKey` on elements. eslint: [`jsx-a11y/no-access-key`](https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/no-access-key.md)
- Do not use `accessKey` on elements. eslint: [`jsx-a11y/no-access-key`](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/master/docs/rules/no-access-key.md)
> Why? Inconsistencies between keyboard shortcuts and keyboard commands used by people using screenreaders and keyboards complicate accessibility.
@@ -352,7 +375,7 @@ This style guide is mostly based on the standards that are currently prevalent i
<div />
```
- Avoid using an array index as `key` prop, prefer a stable ID. eslint: [`react/no-array-index-key`](https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/no-array-index-key.md)
- Avoid using an array index as `key` prop, prefer a stable ID. eslint: [`react/no-array-index-key`](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-array-index-key.md)
> Why? Not using a stable ID [is an anti-pattern](https://medium.com/@robinpokorny/index-as-a-key-is-an-anti-pattern-e0349aece318) because it can negatively impact performance and cause issues with component state.
@@ -460,7 +483,7 @@ We dont recommend using indexes for keys if the order of items may change.
## Refs
- Always use ref callbacks. eslint: [`react/no-string-refs`](https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/no-string-refs.md)
- Always use ref callbacks. eslint: [`react/no-string-refs`](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-string-refs.md)
```jsx
// bad
@@ -476,7 +499,7 @@ We dont recommend using indexes for keys if the order of items may change.
## Parentheses
- Wrap JSX tags in parentheses when they span more than one line. eslint: [`react/jsx-wrap-multilines`](https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-wrap-multilines.md)
- Wrap JSX tags in parentheses when they span more than one line. eslint: [`react/jsx-wrap-multilines`](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-wrap-multilines.md)
```jsx
// bad
@@ -504,7 +527,7 @@ We dont recommend using indexes for keys if the order of items may change.
## Tags
- Always self-close tags that have no children. eslint: [`react/self-closing-comp`](https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/self-closing-comp.md)
- Always self-close tags that have no children. eslint: [`react/self-closing-comp`](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/self-closing-comp.md)
```jsx
// bad
@@ -514,7 +537,7 @@ We dont recommend using indexes for keys if the order of items may change.
<Foo variant="stuff" />
```
- If your component has multi-line properties, close its tag on a new line. eslint: [`react/jsx-closing-bracket-location`](https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-closing-bracket-location.md)
- If your component has multiline properties, close its tag on a new line. eslint: [`react/jsx-closing-bracket-location`](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-closing-bracket-location.md)
```jsx
// bad
@@ -548,7 +571,7 @@ We dont recommend using indexes for keys if the order of items may change.
}
```
- Bind event handlers for the render method in the constructor. eslint: [`react/jsx-no-bind`](https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-no-bind.md)
- Bind event handlers for the render method in the constructor. eslint: [`react/jsx-no-bind`](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-no-bind.md)
> Why? A bind call in the render path creates a brand new function on every single render. Do not use arrow functions in class fields, because it makes them [challenging to test and debug, and can negatively impact performance](https://medium.com/@charpeni/arrow-functions-in-class-properties-might-not-be-as-great-as-we-think-3b3551c440b1), and because conceptually, class fields are for data, not logic.
@@ -616,7 +639,7 @@ We dont recommend using indexes for keys if the order of items may change.
}
```
- Be sure to return a value in your `render` methods. eslint: [`react/require-render-return`](https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/require-render-return.md)
- Be sure to return a value in your `render` methods. eslint: [`react/require-render-return`](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/require-render-return.md)
```jsx
// bad
@@ -644,7 +667,8 @@ We dont recommend using indexes for keys if the order of items may change.
1. `componentWillUpdate`
1. `componentDidUpdate`
1. `componentWillUnmount`
1. *clickHandlers or eventHandlers* like `onClickSubmit()` or `onChangeDescription()`
1. *event handlers starting with 'handle'* like `handleSubmit()` or `handleChangeDescription()`
1. *event handlers starting with 'on'* like `onClickSubmit()` or `onChangeDescription()`
1. *getter methods for `render`* like `getSelectReason()` or `getFooterContent()`
1. *optional render methods* like `renderNavigation()` or `renderProfilePicture()`
1. `render`
@@ -681,7 +705,7 @@ We dont recommend using indexes for keys if the order of items may change.
export default Link;
```
- Ordering for `React.createClass`: eslint: [`react/sort-comp`](https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/sort-comp.md)
- Ordering for `React.createClass`: eslint: [`react/sort-comp`](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/sort-comp.md)
1. `displayName`
1. `propTypes`
@@ -707,7 +731,7 @@ We dont recommend using indexes for keys if the order of items may change.
## `isMounted`
- Do not use `isMounted`. eslint: [`react/no-is-mounted`](https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/no-is-mounted.md)
- Do not use `isMounted`. eslint: [`react/no-is-mounted`](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-is-mounted.md)
> Why? [`isMounted` is an anti-pattern][anti-pattern], is not available when using ES6 classes, and is on its way to being officially deprecated.
@@ -717,7 +741,7 @@ We dont recommend using indexes for keys if the order of items may change.
This JSX/React style guide is also available in other languages:
- ![cn](https://raw.githubusercontent.com/gosquared/flags/master/flags/flags/shiny/24/China.png) **Chinese (Simplified)**: [JasonBoy/javascript](https://github.com/JasonBoy/javascript/tree/master/react)
- ![cn](https://raw.githubusercontent.com/gosquared/flags/master/flags/flags/shiny/24/China.png) **Chinese (Simplified)**: [jhcccc/javascript](https://github.com/jhcccc/javascript/tree/master/react)
- ![tw](https://raw.githubusercontent.com/gosquared/flags/master/flags/flags/shiny/24/Taiwan.png) **Chinese (Traditional)**: [jigsawye/javascript](https://github.com/jigsawye/javascript/tree/master/react)
- ![es](https://raw.githubusercontent.com/gosquared/flags/master/flags/flags/shiny/24/Spain.png) **Español**: [agrcrobles/javascript](https://github.com/agrcrobles/javascript/tree/master/react)
- ![jp](https://raw.githubusercontent.com/gosquared/flags/master/flags/flags/shiny/24/Japan.png) **Japanese**: [mitsuruog/javascript-style-guide](https://github.com/mitsuruog/javascript-style-guide/tree/master/react)