mirror of
https://github.com/airbnb/javascript.git
synced 2026-01-14 14:27:54 -05:00
Compare commits
441 Commits
eslint-con
...
temp
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0f3ca32323 | ||
|
|
95b6b43d63 | ||
|
|
240a3789db | ||
|
|
0e627e2fa3 | ||
|
|
7982931ba7 | ||
|
|
69fc1bf195 | ||
|
|
5c01a10949 | ||
|
|
bf536566ce | ||
|
|
917c8d92a3 | ||
|
|
8091e39343 | ||
|
|
fd96a4fd57 | ||
|
|
81157eec23 | ||
|
|
4ef69edc63 | ||
|
|
d601701730 | ||
|
|
49d08a2f13 | ||
|
|
0d747c6d96 | ||
|
|
1fb7d76add | ||
|
|
38f1488918 | ||
|
|
c6b1a43c48 | ||
|
|
6947138ee3 | ||
|
|
6fb4f8e878 | ||
|
|
ca0ff97f17 | ||
|
|
0b1f62372e | ||
|
|
7dbb7b154f | ||
|
|
75a908aacf | ||
|
|
f6f63b89f6 | ||
|
|
866f441d05 | ||
|
|
5143a7a97a | ||
|
|
3cbf96de7c | ||
|
|
5155aa5fc1 | ||
|
|
cbf9ade10a | ||
|
|
206d25b55a | ||
|
|
a0e94052d5 | ||
|
|
42c0e2ea13 | ||
|
|
7fdc87a8be | ||
|
|
1677ba6c6a | ||
|
|
7c0f28af8b | ||
|
|
fd2f5a1dae | ||
|
|
b4377fb030 | ||
|
|
34b5bc39f1 | ||
|
|
d4e39c9b10 | ||
|
|
baaa5e8d26 | ||
|
|
274c8d5701 | ||
|
|
38bc026fe4 | ||
|
|
445322db64 | ||
|
|
152bd5e85a | ||
|
|
afc2cc3432 | ||
|
|
371537f393 | ||
|
|
c05ffb2417 | ||
|
|
97a3238020 | ||
|
|
e0bb393519 | ||
|
|
c4000b932a | ||
|
|
31c6f21878 | ||
|
|
91cab81f69 | ||
|
|
d8cb404da7 | ||
|
|
52e710c14e | ||
|
|
1bc8cabd44 | ||
|
|
37ebbba44c | ||
|
|
930a6f2e4c | ||
|
|
366bfa6638 | ||
|
|
f3d3a075cd | ||
|
|
eac8cc605b | ||
|
|
be6966b251 | ||
|
|
4fc997b97e | ||
|
|
96f11d8c81 | ||
|
|
c12a08c479 | ||
|
|
10a6d02c66 | ||
|
|
ef6c478a2b | ||
|
|
6734b78911 | ||
|
|
fdc812a0a5 | ||
|
|
8aec65a4d3 | ||
|
|
ea5b991a4f | ||
|
|
2a6bec1132 | ||
|
|
82dbec3c99 | ||
|
|
122788230a | ||
|
|
4ee7326393 | ||
|
|
7fbed3b55c | ||
|
|
30927d2503 | ||
|
|
f5c14cae2f | ||
|
|
428c9ddb7e | ||
|
|
af8bdf17dd | ||
|
|
d5d406a849 | ||
|
|
35914b1402 | ||
|
|
1fb4592122 | ||
|
|
5641278fa1 | ||
|
|
dc3af3a90e | ||
|
|
1eadb93e37 | ||
|
|
0cf78acab0 | ||
|
|
730b749274 | ||
|
|
4d837646b7 | ||
|
|
1b540ba14e | ||
|
|
711aeb650d | ||
|
|
9c181108a7 | ||
|
|
ea5ec0c524 | ||
|
|
db8b6ceb33 | ||
|
|
b9ff0aee71 | ||
|
|
fb3214c9d6 | ||
|
|
66cd156a48 | ||
|
|
63098cbb6c | ||
|
|
1f786e154f | ||
|
|
5620bd5620 | ||
|
|
f0df3a8680 | ||
|
|
37d48dbf60 | ||
|
|
e5de51e55f | ||
|
|
eee79a5455 | ||
|
|
b7015dd0b3 | ||
|
|
36f23d7886 | ||
|
|
e149b05366 | ||
|
|
f0492d59bd | ||
|
|
25b64d7f46 | ||
|
|
8996aa7c53 | ||
|
|
05c3bb0018 | ||
|
|
d3c7b84d9e | ||
|
|
b30b0e4d91 | ||
|
|
2c5c88d048 | ||
|
|
ee2f22a10c | ||
|
|
aa43bb2398 | ||
|
|
82170f9127 | ||
|
|
5ebfe3e5b8 | ||
|
|
337f60706f | ||
|
|
6006d6d2df | ||
|
|
a24dc34a4a | ||
|
|
1dc71d3839 | ||
|
|
973384be1b | ||
|
|
3dcc591123 | ||
|
|
c5bee75b1b | ||
|
|
5124de23da | ||
|
|
54955410ee | ||
|
|
197b50c076 | ||
|
|
f550ded6da | ||
|
|
562e3519b8 | ||
|
|
78457af2c5 | ||
|
|
5b462a04cd | ||
|
|
22adc06f56 | ||
|
|
fe2e451ba7 | ||
|
|
b587006077 | ||
|
|
8aee3e1600 | ||
|
|
cad3db3169 | ||
|
|
7aa0fa14d6 | ||
|
|
d34f807459 | ||
|
|
c48a060aff | ||
|
|
06b3ab11d9 | ||
|
|
c0ee2c4924 | ||
|
|
e4f3dd4eff | ||
|
|
0375265cbd | ||
|
|
d3628e2600 | ||
|
|
f075a0db50 | ||
|
|
d529ccaea3 | ||
|
|
a3355f90c4 | ||
|
|
e7062c32bb | ||
|
|
c75b66daa6 | ||
|
|
e279b6d3a8 | ||
|
|
6924bd3604 | ||
|
|
165af9b6c8 | ||
|
|
e6e6414c97 | ||
|
|
717ba5187a | ||
|
|
9890b40677 | ||
|
|
3493b060ec | ||
|
|
019e0f7e07 | ||
|
|
41ca203e3e | ||
|
|
651280e5a2 | ||
|
|
f86f19cefc | ||
|
|
4df908033f | ||
|
|
377fbcac88 | ||
|
|
6d05dd898a | ||
|
|
b5954c32b3 | ||
|
|
370793b3dd | ||
|
|
2e3adc98c7 | ||
|
|
5927c7f706 | ||
|
|
56b75dc359 | ||
|
|
64b965efe0 | ||
|
|
3fb312f181 | ||
|
|
8f78e1f44b | ||
|
|
5a32c33bf2 | ||
|
|
df2c99c814 | ||
|
|
ab72ab9e90 | ||
|
|
dee4f172e7 | ||
|
|
c66cfc3f89 | ||
|
|
8c94d53bf8 | ||
|
|
79047a9470 | ||
|
|
7932a52e4b | ||
|
|
1ca21aba79 | ||
|
|
295d1e61cb | ||
|
|
a204cdf38a | ||
|
|
530278467f | ||
|
|
bdba997ac7 | ||
|
|
1e0a696730 | ||
|
|
73f71d9ba4 | ||
|
|
089022aeff | ||
|
|
7f5a65832d | ||
|
|
25075b5f72 | ||
|
|
a23f93eb00 | ||
|
|
b447768ad3 | ||
|
|
b05573cae4 | ||
|
|
e6f591f660 | ||
|
|
282ef9ea90 | ||
|
|
d490ee1806 | ||
|
|
08f8093ed1 | ||
|
|
d03a712bba | ||
|
|
f0c767fd39 | ||
|
|
88e71e6e52 | ||
|
|
11ede40d55 | ||
|
|
e257deebd4 | ||
|
|
6b5922ca21 | ||
|
|
a490005ddf | ||
|
|
bb011c2f2f | ||
|
|
8148bfce3c | ||
|
|
19e9ce31fe | ||
|
|
61c7ae6189 | ||
|
|
8c686eac4b | ||
|
|
a344d6c8e7 | ||
|
|
2160a77baa | ||
|
|
ad0c44c6af | ||
|
|
42c647f31b | ||
|
|
b96341fb86 | ||
|
|
f6acb789a0 | ||
|
|
820745d610 | ||
|
|
8eacf24310 | ||
|
|
3b18fea1ed | ||
|
|
945c62f229 | ||
|
|
820ccf7652 | ||
|
|
792bb567e5 | ||
|
|
6c0a884179 | ||
|
|
030e23b13e | ||
|
|
036612ec3d | ||
|
|
6a50516df7 | ||
|
|
21493ad7e9 | ||
|
|
873f302b00 | ||
|
|
7ea44cfc79 | ||
|
|
9fbe07f282 | ||
|
|
a9a83d9150 | ||
|
|
76ff7c7f79 | ||
|
|
4539dbcf17 | ||
|
|
19701d4a0c | ||
|
|
1310ade9d0 | ||
|
|
5cd011dfa1 | ||
|
|
117d4fce49 | ||
|
|
447466681e | ||
|
|
60b96d3222 | ||
|
|
b85baeafed | ||
|
|
be07f7a020 | ||
|
|
495a62aaa9 | ||
|
|
da0cf08831 | ||
|
|
a71c2d1ad3 | ||
|
|
834d717c7b | ||
|
|
8694a87378 | ||
|
|
4f15da6146 | ||
|
|
6ef45d4bab | ||
|
|
96f95fa35e | ||
|
|
ebe96824e2 | ||
|
|
d78af39118 | ||
|
|
d8256fc886 | ||
|
|
25f11fb31e | ||
|
|
1439ebe78d | ||
|
|
b6c56cb070 | ||
|
|
955f4e93b8 | ||
|
|
95286eb496 | ||
|
|
070e6200bb | ||
|
|
387755e8fe | ||
|
|
218c4fefbb | ||
|
|
80920a07c5 | ||
|
|
5d25a2ee61 | ||
|
|
064e3bf8d5 | ||
|
|
ffe4fe967c | ||
|
|
69e34378c6 | ||
|
|
6ece1f58e9 | ||
|
|
0d6d854b5c | ||
|
|
21b65e943c | ||
|
|
74deb81d1f | ||
|
|
41a13e83ee | ||
|
|
03a0734fce | ||
|
|
24da5bb540 | ||
|
|
924dfb2682 | ||
|
|
9af5ee89eb | ||
|
|
32a7bf44c2 | ||
|
|
02b4eea345 | ||
|
|
e7ffd44b4a | ||
|
|
17e0454672 | ||
|
|
b8b2a0b0e0 | ||
|
|
48448a81cc | ||
|
|
5443d03de2 | ||
|
|
fcfd378dd8 | ||
|
|
d774b8979e | ||
|
|
ced1cb3ad8 | ||
|
|
685f37be39 | ||
|
|
9a5267684b | ||
|
|
152b914935 | ||
|
|
45326cce63 | ||
|
|
dfb70d6244 | ||
|
|
32a674de0b | ||
|
|
a12dec90d1 | ||
|
|
b6a268f780 | ||
|
|
96317f8c79 | ||
|
|
a510095acf | ||
|
|
2037fd82b9 | ||
|
|
7dda84a335 | ||
|
|
5d1f4b9a49 | ||
|
|
fe8de59977 | ||
|
|
77fdae6a74 | ||
|
|
27e5e20b70 | ||
|
|
d951220399 | ||
|
|
4702115038 | ||
|
|
363bb07765 | ||
|
|
6a593069e1 | ||
|
|
8de558b750 | ||
|
|
2161ddf8d6 | ||
|
|
cae920fc30 | ||
|
|
d14ed5daa7 | ||
|
|
afe340773f | ||
|
|
8be089eb11 | ||
|
|
fdb998b38a | ||
|
|
951825c6d2 | ||
|
|
25e711cedd | ||
|
|
068d6b69bf | ||
|
|
b3bbd1ccbc | ||
|
|
2668495fee | ||
|
|
d270031fc0 | ||
|
|
103f5e2a59 | ||
|
|
74fb34f08d | ||
|
|
5e260928b6 | ||
|
|
8a24480119 | ||
|
|
dfc9da71d9 | ||
|
|
ae82d76783 | ||
|
|
04ab225858 | ||
|
|
c068d7cbf1 | ||
|
|
2ba36de952 | ||
|
|
2bd77bc1e0 | ||
|
|
71e54f2af8 | ||
|
|
edf942eeb6 | ||
|
|
2d9779907f | ||
|
|
8c83d03a20 | ||
|
|
22f01558a0 | ||
|
|
2653730fee | ||
|
|
5705b8ae6b | ||
|
|
fd0834764c | ||
|
|
b56875bee2 | ||
|
|
89bb98e135 | ||
|
|
87f97e042d | ||
|
|
308fb24815 | ||
|
|
6088a8f5b5 | ||
|
|
8956338ee9 | ||
|
|
06998522e1 | ||
|
|
8720f5f90b | ||
|
|
bd97fca21b | ||
|
|
c71e8c9231 | ||
|
|
31d95fded4 | ||
|
|
06e28997b2 | ||
|
|
33819d6787 | ||
|
|
8ed1d855bb | ||
|
|
49dab881da | ||
|
|
a9f5d519fe | ||
|
|
8247e338a2 | ||
|
|
a100a3957f | ||
|
|
55adae99c9 | ||
|
|
a9fc9d8a0f | ||
|
|
396166b1d3 | ||
|
|
40dbeace17 | ||
|
|
8e6363c677 | ||
|
|
6373dab990 | ||
|
|
c82500d7fa | ||
|
|
1fbeabd0c4 | ||
|
|
fd68fdbd22 | ||
|
|
ea14bda110 | ||
|
|
a7a7cab504 | ||
|
|
3c3074e502 | ||
|
|
ff1c12178e | ||
|
|
901fd85b7c | ||
|
|
cfe10c17d3 | ||
|
|
4c870cbd40 | ||
|
|
c8b1164105 | ||
|
|
16190d8cb5 | ||
|
|
c5411a42d2 | ||
|
|
aefff97bd1 | ||
|
|
9a3e6356cf | ||
|
|
17b6491ae2 | ||
|
|
1eefaed4fb | ||
|
|
fc99aefc4c | ||
|
|
e9fff7adbf | ||
|
|
53b2d7d245 | ||
|
|
c4dcfd93a7 | ||
|
|
7dab8371c9 | ||
|
|
7b1ced2bf7 | ||
|
|
262b07b106 | ||
|
|
a08afd77d5 | ||
|
|
be647a77fb | ||
|
|
69a3554100 | ||
|
|
7b18d7c215 | ||
|
|
35f3e76edd | ||
|
|
fe3a2de6b5 | ||
|
|
ea8fd76c5e | ||
|
|
cb9482c04e | ||
|
|
f9fcb37af1 | ||
|
|
0991476c9f | ||
|
|
1b6bcd0e0f | ||
|
|
fc34709d19 | ||
|
|
90235cab7c | ||
|
|
9061044af0 | ||
|
|
8a12ffed19 | ||
|
|
255b0f369a | ||
|
|
4817a6b75c | ||
|
|
b709023494 | ||
|
|
2087a42b51 | ||
|
|
eb50272401 | ||
|
|
1d9d25d278 | ||
|
|
8cf2c70a41 | ||
|
|
44dbd0bdc4 | ||
|
|
5682155e9a | ||
|
|
1948c302fd | ||
|
|
7ff6303513 | ||
|
|
2d4343acd1 | ||
|
|
c40d0d1f84 | ||
|
|
9edcdde8fe | ||
|
|
dbdf8ea0ef | ||
|
|
327795bf3c | ||
|
|
9d3e7e0a2c | ||
|
|
999fe3b83a | ||
|
|
2676cbfb2f | ||
|
|
8a477f9893 | ||
|
|
ecf8e077a7 | ||
|
|
bd3ba6edfe | ||
|
|
dbd69346bd | ||
|
|
8161f32f1f | ||
|
|
97a6883621 | ||
|
|
232b719fc5 | ||
|
|
94c47734e8 | ||
|
|
3c6d40ccca | ||
|
|
39cf84f43b | ||
|
|
67e34433e4 | ||
|
|
8cfc97eee9 | ||
|
|
6f2395a3f1 | ||
|
|
b66d6e42f3 | ||
|
|
2b3c86d812 | ||
|
|
8507df4f78 | ||
|
|
cd4ec29ed3 | ||
|
|
01e72b9963 | ||
|
|
f2a65c6898 | ||
|
|
6fbc47256e | ||
|
|
2ab0e61858 | ||
|
|
6e1f11185d | ||
|
|
d493a04d7f | ||
|
|
5fd7c6f08c |
@@ -8,4 +8,7 @@ trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
end_of_line = lf
|
||||
# editorconfig-tools is unable to ignore longs strings or urls
|
||||
max_line_length = null
|
||||
max_line_length = off
|
||||
|
||||
[CHANGELOG.md]
|
||||
indent_size = false
|
||||
|
||||
26
.github/workflows/node-pretest.yml
vendored
Normal file
26
.github/workflows/node-pretest.yml
vendored
Normal 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
163
.github/workflows/node.yml
vendored
Normal 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
15
.github/workflows/rebase.yml
vendored
Normal 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 }}
|
||||
12
.github/workflows/require-allow-edits.yml
vendored
Normal file
12
.github/workflows/require-allow-edits.yml
vendored
Normal 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
|
||||
35
.travis.yml
35
.travis.yml
@@ -1,35 +0,0 @@
|
||||
language: node_js
|
||||
node_js:
|
||||
- "8"
|
||||
- "7"
|
||||
- "6"
|
||||
- "5"
|
||||
- "4"
|
||||
before_install:
|
||||
- 'if [ "${TRAVIS_NODE_VERSION}" = "0.6" ]; then npm install -g npm@1.3 ; elif [ "${TRAVIS_NODE_VERSION}" != "0.9" ]; then case "$(npm --version)" in 1.*) npm install -g npm@1.4.28 ;; 2.*) npm install -g npm@2 ;; esac ; fi'
|
||||
- 'if [ "${TRAVIS_NODE_VERSION%${TRAVIS_NODE_VERSION#[0-9]}}" = "0" ] || [ "${TRAVIS_NODE_VERSION:0:4}" = "iojs" ]; then npm install -g npm@4.5 ; elif [ "${TRAVIS_NODE_VERSION}" != "0.6" ] && [ "${TRAVIS_NODE_VERSION}" != "0.9" ]; then npm install -g npm; fi'
|
||||
install:
|
||||
- 'if [ -n "${PACKAGE-}" ]; then cd "packages/${PACKAGE}"; fi'
|
||||
- 'if [ "${TRAVIS_NODE_VERSION}" = "0.6" ]; then nvm install 0.8 && npm install -g npm@1.3 && npm install -g npm@1.4.28 && npm install -g npm@2 && 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=4 PACKAGE=eslint-config-airbnb'
|
||||
- 'TEST=true ESLINT=4 PACKAGE=eslint-config-airbnb-base'
|
||||
matrix:
|
||||
fast_finish: true
|
||||
include:
|
||||
- node_js: "node"
|
||||
env: PREPUBLISH=true ESLINT=4 PACKAGE=eslint-config-airbnb
|
||||
- node_js: "node"
|
||||
env: PREPUBLISH=true ESLINT=4 PACKAGE=eslint-config-airbnb-base
|
||||
- node_js: "node"
|
||||
env: LINT=true
|
||||
allow_failures:
|
||||
- node_js: "7"
|
||||
- node_js: "5"
|
||||
- env: PREPUBLISH=true ESLINT=4 PACKAGE=eslint-config-airbnb
|
||||
- env: PREPUBLISH=true ESLINT=4 PACKAGE=eslint-config-airbnb-base
|
||||
@@ -1,6 +1,6 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2017 Airbnb
|
||||
Copyright (c) 2012 Airbnb
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Airbnb CSS-in-JavaScript Style Guide
|
||||
|
||||
*A mostly reasonable approach to CSS-in-JavaScript
|
||||
*A mostly reasonable approach to CSS-in-JavaScript*
|
||||
|
||||
## Table of Contents
|
||||
|
||||
@@ -429,4 +429,4 @@
|
||||
|
||||
---
|
||||
|
||||
CSS puns adapted from [Saijo George](http://saijogeorge.com/css-puns/).
|
||||
CSS puns adapted from [Saijo George](https://saijogeorge.com/css-puns/).
|
||||
|
||||
@@ -2,13 +2,13 @@
|
||||
"comment": "Be explicit by listing every available rule. https://github.com/DavidAnson/markdownlint/blob/master/doc/Rules.md",
|
||||
"comment": "Note that there will be numeric gaps, not every MD number is implemented in markdownlint.",
|
||||
|
||||
"comment": "MD001: Header levels should only increment by one level at a time",
|
||||
"comment": "MD001: Header levels should only increment by one level at a time.",
|
||||
"header-increment": true,
|
||||
|
||||
"comment": "MD002: First header should be a top level header",
|
||||
"comment": "MD002: First header should be a top level header.",
|
||||
"first-header-h1": true,
|
||||
|
||||
"comment": "MD003: Header style: start with hashes",
|
||||
"comment": "MD003: Header style: start with hashes.",
|
||||
"header-style": {
|
||||
"style": "atx"
|
||||
},
|
||||
@@ -18,25 +18,26 @@
|
||||
"style": "dash"
|
||||
},
|
||||
|
||||
"comment": "MD005: Consistent indentation for list items at the same level",
|
||||
"comment": "MD005: Consistent indentation for list items at the same level.",
|
||||
"list-indent": true,
|
||||
|
||||
"comment": "MD006: Consider starting bulleted lists at the beginning of the line",
|
||||
"comment": "MD006: Consider starting bulleted lists at the beginning of the line.",
|
||||
"ul-start-left": false,
|
||||
|
||||
"comment": "MD007: Unordered list indentation: 2 spaces",
|
||||
"comment": "MD007: Unordered list indentation: 2 spaces.",
|
||||
"ul-indent": {
|
||||
"indent": 2
|
||||
"indent": 2,
|
||||
"start_indented": true
|
||||
},
|
||||
|
||||
"comment": "MD009: Disallow trailing spaces",
|
||||
"comment": "MD009: Disallow trailing spaces!",
|
||||
"no-trailing-spaces": {
|
||||
"br-spaces": 0,
|
||||
"comment": "Empty lines inside list items should not be indented",
|
||||
"br_spaces": 0,
|
||||
"comment": "Empty lines inside list items should not be indented.",
|
||||
"list_item_empty_lines": false
|
||||
},
|
||||
|
||||
"comment": "MD010: No hard tabs, not even in code blocks",
|
||||
"comment": "MD010: No hard tabs, not even in code blocks.",
|
||||
"no-hard-tabs": {
|
||||
"code_blocks": true
|
||||
},
|
||||
@@ -44,7 +45,7 @@
|
||||
"comment": "MD011: Prevent reversed link syntax",
|
||||
"no-reversed-links": true,
|
||||
|
||||
"comment": "MD012: Disallow multiple consecutive blank lines",
|
||||
"comment": "MD012: Disallow multiple consecutive blank lines.",
|
||||
"no-multiple-blanks": {
|
||||
"maximum": 1
|
||||
},
|
||||
@@ -52,37 +53,37 @@
|
||||
"comment": "MD013: Line length",
|
||||
"line-length": false,
|
||||
|
||||
"comment": "MD014: Disallow dollar signs used before commands without showing output",
|
||||
"comment": "MD014: Disallow use of dollar signs($) before commands without showing output.",
|
||||
"commands-show-output": true,
|
||||
|
||||
"comment": "MD018: Disallow space after hash on atx style header",
|
||||
"comment": "MD018: Disallow space after hash on atx style header.",
|
||||
"no-missing-space-atx": true,
|
||||
|
||||
"comment": "MD019: Dissalow multiple spaces after hash on atx style header",
|
||||
"comment": "MD019: Disallow multiple spaces after hash on atx style header.",
|
||||
"no-multiple-space-atx": true,
|
||||
|
||||
"comment": "MD020: No space inside hashes on closed atx style header",
|
||||
"comment": "MD020: No space should be inside hashes on closed atx style header.",
|
||||
"no-missing-space-closed-atx": true,
|
||||
|
||||
"comment": "MD021: Disallow multiple spaces inside hashes on closed atx style header",
|
||||
"comment": "MD021: Disallow multiple spaces inside hashes on closed atx style header.",
|
||||
"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": "MD022: Headers should be surrounded by blank lines.",
|
||||
"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",
|
||||
"comment": "MD023: Headers must start at the beginning of the line.",
|
||||
"header-start-left": true,
|
||||
|
||||
"comment": "MD024: Disallow multiple headers with the same content",
|
||||
"comment": "MD024: Disallow multiple headers with the same content.",
|
||||
"no-duplicate-header": true,
|
||||
|
||||
"comment": "MD025: Disallow multiple top level headers in the same document",
|
||||
"comment": "Gotta have a matching closing brace at the end",
|
||||
"comment": "MD025: Disallow multiple top level headers in the same document.",
|
||||
"comment": "Gotta have a matching closing brace at the end.",
|
||||
"single-h1": false,
|
||||
|
||||
"comment": "MD026: Disallow trailing punctuation in header",
|
||||
"comment": "Gotta have a semicolon after the ending closing brace",
|
||||
"comment": "MD026: Disallow trailing punctuation in header.",
|
||||
"comment": "You must have a semicolon after the ending closing brace.",
|
||||
"no-trailing-punctuation": {
|
||||
"punctuation" : ".,:!?"
|
||||
},
|
||||
@@ -110,14 +111,14 @@
|
||||
"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",
|
||||
"comment": "HTML is needed for explicit anchors",
|
||||
"no-inline-html": false,
|
||||
|
||||
"comment": "MD034: No bare URLs used",
|
||||
"comment": "MD034: No bare URLs should be used",
|
||||
"no-bare-urls": true,
|
||||
|
||||
"comment": "MD035: Horizontal rule style",
|
||||
@@ -125,30 +126,30 @@
|
||||
"style": "consistent"
|
||||
},
|
||||
|
||||
"comment": "MD036: Do not use emphasis instead of a header",
|
||||
"comment": "MD036: Do not use emphasis instead of a header.",
|
||||
"no-emphasis-as-header": false,
|
||||
|
||||
"comment": "MD037: Disallow spaces inside emphasis markers",
|
||||
"comment": "MD037: Disallow spaces inside emphasis markers.",
|
||||
"no-space-in-emphasis": true,
|
||||
|
||||
"comment": "MD038: Disallow spaces inside code span elements",
|
||||
"comment": "MD038: Disallow spaces inside code span elements.",
|
||||
"no-space-in-code": true,
|
||||
|
||||
"comment": "MD039: Disallow spaces inside link text",
|
||||
"comment": "MD039: Disallow spaces inside link text.",
|
||||
"no-space-in-links": true,
|
||||
|
||||
"comment": "MD040: Fenced code blocks should have a language specified",
|
||||
"comment": "MD040: Fenced code blocks should have a language specified.",
|
||||
"fenced-code-language": true,
|
||||
|
||||
"comment": "MD041: First line in file should be a top level header",
|
||||
"comment": "MD041: First line in file should be a top level header.",
|
||||
"first-line-h1": true,
|
||||
|
||||
"comment": "MD042: No empty links",
|
||||
"no-empty-links": true,
|
||||
|
||||
"comment": "MD043: Required header structure",
|
||||
"comment": "MD043: Required header structure.",
|
||||
"required-headers": false,
|
||||
|
||||
"comment": "MD044: Proper names should have the correct capitalization",
|
||||
"comment": "MD044: Proper names should have the correct capitalization.",
|
||||
"proper-names": false
|
||||
}
|
||||
|
||||
@@ -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":
|
||||
|
||||
@@ -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",
|
||||
@@ -26,6 +27,9 @@
|
||||
"airbnb",
|
||||
"es6",
|
||||
"es2015",
|
||||
"es2016",
|
||||
"es2017",
|
||||
"es2018",
|
||||
"react",
|
||||
"jsx"
|
||||
],
|
||||
@@ -36,6 +40,7 @@
|
||||
},
|
||||
"homepage": "https://github.com/airbnb/javascript",
|
||||
"devDependencies": {
|
||||
"markdownlint-cli": "^0.3.1"
|
||||
"markdownlint": "^0.28.2",
|
||||
"markdownlint-cli": "^0.34.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
"rules": {
|
||||
// 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
|
||||
"comma-dangle": 0,
|
||||
|
||||
"max-len": 0,
|
||||
},
|
||||
}
|
||||
|
||||
@@ -1,3 +1,132 @@
|
||||
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
|
||||
- [breaking] enable `no-useless-catch`
|
||||
- [breaking] enable `max-classes-per-file`
|
||||
- [breaking] enable `no-misleading-character-class`
|
||||
- [breaking] enable `no-async-promise-executor`
|
||||
- [breaking] enable `prefer-object-spread`
|
||||
- [breaking] `func-name-matching`: enable `considerPropertyDescriptor` option
|
||||
- [breaking] `padded-blocks`: enable `allowSingleLineBlocks` option (#1255)
|
||||
- [breaking] `no-multiple-empty-lines`: Restrict empty lines at beginning of file (#2042)
|
||||
- [breaking] Set 'strict' to 'never' (#1962)
|
||||
- [breaking] legacy: Enable 'strict' (#1962)
|
||||
- [breaking] Simplifies `no-mixed-operators` (#1864)
|
||||
- [breaking] Require parens for arrow function args (#1863)
|
||||
- [breaking] add eslint v6, drop eslint v4
|
||||
- [patch] `camelcase`: enable ignoreDestructuring
|
||||
- [patch] Add markers to spaced-comment block for Flow types (#1966)
|
||||
- [patch] Do not prefer destructuring for object assignment expression (#1583)
|
||||
- [deps] update `confusing-browser-globals`, `eslint-plugin-import`, `tape`, `babel-preset-airbnb`
|
||||
- [dev deps] update babel-related deps to latest
|
||||
- [dev deps] update `eslint-find-rules`, `eslint-plugin-import`
|
||||
- [tests] only run tests in non-lint per-package travis job
|
||||
- [tests] use `eclint` instead of `editorconfig-tools`
|
||||
|
||||
13.2.0 / 2019-07-01
|
||||
==================
|
||||
- [minor] Enforce dangling underscores in method names (#1907)
|
||||
- [fix] disable `no-var` in legacy entry point
|
||||
- [patch] Ignore property modifications of `staticContext` params (#2029)
|
||||
- [patch] `no-extraneous-dependencies`: Add jest.setup.js to devDeps (#1998)
|
||||
- [meta] add disabled `prefer-named-capture-group` rule
|
||||
- [meta] add disabled `no-useless-catch` config
|
||||
- [deps] Switch to confusing-browser-globals (#1961)
|
||||
- [deps] update `object.entries`, `eslint-plugin-import`, `eslint-plugin-jsx-a11y`, `eslint-plugin-react`, `tape`
|
||||
- [docs] correct JavaScript capitalization (#2046)
|
||||
- [readme] Improve eslint config setup instructions for yarn (#2001)
|
||||
- [docs] fix docs for whitespace config (#1914, #1871)
|
||||
|
||||
13.1.0 / 2018-08-13
|
||||
==================
|
||||
- [new] add eslint v5 support (#1834)
|
||||
- [deps] update `eslint-plugin-import`, `eslint`, `babel-preset-airbnb`, `safe-publish-latest`, `eslint-find-rules`
|
||||
- [docs] fix typo in readme (#1855)
|
||||
- [new] update base ecmaVersion to 2018; remove deprecated experimentalObjectRestSpread option
|
||||
|
||||
13.0.0 / 2018-06-21
|
||||
==================
|
||||
- [breaking] order of import statements is ignored for unassigned imports (#1782)
|
||||
- [breaking] enable `import/no-cycle`: warn on cyclical dependencies (#1779)
|
||||
- [breaking] Change import/no-self-import from "off" to "error" (#1770)
|
||||
- [breaking] Update `object-curly-newline` to match eslint 4.18.0 (#1761)
|
||||
- [breaking] enable `no-useless-path-segments` (#1743)
|
||||
- [breaking] Prevent line breaks before and after `=` (#1710)
|
||||
- [breaking] Add .mjs extension support (#1634)
|
||||
- [breaking] enable `implicit-arrow-linebreak`
|
||||
- [breaking] Enables `nonblock-statement-body-position` rule and adds link to guide (#1618)
|
||||
- [breaking] `no-mixed-operators`: only warn on `**` and `%` mixed with arithmetic operators; removes violation against mixing common math operators. (#1611)
|
||||
- [breaking] `import/named`: enable
|
||||
- [breaking] `lines-between-class-members`: set to “always”
|
||||
- [breaking] `no-else-return`: disallow else-if (#1595)
|
||||
- [breaking] Enables eslint rule for operator-linebreak
|
||||
- [new] Adds config entry point with only whitespace rules enabled (#1749, #1751)
|
||||
- [minor] only allow one newline at the end (#1794)
|
||||
- [patch] Adjust imports for vue-cli (#1809)
|
||||
- [patch] Allow devDependencies for `foo_spec.js` naming style (#1732)
|
||||
- [patch] `function-paren-newline`: change to "consistent"
|
||||
- [patch] avoid `__mocks__` `no-extraneous-dependencies` check (#1772)
|
||||
- [patch] Include 'accumulator' exception for `no-param-reassign` (#1768)
|
||||
- [patch] Set import/extensions to ignorePackages (#1652)
|
||||
- [patch] properly ignore indentation on jsx
|
||||
- [patch] `array-callback-return`: enable `allowImplicit` option (#1668)
|
||||
- [deps] update `eslint`, `eslint-plugin-import`
|
||||
- [dev deps] update `babel-preset-airbnb`, `tape`, `eslint-find-rules`
|
||||
- [meta] add ES2015-2018 in npm package keywords (#1587)
|
||||
- [meta] Add licenses to sub packages (#1746)
|
||||
- [docs] add `npx` shortcut (#1694)
|
||||
- [docs] Use HTTPS for links to ESLint documentation (#1628)
|
||||
- [tests] ensure all entry points parse
|
||||
|
||||
12.1.0 / 2017-10-16
|
||||
==================
|
||||
- [deps] update `eslint` to `v4.9`
|
||||
|
||||
21
packages/eslint-config-airbnb-base/LICENSE.md
Normal file
21
packages/eslint-config-airbnb-base/LICENSE.md
Normal file
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2012 Airbnb
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@@ -1,6 +1,10 @@
|
||||
# eslint-config-airbnb-base
|
||||
# eslint-config-airbnb-base <sup>[![Version Badge][npm-version-svg]][package-url]</sup>
|
||||
|
||||
[](http://badge.fury.io/js/eslint-config-airbnb-base)
|
||||
[][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.
|
||||
|
||||
@@ -12,15 +16,24 @@ We export two ESLint configurations for your usage.
|
||||
|
||||
Our default export contains all of our ESLint rules, including ECMAScript 6+. It requires `eslint` and `eslint-plugin-import`.
|
||||
|
||||
If you use yarn, run `npm info "eslint-config-airbnb-base@latest" peerDependencies` to list the peer dependencies and versions, then run `yarn add --dev <dependency>@<version>` for each listed peer dependency. See below for npm instructions.
|
||||
|
||||
1. Install the correct versions of each package, which are listed by the command:
|
||||
|
||||
```sh
|
||||
npm info "eslint-config-airbnb-base@latest" peerDependencies
|
||||
```
|
||||
|
||||
Linux/OSX users can run
|
||||
If using **npm 5+**, use this shortcut
|
||||
|
||||
```sh
|
||||
npx install-peerdeps --dev eslint-config-airbnb-base
|
||||
```
|
||||
|
||||
If using **yarn**, you can also use the shortcut described above if you have npm 5+ installed on your machine, as the command will detect that you are using yarn and will act accordingly.
|
||||
Otherwise, run `npm info "eslint-config-airbnb-base@latest" peerDependencies` to list the peer dependencies and versions, then run `yarn add --dev <dependency>@<version>` for each listed peer dependency.
|
||||
|
||||
|
||||
If using **npm < 5**, Linux/OSX users can run
|
||||
|
||||
```sh
|
||||
(
|
||||
export PKG=eslint-config-airbnb-base;
|
||||
@@ -34,7 +47,7 @@ If you use yarn, run `npm info "eslint-config-airbnb-base@latest" peerDependenci
|
||||
npm install --save-dev eslint-config-airbnb-base eslint@^#.#.# eslint-plugin-import@^#.#.#
|
||||
```
|
||||
|
||||
Windows users can either install all the peer dependencies manually, or use the [install-peerdeps](https://github.com/nathanhleung/install-peerdeps) cli tool.
|
||||
If using **npm < 5**, Windows users can either install all the peer dependencies manually, or use the [install-peerdeps](https://github.com/nathanhleung/install-peerdeps) cli tool.
|
||||
|
||||
```sh
|
||||
npm install -g install-peerdeps
|
||||
@@ -70,12 +83,16 @@ 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
|
||||
|
||||
See [Airbnb's overarching ESLint config](https://npmjs.com/eslint-config-airbnb), [Airbnb's Javascript styleguide](https://github.com/airbnb/javascript), and the [ESlint config docs](http://eslint.org/docs/user-guide/configuring#extending-configuration-files) for more information.
|
||||
See [Airbnb's overarching ESLint config](https://npmjs.com/eslint-config-airbnb), [Airbnb's JavaScript styleguide](https://github.com/airbnb/javascript), and the [ESlint config docs](https://eslint.org/docs/user-guide/configuring#extending-configuration-files) for more information.
|
||||
|
||||
### eslint-config-airbnb-base/whitespace
|
||||
|
||||
This entry point only errors on whitespace rules and sets all other rules to warnings. View the list of whitespace rules [here](https://github.com/airbnb/javascript/blob/master/packages/eslint-config-airbnb-base/whitespace.js).
|
||||
|
||||
## Improving this config
|
||||
|
||||
@@ -84,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
|
||||
|
||||
@@ -7,15 +7,11 @@ module.exports = {
|
||||
'./rules/variables',
|
||||
'./rules/es6',
|
||||
'./rules/imports',
|
||||
'./rules/strict',
|
||||
].map(require.resolve),
|
||||
parserOptions: {
|
||||
ecmaVersion: 2017,
|
||||
ecmaVersion: 2018,
|
||||
sourceType: 'module',
|
||||
ecmaFeatures: {
|
||||
experimentalObjectRestSpread: true,
|
||||
},
|
||||
},
|
||||
rules: {
|
||||
strict: 'error',
|
||||
},
|
||||
rules: {},
|
||||
};
|
||||
|
||||
@@ -27,5 +27,8 @@ module.exports = {
|
||||
property: '__defineSetter__',
|
||||
message: 'Please use Object.defineProperty instead.',
|
||||
}],
|
||||
'no-var': 'off',
|
||||
'prefer-object-spread': 'off',
|
||||
strict: ['error', 'safe'],
|
||||
}
|
||||
};
|
||||
|
||||
@@ -1,17 +1,33 @@
|
||||
{
|
||||
"name": "eslint-config-airbnb-base",
|
||||
"version": "12.1.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": "editorconfig-tools 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": ":",
|
||||
"travis": "npm run --silent test",
|
||||
"travis": "npm run --silent tests-only",
|
||||
"posttravis": ":"
|
||||
},
|
||||
"repository": {
|
||||
@@ -24,7 +40,11 @@
|
||||
"config",
|
||||
"airbnb",
|
||||
"javascript",
|
||||
"styleguide"
|
||||
"styleguide",
|
||||
"es2015",
|
||||
"es2016",
|
||||
"es2017",
|
||||
"es2018"
|
||||
],
|
||||
"author": "Jake Teton-Landis (https://twitter.com/@jitl)",
|
||||
"contributors": [
|
||||
@@ -48,24 +68,26 @@
|
||||
},
|
||||
"homepage": "https://github.com/airbnb/javascript",
|
||||
"devDependencies": {
|
||||
"babel-preset-airbnb": "^2.4.0",
|
||||
"babel-tape-runner": "^2.0.1",
|
||||
"editorconfig-tools": "^0.1.1",
|
||||
"eslint": "^4.9.0",
|
||||
"eslint-find-rules": "^3.1.1",
|
||||
"eslint-plugin-import": "^2.7.0",
|
||||
"in-publish": "^2.0.0",
|
||||
"safe-publish-latest": "^1.1.1",
|
||||
"tape": "^4.8.0"
|
||||
"@babel/runtime": "^7.21.5",
|
||||
"babel-preset-airbnb": "^4.5.0",
|
||||
"babel-tape-runner": "^3.0.0",
|
||||
"eclint": "^2.8.1",
|
||||
"eslint": "^7.32.0 || ^8.2.0",
|
||||
"eslint-find-rules": "^4.1.0",
|
||||
"eslint-plugin-import": "^2.27.5",
|
||||
"in-publish": "^2.0.1",
|
||||
"safe-publish-latest": "^2.0.0",
|
||||
"tape": "^5.6.3"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"eslint": "^4.9.0",
|
||||
"eslint-plugin-import": "^2.7.0"
|
||||
"eslint": "^7.32.0 || ^8.2.0",
|
||||
"eslint-plugin-import": "^2.27.5"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 4"
|
||||
"node": "^10.12.0 || >=12.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"eslint-restricted-globals": "^0.1.1"
|
||||
"confusing-browser-globals": "^1.0.11",
|
||||
"object.entries": "^1.1.6"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,68 +1,97 @@
|
||||
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
|
||||
// http://eslint.org/docs/rules/array-callback-return
|
||||
'array-callback-return': 'error',
|
||||
// https://eslint.org/docs/rules/array-callback-return
|
||||
'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"
|
||||
// http://eslint.org/docs/rules/class-methods-use-this
|
||||
// https://eslint.org/docs/rules/class-methods-use-this
|
||||
'class-methods-use-this': ['error', {
|
||||
exceptMethods: [],
|
||||
}],
|
||||
|
||||
// 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
|
||||
// http://eslint.org/docs/rules/dot-location
|
||||
// https://eslint.org/docs/rules/dot-location
|
||||
'dot-location': ['error', 'property'],
|
||||
|
||||
// require the use of === and !==
|
||||
// http://eslint.org/docs/rules/eqeqeq
|
||||
// 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
|
||||
// https://eslint.org/docs/rules/max-classes-per-file
|
||||
'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
|
||||
// http://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
|
||||
// http://eslint.org/docs/rules/no-div-regex
|
||||
// https://eslint.org/docs/rules/no-div-regex
|
||||
'no-div-regex': 'off',
|
||||
|
||||
// disallow else after a return in an if
|
||||
// https://eslint.org/docs/rules/no-else-return
|
||||
// TODO: semver-major, set allowElseIf to false
|
||||
'no-else-return': ['error', { allowElseIf: true }],
|
||||
'no-else-return': ['error', { allowElseIf: false }],
|
||||
|
||||
// disallow empty functions, except for standalone funcs/arrows
|
||||
// http://eslint.org/docs/rules/no-empty-function
|
||||
// https://eslint.org/docs/rules/no-empty-function
|
||||
'no-empty-function': ['error', {
|
||||
allow: [
|
||||
'arrowFunctions',
|
||||
@@ -72,39 +101,52 @@ module.exports = {
|
||||
}],
|
||||
|
||||
// disallow empty destructuring patterns
|
||||
// http://eslint.org/docs/rules/no-empty-pattern
|
||||
// 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
|
||||
// http://eslint.org/docs/rules/no-extra-label
|
||||
// https://eslint.org/docs/rules/no-extra-label
|
||||
'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
|
||||
// http://eslint.org/docs/rules/no-global-assign
|
||||
// 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
|
||||
// http://eslint.org/docs/rules/no-implicit-coercion
|
||||
// https://eslint.org/docs/rules/no-implicit-coercion
|
||||
'no-implicit-coercion': ['off', {
|
||||
boolean: false,
|
||||
number: true,
|
||||
@@ -113,29 +155,35 @@ module.exports = {
|
||||
}],
|
||||
|
||||
// disallow var and named functions in global scope
|
||||
// http://eslint.org/docs/rules/no-implicit-globals
|
||||
// https://eslint.org/docs/rules/no-implicit-globals
|
||||
'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
|
||||
// http://eslint.org/docs/rules/no-magic-numbers
|
||||
// https://eslint.org/docs/rules/no-magic-numbers
|
||||
'no-magic-numbers': ['off', {
|
||||
ignore: [],
|
||||
ignoreArrayIndexes: true,
|
||||
@@ -144,54 +192,70 @@ 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 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
|
||||
// disallow parameter object manipulation except for specific exclusions
|
||||
// rule: http://eslint.org/docs/rules/no-param-reassign.html
|
||||
// rule: https://eslint.org/docs/rules/no-param-reassign.html
|
||||
'no-param-reassign': ['error', {
|
||||
props: true,
|
||||
ignorePropertyModificationsFor: [
|
||||
'acc', // for reduce accumulators
|
||||
'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
|
||||
'response', // for Express responses
|
||||
'$scope', // for Angular 1 scopes
|
||||
'staticContext', // for ReactRouter context
|
||||
]
|
||||
}],
|
||||
|
||||
// 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
|
||||
// http://eslint.org/docs/rules/no-restricted-properties
|
||||
// https://eslint.org/docs/rules/no-restricted-properties
|
||||
'no-restricted-properties': ['error', {
|
||||
object: 'arguments',
|
||||
property: 'callee',
|
||||
@@ -233,32 +297,41 @@ 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
|
||||
// http://eslint.org/docs/rules/no-self-assign
|
||||
'no-self-assign': 'error',
|
||||
// https://eslint.org/docs/rules/no-self-assign
|
||||
'no-self-assign': ['error', {
|
||||
props: true,
|
||||
}],
|
||||
|
||||
// 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
|
||||
// http://eslint.org/docs/rules/no-unmodified-loop-condition
|
||||
// https://eslint.org/docs/rules/no-unmodified-loop-condition
|
||||
'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,
|
||||
@@ -266,53 +339,81 @@ module.exports = {
|
||||
}],
|
||||
|
||||
// disallow unused labels
|
||||
// http://eslint.org/docs/rules/no-unused-labels
|
||||
// https://eslint.org/docs/rules/no-unused-labels
|
||||
'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
|
||||
// https://eslint.org/docs/rules/no-useless-catch
|
||||
'no-useless-catch': 'error',
|
||||
|
||||
// disallow useless string concatenation
|
||||
// http://eslint.org/docs/rules/no-useless-concat
|
||||
// https://eslint.org/docs/rules/no-useless-concat
|
||||
'no-useless-concat': 'error',
|
||||
|
||||
// disallow unnecessary string escaping
|
||||
// http://eslint.org/docs/rules/no-useless-escape
|
||||
// https://eslint.org/docs/rules/no-useless-escape
|
||||
'no-useless-escape': 'error',
|
||||
|
||||
// disallow redundant return; keywords
|
||||
// http://eslint.org/docs/rules/no-useless-return
|
||||
// https://eslint.org/docs/rules/no-useless-return
|
||||
'no-useless-return': 'error',
|
||||
|
||||
// disallow use of void operator
|
||||
// http://eslint.org/docs/rules/no-void
|
||||
// https://eslint.org/docs/rules/no-void
|
||||
'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
|
||||
// http://eslint.org/docs/rules/prefer-promise-reject-errors
|
||||
// https://eslint.org/docs/rules/prefer-promise-reject-errors
|
||||
'prefer-promise-reject-errors': ['error', { allowEmptyReject: true }],
|
||||
|
||||
// Suggest using named capture group in regular expression
|
||||
// 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)
|
||||
// http://eslint.org/docs/rules/require-await
|
||||
// https://eslint.org/docs/rules/require-await
|
||||
'require-await': 'off',
|
||||
|
||||
// Enforce the use of u flag on RegExp
|
||||
// https://eslint.org/docs/rules/require-unicode-regexp
|
||||
'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
|
||||
// http://eslint.org/docs/rules/wrap-iife.html
|
||||
// https://eslint.org/docs/rules/wrap-iife.html
|
||||
'wrap-iife': ['error', 'outside', { functionPrototypeMethods: false }],
|
||||
|
||||
// require or disallow Yoda conditions
|
||||
// https://eslint.org/docs/rules/yoda
|
||||
yoda: 'error'
|
||||
}
|
||||
};
|
||||
|
||||
@@ -1,19 +1,23 @@
|
||||
module.exports = {
|
||||
rules: {
|
||||
// Enforce “for” loop update clause moving the counter in the right direction
|
||||
// http://eslint.org/docs/rules/for-direction
|
||||
// https://eslint.org/docs/rules/for-direction
|
||||
'for-direction': 'error',
|
||||
|
||||
// Enforces that a return statement is present in property getters
|
||||
// http://eslint.org/docs/rules/getter-return
|
||||
// https://eslint.org/docs/rules/getter-return
|
||||
'getter-return': ['error', { allowImplicit: true }],
|
||||
|
||||
// disallow using an async function as a Promise executor
|
||||
// https://eslint.org/docs/rules/no-async-promise-executor
|
||||
'no-async-promise-executor': 'error',
|
||||
|
||||
// Disallow await inside of loops
|
||||
// http://eslint.org/docs/rules/no-await-in-loop
|
||||
// https://eslint.org/docs/rules/no-await-in-loop
|
||||
'no-await-in-loop': 'error',
|
||||
|
||||
// Disallow comparisons to negative zero
|
||||
// http://eslint.org/docs/rules/no-compare-neg-zero
|
||||
// https://eslint.org/docs/rules/no-compare-neg-zero
|
||||
'no-compare-neg-zero': 'error',
|
||||
|
||||
// disallow assignment in conditional expressions
|
||||
@@ -22,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',
|
||||
|
||||
@@ -34,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',
|
||||
|
||||
@@ -50,11 +63,11 @@ module.exports = {
|
||||
'no-ex-assign': 'error',
|
||||
|
||||
// disallow double-negation boolean casts in a boolean context
|
||||
// http://eslint.org/docs/rules/no-extra-boolean-cast
|
||||
// https://eslint.org/docs/rules/no-extra-boolean-cast
|
||||
'no-extra-boolean-cast': 'error',
|
||||
|
||||
// disallow unnecessary parentheses
|
||||
// http://eslint.org/docs/rules/no-extra-parens
|
||||
// https://eslint.org/docs/rules/no-extra-parens
|
||||
'no-extra-parens': ['off', 'all', {
|
||||
conditionalAssign: true,
|
||||
nestedBinaryExpressions: false,
|
||||
@@ -69,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',
|
||||
|
||||
@@ -78,50 +94,96 @@ 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',
|
||||
|
||||
// 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
|
||||
// http://eslint.org/docs/rules/no-prototype-builtins
|
||||
// https://eslint.org/docs/rules/no-prototype-builtins
|
||||
'no-prototype-builtins': 'error',
|
||||
|
||||
// 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',
|
||||
|
||||
// Disallow template literal placeholder syntax in regular strings
|
||||
// http://eslint.org/docs/rules/no-template-curly-in-string
|
||||
// https://eslint.org/docs/rules/no-template-curly-in-string
|
||||
'no-template-curly-in-string': 'error',
|
||||
|
||||
// Avoid code that looks like two expressions but is actually one
|
||||
// http://eslint.org/docs/rules/no-unexpected-multiline
|
||||
// https://eslint.org/docs/rules/no-unexpected-multiline
|
||||
'no-unexpected-multiline': 'error',
|
||||
|
||||
// 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
|
||||
// http://eslint.org/docs/rules/no-unsafe-finally
|
||||
// https://eslint.org/docs/rules/no-unsafe-finally
|
||||
'no-unsafe-finally': 'error',
|
||||
|
||||
// disallow negating the left operand of relational operators
|
||||
// http://eslint.org/docs/rules/no-unsafe-negation
|
||||
// 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
|
||||
// note: not enabled because it is very buggy
|
||||
'require-atomic-updates': 'off',
|
||||
|
||||
// disallow comparisons with the value NaN
|
||||
'use-isnan': 'error',
|
||||
|
||||
// ensure JSDoc comments are valid
|
||||
// http://eslint.org/docs/rules/valid-jsdoc
|
||||
// https://eslint.org/docs/rules/valid-jsdoc
|
||||
'valid-jsdoc': 'off',
|
||||
|
||||
// ensure that the results of typeof are compared against a valid string
|
||||
// http://eslint.org/docs/rules/valid-typeof
|
||||
// https://eslint.org/docs/rules/valid-typeof
|
||||
'valid-typeof': ['error', { requireStringLiterals: true }],
|
||||
}
|
||||
};
|
||||
|
||||
@@ -13,35 +13,33 @@ module.exports = {
|
||||
|
||||
rules: {
|
||||
// enforces no braces where they can be omitted
|
||||
// http://eslint.org/docs/rules/arrow-body-style
|
||||
// https://eslint.org/docs/rules/arrow-body-style
|
||||
// TODO: enable requireReturnForObjectLiteral?
|
||||
'arrow-body-style': ['error', 'as-needed', {
|
||||
requireReturnForObjectLiteral: false,
|
||||
}],
|
||||
|
||||
// require parens in arrow function arguments
|
||||
// http://eslint.org/docs/rules/arrow-parens
|
||||
'arrow-parens': ['error', 'as-needed', {
|
||||
requireForBlockBody: true,
|
||||
}],
|
||||
// https://eslint.org/docs/rules/arrow-parens
|
||||
'arrow-parens': ['error', 'always'],
|
||||
|
||||
// require space before/after arrow function's arrow
|
||||
// http://eslint.org/docs/rules/arrow-spacing
|
||||
// https://eslint.org/docs/rules/arrow-spacing
|
||||
'arrow-spacing': ['error', { before: true, after: true }],
|
||||
|
||||
// verify super() callings in constructors
|
||||
'constructor-super': 'error',
|
||||
|
||||
// enforce the spacing around the * in generator functions
|
||||
// http://eslint.org/docs/rules/generator-star-spacing
|
||||
// https://eslint.org/docs/rules/generator-star-spacing
|
||||
'generator-star-spacing': ['error', { before: false, after: true }],
|
||||
|
||||
// disallow modifying variables of class declarations
|
||||
// http://eslint.org/docs/rules/no-class-assign
|
||||
// https://eslint.org/docs/rules/no-class-assign
|
||||
'no-class-assign': 'error',
|
||||
|
||||
// disallow arrow functions where they could be confused with comparisons
|
||||
// http://eslint.org/docs/rules/no-confusing-arrow
|
||||
// https://eslint.org/docs/rules/no-confusing-arrow
|
||||
'no-confusing-arrow': ['error', {
|
||||
allowParens: true,
|
||||
}],
|
||||
@@ -50,36 +48,48 @@ module.exports = {
|
||||
'no-const-assign': 'error',
|
||||
|
||||
// disallow duplicate class members
|
||||
// http://eslint.org/docs/rules/no-dupe-class-members
|
||||
// https://eslint.org/docs/rules/no-dupe-class-members
|
||||
'no-dupe-class-members': 'error',
|
||||
|
||||
// disallow importing from the same path more than once
|
||||
// http://eslint.org/docs/rules/no-duplicate-imports
|
||||
// replaced by https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-duplicates.md
|
||||
// https://eslint.org/docs/rules/no-duplicate-imports
|
||||
// replaced by https://github.com/import-js/eslint-plugin-import/blob/master/docs/rules/no-duplicates.md
|
||||
'no-duplicate-imports': 'off',
|
||||
|
||||
// disallow symbol constructor
|
||||
// http://eslint.org/docs/rules/no-new-symbol
|
||||
// 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
|
||||
// http://eslint.org/docs/rules/no-restricted-imports
|
||||
'no-restricted-imports': 'off',
|
||||
// https://eslint.org/docs/rules/no-restricted-imports
|
||||
'no-restricted-imports': ['off', {
|
||||
paths: [],
|
||||
patterns: []
|
||||
}],
|
||||
|
||||
// disallow to use this/super before super() calling in constructors.
|
||||
// http://eslint.org/docs/rules/no-this-before-super
|
||||
// https://eslint.org/docs/rules/no-this-before-super
|
||||
'no-this-before-super': 'error',
|
||||
|
||||
// disallow useless computed property keys
|
||||
// http://eslint.org/docs/rules/no-useless-computed-key
|
||||
// https://eslint.org/docs/rules/no-useless-computed-key
|
||||
'no-useless-computed-key': 'error',
|
||||
|
||||
// disallow unnecessary constructor
|
||||
// http://eslint.org/docs/rules/no-useless-constructor
|
||||
// https://eslint.org/docs/rules/no-useless-constructor
|
||||
'no-useless-constructor': 'error',
|
||||
|
||||
// disallow renaming import, export, and destructured assignments to the same name
|
||||
// http://eslint.org/docs/rules/no-useless-rename
|
||||
// https://eslint.org/docs/rules/no-useless-rename
|
||||
'no-useless-rename': ['error', {
|
||||
ignoreDestructuring: false,
|
||||
ignoreImport: false,
|
||||
@@ -90,7 +100,7 @@ module.exports = {
|
||||
'no-var': 'error',
|
||||
|
||||
// require method and property shorthand syntax for object literals
|
||||
// http://eslint.org/docs/rules/object-shorthand
|
||||
// https://eslint.org/docs/rules/object-shorthand
|
||||
'object-shorthand': ['error', 'always', {
|
||||
ignoreConstructors: false,
|
||||
avoidQuotes: true,
|
||||
@@ -109,7 +119,7 @@ module.exports = {
|
||||
}],
|
||||
|
||||
// Prefer destructuring from arrays and objects
|
||||
// http://eslint.org/docs/rules/prefer-destructuring
|
||||
// https://eslint.org/docs/rules/prefer-destructuring
|
||||
'prefer-destructuring': ['error', {
|
||||
VariableDeclarator: {
|
||||
array: false,
|
||||
@@ -117,58 +127,59 @@ module.exports = {
|
||||
},
|
||||
AssignmentExpression: {
|
||||
array: true,
|
||||
object: true,
|
||||
object: false,
|
||||
},
|
||||
}, {
|
||||
enforceForRenamedProperties: false,
|
||||
}],
|
||||
|
||||
// disallow parseInt() in favor of binary, octal, and hexadecimal literals
|
||||
// http://eslint.org/docs/rules/prefer-numeric-literals
|
||||
// https://eslint.org/docs/rules/prefer-numeric-literals
|
||||
'prefer-numeric-literals': 'error',
|
||||
|
||||
// suggest using Reflect methods where applicable
|
||||
// http://eslint.org/docs/rules/prefer-reflect
|
||||
// https://eslint.org/docs/rules/prefer-reflect
|
||||
'prefer-reflect': 'off',
|
||||
|
||||
// use rest parameters instead of arguments
|
||||
// http://eslint.org/docs/rules/prefer-rest-params
|
||||
// https://eslint.org/docs/rules/prefer-rest-params
|
||||
'prefer-rest-params': 'error',
|
||||
|
||||
// suggest using the spread operator instead of .apply()
|
||||
// http://eslint.org/docs/rules/prefer-spread
|
||||
// suggest using the spread syntax instead of .apply()
|
||||
// https://eslint.org/docs/rules/prefer-spread
|
||||
'prefer-spread': 'error',
|
||||
|
||||
// suggest using template literals instead of string concatenation
|
||||
// http://eslint.org/docs/rules/prefer-template
|
||||
// https://eslint.org/docs/rules/prefer-template
|
||||
'prefer-template': 'error',
|
||||
|
||||
// disallow generator functions that do not have yield
|
||||
// http://eslint.org/docs/rules/require-yield
|
||||
// https://eslint.org/docs/rules/require-yield
|
||||
'require-yield': 'error',
|
||||
|
||||
// enforce spacing between object rest-spread
|
||||
// http://eslint.org/docs/rules/rest-spread-spacing
|
||||
// https://eslint.org/docs/rules/rest-spread-spacing
|
||||
'rest-spread-spacing': ['error', 'never'],
|
||||
|
||||
// import sorting
|
||||
// http://eslint.org/docs/rules/sort-imports
|
||||
// https://eslint.org/docs/rules/sort-imports
|
||||
'sort-imports': ['off', {
|
||||
ignoreCase: false,
|
||||
ignoreDeclarationSort: false,
|
||||
ignoreMemberSort: false,
|
||||
memberSyntaxSortOrder: ['none', 'all', 'multiple', 'single'],
|
||||
}],
|
||||
|
||||
// require a Symbol description
|
||||
// http://eslint.org/docs/rules/symbol-description
|
||||
// https://eslint.org/docs/rules/symbol-description
|
||||
'symbol-description': 'error',
|
||||
|
||||
// enforce usage of spacing in template strings
|
||||
// http://eslint.org/docs/rules/template-curly-spacing
|
||||
// https://eslint.org/docs/rules/template-curly-spacing
|
||||
'template-curly-spacing': 'error',
|
||||
|
||||
// enforce spacing around the * in yield* expressions
|
||||
// http://eslint.org/docs/rules/yield-star-spacing
|
||||
// https://eslint.org/docs/rules/yield-star-spacing
|
||||
'yield-star-spacing': ['error', 'after']
|
||||
}
|
||||
};
|
||||
|
||||
@@ -13,11 +13,12 @@ module.exports = {
|
||||
settings: {
|
||||
'import/resolver': {
|
||||
node: {
|
||||
extensions: ['.js', '.json']
|
||||
extensions: ['.mjs', '.js', '.json']
|
||||
}
|
||||
},
|
||||
'import/extensions': [
|
||||
'.js',
|
||||
'.mjs',
|
||||
'.jsx',
|
||||
],
|
||||
'import/core-modules': [
|
||||
@@ -32,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
|
||||
'import/named': 'off',
|
||||
// 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: [
|
||||
@@ -73,10 +74,13 @@ module.exports = {
|
||||
'tests/**', // also common npm pattern
|
||||
'spec/**', // mocha, rspec-like pattern
|
||||
'**/__tests__/**', // jest pattern
|
||||
'**/__mocks__/**', // jest pattern
|
||||
'test.{js,jsx}', // repos with a single test file
|
||||
'test-*.{js,jsx}', // repos with multiple top-level test files
|
||||
'**/*.{test,spec}.{js,jsx}', // tests where the extension denotes that it is a test
|
||||
'**/*{.,_}{test,spec}.{js,jsx}', // tests where the extension or filename suffix denotes that it is a test
|
||||
'**/jest.config.js', // jest config
|
||||
'**/jest.setup.js', // jest setup
|
||||
'**/vue.config.js', // vue-cli config
|
||||
'**/webpack.config.js', // webpack config
|
||||
'**/webpack.config.*.js', // webpack config
|
||||
'**/rollup.config.js', // rollup config
|
||||
@@ -86,116 +90,116 @@ 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
|
||||
'import/first': ['error', 'absolute-first'],
|
||||
// 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
|
||||
'import/extensions': ['error', 'always', {
|
||||
// https://github.com/import-js/eslint-plugin-import/blob/master/docs/rules/extensions.md
|
||||
'import/extensions': ['error', 'ignorePackages', {
|
||||
js: 'never',
|
||||
mjs: 'never',
|
||||
jsx: 'never',
|
||||
}],
|
||||
|
||||
// Enforce a convention in module import order
|
||||
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/order.md
|
||||
// TODO: enable?
|
||||
'import/order': ['off', {
|
||||
groups: ['builtin', 'external', 'internal', 'parent', 'sibling', 'index'],
|
||||
'newlines-between': 'never',
|
||||
}],
|
||||
// ensure absolute imports are above relative imports and that unassigned imports are ignored
|
||||
// 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,
|
||||
@@ -204,5 +208,76 @@ module.exports = {
|
||||
allowLiteral: false,
|
||||
allowObject: false,
|
||||
}],
|
||||
|
||||
// This rule enforces that all exports are declared at the bottom of the file.
|
||||
// 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/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/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/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/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/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/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/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/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/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',
|
||||
},
|
||||
};
|
||||
|
||||
@@ -8,14 +8,14 @@ module.exports = {
|
||||
'callback-return': 'off',
|
||||
|
||||
// require all requires be top-level
|
||||
// http://eslint.org/docs/rules/global-require
|
||||
// https://eslint.org/docs/rules/global-require
|
||||
'global-require': 'error',
|
||||
|
||||
// enforces error handling in callbacks (node environment)
|
||||
'handle-callback-err': 'off',
|
||||
|
||||
// disallow use of the Buffer() constructor
|
||||
// http://eslint.org/docs/rules/no-buffer-constructor
|
||||
// https://eslint.org/docs/rules/no-buffer-constructor
|
||||
'no-buffer-constructor': 'error',
|
||||
|
||||
// disallow mixing regular variable and require declarations
|
||||
@@ -25,7 +25,7 @@ module.exports = {
|
||||
'no-new-require': 'error',
|
||||
|
||||
// disallow string concatenation with __dirname and __filename
|
||||
// http://eslint.org/docs/rules/no-path-concat
|
||||
// https://eslint.org/docs/rules/no-path-concat
|
||||
'no-path-concat': 'error',
|
||||
|
||||
// disallow use of process.env
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
module.exports = {
|
||||
rules: {
|
||||
// enforce line breaks after opening and before closing array brackets
|
||||
// http://eslint.org/docs/rules/array-bracket-newline
|
||||
// https://eslint.org/docs/rules/array-bracket-newline
|
||||
// TODO: enable? semver-major
|
||||
'array-bracket-newline': ['off', 'consistent'], // object option alternative: { multiline: true, minItems: 3 }
|
||||
|
||||
// enforce line breaks between array elements
|
||||
// http://eslint.org/docs/rules/array-element-newline
|
||||
// https://eslint.org/docs/rules/array-element-newline
|
||||
// TODO: enable? semver-major
|
||||
'array-element-newline': ['off', { multiline: true, minItems: 3 }],
|
||||
|
||||
@@ -14,17 +14,17 @@ module.exports = {
|
||||
'array-bracket-spacing': ['error', 'never'],
|
||||
|
||||
// enforce spacing inside single-line blocks
|
||||
// http://eslint.org/docs/rules/block-spacing
|
||||
// https://eslint.org/docs/rules/block-spacing
|
||||
'block-spacing': ['error', 'always'],
|
||||
|
||||
// enforce one true brace style
|
||||
'brace-style': ['error', '1tbs', { allowSingleLine: true }],
|
||||
|
||||
// require camel case names
|
||||
camelcase: ['error', { properties: 'never' }],
|
||||
camelcase: ['error', { properties: 'never', ignoreDestructuring: false }],
|
||||
|
||||
// enforce or disallow capitalization of the first letter of a comment
|
||||
// http://eslint.org/docs/rules/capitalized-comments
|
||||
// https://eslint.org/docs/rules/capitalized-comments
|
||||
'capitalized-comments': ['off', 'never', {
|
||||
line: {
|
||||
ignorePattern: '.*',
|
||||
@@ -51,7 +51,21 @@ module.exports = {
|
||||
'comma-spacing': ['error', { before: false, after: true }],
|
||||
|
||||
// enforce one true comma style
|
||||
'comma-style': ['error', 'last'],
|
||||
'comma-style': ['error', 'last', {
|
||||
exceptions: {
|
||||
ArrayExpression: false,
|
||||
ArrayPattern: false,
|
||||
ArrowFunctionExpression: false,
|
||||
CallExpression: false,
|
||||
FunctionDeclaration: false,
|
||||
FunctionExpression: false,
|
||||
ImportDeclaration: false,
|
||||
ObjectExpression: false,
|
||||
ObjectPattern: false,
|
||||
VariableDeclaration: false,
|
||||
NewExpression: false,
|
||||
}
|
||||
}],
|
||||
|
||||
// disallow padding inside computed properties
|
||||
'computed-property-spacing': ['error', 'never'],
|
||||
@@ -62,33 +76,37 @@ 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
|
||||
// http://eslint.org/docs/rules/func-call-spacing
|
||||
// https://eslint.org/docs/rules/func-call-spacing
|
||||
'func-call-spacing': ['error', 'never'],
|
||||
|
||||
// requires function names to match the name of the variable or property to which they are
|
||||
// assigned
|
||||
// http://eslint.org/docs/rules/func-name-matching
|
||||
// https://eslint.org/docs/rules/func-name-matching
|
||||
'func-name-matching': ['off', 'always', {
|
||||
includeCommonJSModuleExports: false
|
||||
includeCommonJSModuleExports: false,
|
||||
considerPropertyDescriptor: true,
|
||||
}],
|
||||
|
||||
// require function expressions to have a name
|
||||
// http://eslint.org/docs/rules/func-names
|
||||
// https://eslint.org/docs/rules/func-names
|
||||
'func-names': 'warn',
|
||||
|
||||
// enforces use of function declarations or expressions
|
||||
// http://eslint.org/docs/rules/func-style
|
||||
// https://eslint.org/docs/rules/func-style
|
||||
// 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', 'multiline'],
|
||||
'function-paren-newline': ['error', 'multiline-arguments'],
|
||||
|
||||
// Blacklist certain identifiers to prevent them being used
|
||||
// http://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.)
|
||||
@@ -97,8 +115,12 @@ module.exports = {
|
||||
// require identifiers to match the provided regular expression
|
||||
'id-match': 'off',
|
||||
|
||||
// Enforce the location of arrow function bodies with implicit returns
|
||||
// https://eslint.org/docs/rules/implicit-arrow-linebreak
|
||||
'implicit-arrow-linebreak': ['error', 'beside'],
|
||||
|
||||
// this option sets a specific tab width for your code
|
||||
// http://eslint.org/docs/rules/indent
|
||||
// https://eslint.org/docs/rules/indent
|
||||
indent: ['error', 2, {
|
||||
SwitchCase: 1,
|
||||
VariableDeclarator: 1,
|
||||
@@ -119,11 +141,13 @@ module.exports = {
|
||||
ObjectExpression: 1,
|
||||
ImportDeclaration: 1,
|
||||
flatTernaryExpressions: false,
|
||||
ignoredNodes: ['JSXElement', 'JSXElement *']
|
||||
// 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', 'JSXFragment', 'JSXOpeningFragment', 'JSXClosingFragment', 'JSXText', 'JSXEmptyExpression', 'JSXSpreadChild'],
|
||||
ignoreComments: false
|
||||
}],
|
||||
|
||||
// specify whether double or single quotes should be used in JSX attributes
|
||||
// http://eslint.org/docs/rules/jsx-quotes
|
||||
// https://eslint.org/docs/rules/jsx-quotes
|
||||
'jsx-quotes': ['off', 'prefer-double'],
|
||||
|
||||
// enforces spacing between keys and values in object literal properties
|
||||
@@ -141,7 +165,7 @@ module.exports = {
|
||||
}],
|
||||
|
||||
// enforce position of line comments
|
||||
// http://eslint.org/docs/rules/line-comment-position
|
||||
// https://eslint.org/docs/rules/line-comment-position
|
||||
// TODO: enable?
|
||||
'line-comment-position': ['off', {
|
||||
position: 'above',
|
||||
@@ -150,29 +174,35 @@ module.exports = {
|
||||
}],
|
||||
|
||||
// disallow mixed 'LF' and 'CRLF' as linebreaks
|
||||
// http://eslint.org/docs/rules/linebreak-style
|
||||
// https://eslint.org/docs/rules/linebreak-style
|
||||
'linebreak-style': ['error', 'unix'],
|
||||
|
||||
// require or disallow an empty line between class members
|
||||
// https://eslint.org/docs/rules/lines-between-class-members
|
||||
// TODO: semver-major: enable
|
||||
'lines-between-class-members': ['off', 'always', { exceptAfterSingleLine: false }],
|
||||
'lines-between-class-members': ['error', 'always', { exceptAfterSingleLine: false }],
|
||||
|
||||
// enforces empty lines around comments
|
||||
'lines-around-comment': 'off',
|
||||
|
||||
// require or disallow newlines around directives
|
||||
// http://eslint.org/docs/rules/lines-around-directive
|
||||
// https://eslint.org/docs/rules/lines-around-directive
|
||||
'lines-around-directive': ['error', {
|
||||
before: 'always',
|
||||
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],
|
||||
|
||||
// specify the maximum length of a line in your program
|
||||
// http://eslint.org/docs/rules/max-len
|
||||
// https://eslint.org/docs/rules/max-len
|
||||
'max-len': ['error', 100, 2, {
|
||||
ignoreUrls: true,
|
||||
ignoreComments: false,
|
||||
@@ -182,13 +212,22 @@ module.exports = {
|
||||
}],
|
||||
|
||||
// specify the max number of lines in a file
|
||||
// http://eslint.org/docs/rules/max-lines
|
||||
// https://eslint.org/docs/rules/max-lines
|
||||
'max-lines': ['off', {
|
||||
max: 300,
|
||||
skipBlankLines: true,
|
||||
skipComments: true
|
||||
}],
|
||||
|
||||
// enforce a maximum function length
|
||||
// https://eslint.org/docs/rules/max-lines-per-function
|
||||
'max-lines-per-function': ['off', {
|
||||
max: 50,
|
||||
skipBlankLines: true,
|
||||
skipComments: true,
|
||||
IIFEs: true,
|
||||
}],
|
||||
|
||||
// specify the maximum depth callbacks can be nested
|
||||
'max-nested-callbacks': 'off',
|
||||
|
||||
@@ -199,7 +238,7 @@ module.exports = {
|
||||
'max-statements': ['off', 10],
|
||||
|
||||
// restrict the number of statements per line
|
||||
// http://eslint.org/docs/rules/max-statements-per-line
|
||||
// https://eslint.org/docs/rules/max-statements-per-line
|
||||
'max-statements-per-line': ['off', { max: 1 }],
|
||||
|
||||
// enforce a particular style for multiline comments
|
||||
@@ -207,7 +246,7 @@ module.exports = {
|
||||
'multiline-comment-style': ['off', 'starred-block'],
|
||||
|
||||
// require multiline ternary
|
||||
// http://eslint.org/docs/rules/multiline-ternary
|
||||
// https://eslint.org/docs/rules/multiline-ternary
|
||||
// TODO: enable?
|
||||
'multiline-ternary': ['off', 'never'],
|
||||
|
||||
@@ -220,47 +259,53 @@ module.exports = {
|
||||
}],
|
||||
|
||||
// disallow the omission of parentheses when invoking a constructor with no arguments
|
||||
// http://eslint.org/docs/rules/new-parens
|
||||
// https://eslint.org/docs/rules/new-parens
|
||||
'new-parens': 'error',
|
||||
|
||||
// allow/disallow an empty newline after var statement
|
||||
'newline-after-var': 'off',
|
||||
|
||||
// http://eslint.org/docs/rules/newline-before-return
|
||||
// https://eslint.org/docs/rules/newline-before-return
|
||||
'newline-before-return': 'off',
|
||||
|
||||
// enforces new line after each method call in the chain to make it
|
||||
// more readable and easy to maintain
|
||||
// http://eslint.org/docs/rules/newline-per-chained-call
|
||||
// https://eslint.org/docs/rules/newline-per-chained-call
|
||||
'newline-per-chained-call': ['error', { ignoreChainWithDepth: 4 }],
|
||||
|
||||
// disallow use of the Array constructor
|
||||
'no-array-constructor': 'error',
|
||||
|
||||
// disallow use of bitwise operators
|
||||
// http://eslint.org/docs/rules/no-bitwise
|
||||
// https://eslint.org/docs/rules/no-bitwise
|
||||
'no-bitwise': 'error',
|
||||
|
||||
// disallow use of the continue statement
|
||||
// http://eslint.org/docs/rules/no-continue
|
||||
// https://eslint.org/docs/rules/no-continue
|
||||
'no-continue': 'error',
|
||||
|
||||
// disallow comments inline after code
|
||||
'no-inline-comments': 'off',
|
||||
|
||||
// disallow if as the only statement in an else block
|
||||
// http://eslint.org/docs/rules/no-lonely-if
|
||||
// https://eslint.org/docs/rules/no-lonely-if
|
||||
'no-lonely-if': 'error',
|
||||
|
||||
// disallow un-paren'd mixes of different operators
|
||||
// http://eslint.org/docs/rules/no-mixed-operators
|
||||
// https://eslint.org/docs/rules/no-mixed-operators
|
||||
'no-mixed-operators': ['error', {
|
||||
// the list of arithmetic groups disallows mixing `%` and `**`
|
||||
// with other arithmetic operators.
|
||||
groups: [
|
||||
['+', '-', '*', '/', '%', '**'],
|
||||
['&', '|', '^', '~', '<<', '>>', '>>>'],
|
||||
['==', '!=', '===', '!==', '>', '>=', '<', '<='],
|
||||
['%', '**'],
|
||||
['%', '+'],
|
||||
['%', '-'],
|
||||
['%', '*'],
|
||||
['%', '/'],
|
||||
['/', '*'],
|
||||
['&', '|', '<<', '>>', '>>>'],
|
||||
['==', '!=', '===', '!=='],
|
||||
['&&', '||'],
|
||||
['in', 'instanceof']
|
||||
],
|
||||
allowSamePrecedence: false
|
||||
}],
|
||||
@@ -269,14 +314,15 @@ module.exports = {
|
||||
'no-mixed-spaces-and-tabs': 'error',
|
||||
|
||||
// disallow use of chained assignment expressions
|
||||
// http://eslint.org/docs/rules/no-multi-assign
|
||||
// https://eslint.org/docs/rules/no-multi-assign
|
||||
'no-multi-assign': ['error'],
|
||||
|
||||
// disallow multiple empty lines and only one newline at the end
|
||||
'no-multiple-empty-lines': ['error', { max: 2, maxEOF: 1 }],
|
||||
// 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: 1, maxBOF: 0, maxEOF: 0 }],
|
||||
|
||||
// disallow negated conditions
|
||||
// http://eslint.org/docs/rules/no-negated-condition
|
||||
// https://eslint.org/docs/rules/no-negated-condition
|
||||
'no-negated-condition': 'off',
|
||||
|
||||
// disallow nested ternary expressions
|
||||
@@ -286,11 +332,11 @@ module.exports = {
|
||||
'no-new-object': 'error',
|
||||
|
||||
// disallow use of unary operators, ++ and --
|
||||
// http://eslint.org/docs/rules/no-plusplus
|
||||
// https://eslint.org/docs/rules/no-plusplus
|
||||
'no-plusplus': 'error',
|
||||
|
||||
// disallow certain syntax forms
|
||||
// http://eslint.org/docs/rules/no-restricted-syntax
|
||||
// https://eslint.org/docs/rules/no-restricted-syntax
|
||||
'no-restricted-syntax': [
|
||||
'error',
|
||||
{
|
||||
@@ -312,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',
|
||||
@@ -327,72 +374,90 @@ module.exports = {
|
||||
}],
|
||||
|
||||
// disallow dangling underscores in identifiers
|
||||
// https://eslint.org/docs/rules/no-underscore-dangle
|
||||
'no-underscore-dangle': ['error', {
|
||||
allow: [],
|
||||
allowAfterThis: false,
|
||||
allowAfterSuper: false,
|
||||
enforceInMethodNames: false,
|
||||
enforceInMethodNames: true,
|
||||
}],
|
||||
|
||||
// disallow the use of Boolean literals in conditional expressions
|
||||
// also, prefer `a || b` over `a ? a : b`
|
||||
// http://eslint.org/docs/rules/no-unneeded-ternary
|
||||
// https://eslint.org/docs/rules/no-unneeded-ternary
|
||||
'no-unneeded-ternary': ['error', { defaultAssignment: false }],
|
||||
|
||||
// disallow whitespace before properties
|
||||
// http://eslint.org/docs/rules/no-whitespace-before-property
|
||||
// https://eslint.org/docs/rules/no-whitespace-before-property
|
||||
'no-whitespace-before-property': 'error',
|
||||
|
||||
// enforce the location of single-line statements
|
||||
// http://eslint.org/docs/rules/nonblock-statement-body-position
|
||||
'nonblock-statement-body-position': 'off',
|
||||
// https://eslint.org/docs/rules/nonblock-statement-body-position
|
||||
'nonblock-statement-body-position': ['error', 'beside', { overrides: {} }],
|
||||
|
||||
// require padding inside curly braces
|
||||
'object-curly-spacing': ['error', 'always'],
|
||||
|
||||
// enforce line breaks between braces
|
||||
// http://eslint.org/docs/rules/object-curly-newline
|
||||
// https://eslint.org/docs/rules/object-curly-newline
|
||||
'object-curly-newline': ['error', {
|
||||
ObjectExpression: { minProperties: 4, multiline: true, consistent: true },
|
||||
ObjectPattern: { minProperties: 4, multiline: true, consistent: true }
|
||||
ObjectPattern: { minProperties: 4, multiline: true, consistent: true },
|
||||
ImportDeclaration: { minProperties: 4, multiline: true, consistent: true },
|
||||
ExportDeclaration: { minProperties: 4, multiline: true, consistent: true },
|
||||
}],
|
||||
|
||||
// enforce "same line" or "multiple line" on object properties.
|
||||
// http://eslint.org/docs/rules/object-property-newline
|
||||
// https://eslint.org/docs/rules/object-property-newline
|
||||
'object-property-newline': ['error', {
|
||||
allowMultiplePropertiesPerLine: true,
|
||||
allowAllPropertiesOnSameLine: true,
|
||||
}],
|
||||
|
||||
// allow just one var statement per function
|
||||
'one-var': ['error', 'never'],
|
||||
|
||||
// require a newline around variable declaration
|
||||
// http://eslint.org/docs/rules/one-var-declaration-per-line
|
||||
// https://eslint.org/docs/rules/one-var-declaration-per-line
|
||||
'one-var-declaration-per-line': ['error', 'always'],
|
||||
|
||||
// require assignment operator shorthand where possible or prohibit it entirely
|
||||
// http://eslint.org/docs/rules/operator-assignment
|
||||
// https://eslint.org/docs/rules/operator-assignment
|
||||
'operator-assignment': ['error', 'always'],
|
||||
|
||||
// enforce operators to be placed before or after line breaks
|
||||
'operator-linebreak': 'off',
|
||||
// Requires operator at the beginning of the line in multiline statements
|
||||
// https://eslint.org/docs/rules/operator-linebreak
|
||||
'operator-linebreak': ['error', 'before', { overrides: { '=': 'none' } }],
|
||||
|
||||
// disallow padding within blocks
|
||||
'padded-blocks': ['error', { blocks: 'never', classes: 'never', switches: 'never' }],
|
||||
'padded-blocks': ['error', {
|
||||
blocks: 'never',
|
||||
classes: 'never',
|
||||
switches: 'never',
|
||||
}, {
|
||||
allowSingleLineBlocks: true,
|
||||
}],
|
||||
|
||||
// Require or disallow padding lines between statements
|
||||
// http://eslint.org/docs/rules/padding-line-between-statements
|
||||
// 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',
|
||||
|
||||
// require quotes around object literal property names
|
||||
// http://eslint.org/docs/rules/quote-props.html
|
||||
// https://eslint.org/docs/rules/quote-props.html
|
||||
'quote-props': ['error', 'as-needed', { keywords: false, unnecessary: true, numbers: false }],
|
||||
|
||||
// specify whether double or single quotes should be used
|
||||
quotes: ['error', 'single', { avoidEscape: true }],
|
||||
|
||||
// do not require jsdoc
|
||||
// http://eslint.org/docs/rules/require-jsdoc
|
||||
// https://eslint.org/docs/rules/require-jsdoc
|
||||
'require-jsdoc': 'off',
|
||||
|
||||
// require or disallow use of semicolons instead of ASI
|
||||
@@ -402,7 +467,7 @@ module.exports = {
|
||||
'semi-spacing': ['error', { before: false, after: true }],
|
||||
|
||||
// Enforce location of semicolons
|
||||
// http://eslint.org/docs/rules/semi-style
|
||||
// https://eslint.org/docs/rules/semi-style
|
||||
'semi-style': ['error', 'last'],
|
||||
|
||||
// requires object keys to be sorted
|
||||
@@ -415,7 +480,7 @@ module.exports = {
|
||||
'space-before-blocks': 'error',
|
||||
|
||||
// require or disallow space before function opening parenthesis
|
||||
// http://eslint.org/docs/rules/space-before-function-paren
|
||||
// https://eslint.org/docs/rules/space-before-function-paren
|
||||
'space-before-function-paren': ['error', {
|
||||
anonymous: 'always',
|
||||
named: 'never',
|
||||
@@ -429,7 +494,7 @@ module.exports = {
|
||||
'space-infix-ops': 'error',
|
||||
|
||||
// Require or disallow spaces before/after unary operators
|
||||
// http://eslint.org/docs/rules/space-unary-ops
|
||||
// https://eslint.org/docs/rules/space-unary-ops
|
||||
'space-unary-ops': ['error', {
|
||||
words: true,
|
||||
nonwords: false,
|
||||
@@ -438,29 +503,29 @@ module.exports = {
|
||||
}],
|
||||
|
||||
// require or disallow a space immediately following the // or /* in a comment
|
||||
// http://eslint.org/docs/rules/spaced-comment
|
||||
// https://eslint.org/docs/rules/spaced-comment
|
||||
'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: ['-', '+'],
|
||||
markers: ['=', '!'], // space here to support sprockets directives
|
||||
markers: ['=', '!', ':', '::'], // space here to support sprockets directives and flow comment types
|
||||
balanced: true,
|
||||
}
|
||||
}],
|
||||
|
||||
// Enforce spacing around colons of switch statements
|
||||
// http://eslint.org/docs/rules/switch-colon-spacing
|
||||
// https://eslint.org/docs/rules/switch-colon-spacing
|
||||
'switch-colon-spacing': ['error', { after: true, before: false }],
|
||||
|
||||
// Require or disallow spacing between template tags and their literals
|
||||
// http://eslint.org/docs/rules/template-tag-spacing
|
||||
// https://eslint.org/docs/rules/template-tag-spacing
|
||||
'template-tag-spacing': ['error', 'never'],
|
||||
|
||||
// require or disallow the Unicode Byte Order Mark
|
||||
// http://eslint.org/docs/rules/unicode-bom
|
||||
// https://eslint.org/docs/rules/unicode-bom
|
||||
'unicode-bom': ['error', 'never'],
|
||||
|
||||
// require regex literals to be wrapped in parentheses
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
const restrictedGlobals = require('eslint-restricted-globals');
|
||||
const confusingBrowserGlobals = require('confusing-browser-globals');
|
||||
|
||||
module.exports = {
|
||||
rules: {
|
||||
@@ -12,11 +12,23 @@ module.exports = {
|
||||
'no-delete-var': 'error',
|
||||
|
||||
// disallow labels that share a name with a variable
|
||||
// http://eslint.org/docs/rules/no-label-var
|
||||
// https://eslint.org/docs/rules/no-label-var
|
||||
'no-label-var': 'error',
|
||||
|
||||
// disallow specific globals
|
||||
'no-restricted-globals': ['error', 'isFinite', 'isNaN'].concat(restrictedGlobals),
|
||||
'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),
|
||||
|
||||
// disallow declaration of variables already declared in the outer scope
|
||||
'no-shadow': 'error',
|
||||
@@ -31,7 +43,7 @@ module.exports = {
|
||||
'no-undef-init': 'error',
|
||||
|
||||
// disallow use of undefined variable
|
||||
// http://eslint.org/docs/rules/no-undefined
|
||||
// https://eslint.org/docs/rules/no-undefined
|
||||
// TODO: enable?
|
||||
'no-undefined': 'off',
|
||||
|
||||
|
||||
13
packages/eslint-config-airbnb-base/test/requires.js
Normal file
13
packages/eslint-config-airbnb-base/test/requires.js
Normal file
@@ -0,0 +1,13 @@
|
||||
/* eslint strict: 0, global-require: 0 */
|
||||
|
||||
'use strict';
|
||||
|
||||
const test = require('tape');
|
||||
|
||||
test('all entry points parse', (t) => {
|
||||
t.doesNotThrow(() => require('..'), 'index does not throw');
|
||||
t.doesNotThrow(() => require('../legacy'), 'legacy does not throw');
|
||||
t.doesNotThrow(() => require('../whitespace'), 'whitespace does not throw');
|
||||
|
||||
t.end();
|
||||
});
|
||||
@@ -2,31 +2,32 @@ import fs from 'fs';
|
||||
import path from 'path';
|
||||
import test from 'tape';
|
||||
|
||||
import index from '../';
|
||||
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(( // eslint-disable-line function-paren-newline
|
||||
Object.keys(files).forEach((
|
||||
name, // trailing function comma is to test parsing
|
||||
) => { // eslint-disable-line function-paren-newline
|
||||
) => {
|
||||
const config = files[name];
|
||||
|
||||
test(`${name}: does not reference react`, (t) => {
|
||||
t.plan(2);
|
||||
|
||||
// scan plugins for react and fail if it is found
|
||||
const hasReactPlugin = Object.prototype.hasOwnProperty.call(config, 'plugins') &&
|
||||
config.plugins.indexOf('react') !== -1;
|
||||
const hasReactPlugin = Object.prototype.hasOwnProperty.call(config, 'plugins')
|
||||
&& config.plugins.indexOf('react') !== -1;
|
||||
t.notOk(hasReactPlugin, 'there is no react plugin');
|
||||
|
||||
// scan rules for react/ and fail if any exist
|
||||
const reactRuleIds = Object.keys(config.rules)
|
||||
.filter(ruleId => ruleId.indexOf('react/') === 0);
|
||||
.filter((ruleId) => ruleId.indexOf('react/') === 0);
|
||||
t.deepEquals(reactRuleIds, [], 'there are no react/ rules');
|
||||
});
|
||||
});
|
||||
|
||||
48
packages/eslint-config-airbnb-base/whitespace-async.js
Executable file
48
packages/eslint-config-airbnb-base/whitespace-async.js
Executable file
@@ -0,0 +1,48 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
const entries = require('object.entries');
|
||||
const { ESLint } = require('eslint');
|
||||
|
||||
const baseConfig = require('.');
|
||||
const whitespaceRules = require('./whitespaceRules');
|
||||
|
||||
const severities = ['off', 'warn', 'error'];
|
||||
|
||||
function getSeverity(ruleConfig) {
|
||||
if (Array.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 (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';
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return errorsOnly;
|
||||
}
|
||||
|
||||
onlyErrorOnRules(whitespaceRules, baseConfig).then((config) => console.log(JSON.stringify(config)));
|
||||
54
packages/eslint-config-airbnb-base/whitespace.js
Normal file
54
packages/eslint-config-airbnb-base/whitespace.js
Normal file
@@ -0,0 +1,54 @@
|
||||
/* eslint global-require: 0 */
|
||||
|
||||
const { CLIEngine } = require('eslint');
|
||||
|
||||
if (CLIEngine) {
|
||||
/* eslint no-inner-declarations: 0 */
|
||||
const entries = require('object.entries');
|
||||
const whitespaceRules = require('./whitespaceRules');
|
||||
|
||||
const baseConfig = require('.');
|
||||
|
||||
const severities = ['off', 'warn', 'error'];
|
||||
|
||||
function getSeverity(ruleConfig) {
|
||||
if (Array.isArray(ruleConfig)) {
|
||||
return getSeverity(ruleConfig[0]);
|
||||
}
|
||||
if (typeof ruleConfig === 'number') {
|
||||
return severities[ruleConfig];
|
||||
}
|
||||
return ruleConfig;
|
||||
}
|
||||
|
||||
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 (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';
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return errorsOnly;
|
||||
}
|
||||
|
||||
module.exports = onlyErrorOnRules(whitespaceRules, baseConfig);
|
||||
} else {
|
||||
const path = require('path');
|
||||
const { execSync } = require('child_process');
|
||||
|
||||
module.exports = JSON.parse(String(execSync(path.join(__dirname, 'whitespace-async.js'))));
|
||||
}
|
||||
49
packages/eslint-config-airbnb-base/whitespaceRules.js
Normal file
49
packages/eslint-config-airbnb-base/whitespaceRules.js
Normal 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'
|
||||
];
|
||||
@@ -3,6 +3,6 @@
|
||||
"rules": {
|
||||
// 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
|
||||
}
|
||||
"comma-dangle": 0,
|
||||
},
|
||||
}
|
||||
|
||||
@@ -1,3 +1,131 @@
|
||||
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
|
||||
- [deps] [breaking] update `eslint-config-airbnb-base`, `eslint-plugin-react`, `eslint-find-rules`, `eslint-plugin-import`
|
||||
- [breaking] Remove rules/strict from 'extends' (#1962)
|
||||
- [breaking] set react version to "detect"
|
||||
- [breaking] disable `label-has-for`; enable `control-has-associated-label`
|
||||
- [breaking] enable `react/jsx-props-no-spreading`
|
||||
- [breaking] enable `react/jsx-fragments`
|
||||
- [minor] enable `react/static-property-placement`
|
||||
- [minor] enable `react/state-in-constructor`
|
||||
- [minor] enable `react/jsx-curly-newline`
|
||||
- [react] Add missing/unsafe lifecycle methods to react/sort-comp rule (#2043)
|
||||
- [react] add componentDidCatch to lifecycle for react/sort-comp (#2060)
|
||||
- [react] add `react-hooks` plugin (#2022)
|
||||
- [dev deps] update babel-related deps to latest
|
||||
- [tests] only run tests in non-lint per-package travis job
|
||||
- [tests] use `eclint` instead of `editorconfig-tools`
|
||||
- [meta] add disabled config for new react and a11y rules
|
||||
|
||||
|
||||
17.1.1 / 2019-07-01
|
||||
==================
|
||||
- [patch] Turn off `react/no-multi-comp` (#2006)
|
||||
- [patch] extend `no-underscore-dangle` to allow for redux dev tools in the main config instead (#1996)
|
||||
- [meta] add disabled `jsx-fragments` rule
|
||||
- [deps] update `eslint-config-airbnb-base`, `object.entries`, `eslint-plugin-import`, `eslint-plugin-react`, `eslint-plugin-jsx-a11y`, `babel-preset-airbnb`, `tape` (#2005, etc)
|
||||
- [docs] correct JavaScript capitalization (#2046)
|
||||
- [docs] fix docs for whitespace config (#1914, #1871)
|
||||
- [readme] Improve eslint config setup instructions for yarn (#2001)
|
||||
|
||||
17.1.0 / 2018-08-13
|
||||
==================
|
||||
- [new] add eslint v5 support
|
||||
- [minor] enable `label-has-associated-control` rule
|
||||
- [patch] re-enabling `jsx-one-expression-per-line` allowing single children, ignore DOM components on `jsx-no-bind`
|
||||
- [deps] update `eslint`, `eslint-config-airbnb-base`, `eslint-plugin-react`, `eslint-plugin-import`, `safe-publish-latest`, `eslint-plugin-jsx-a11y`, `eslint-find-rules`
|
||||
- [docs] fix readme typo (#1855)
|
||||
|
||||
17.0.0 / 2018-06-21
|
||||
==================
|
||||
- [breaking] update `eslint-config-airbnb-base` to v13
|
||||
- [breaking] enable `no-useless-path-segments` (#1743)
|
||||
- [breaking] update `eslint-plugin-react` to `v7.6`; update rule configs (#1737)
|
||||
- [breaking] bump react pragma to v16; update `class-methods-use-this`'s `exceptMethods` to include `componentDidCatch` (#1704)
|
||||
- [new] Adds config entry point with only whitespace rules enabled (#1749, #1751)
|
||||
- [patch] set `forbid-foreign-prop-types` to "warn"
|
||||
- [patch] Add new methods introduced in react@16.3 (#1831)
|
||||
- [patch] `label-has-for`: Remove redundant component (#1802)
|
||||
- [patch] Add 'to' as a specialLink to the 'anchor-is-valid' a11y rule (#1648)
|
||||
- [patch] disable `no-did-mount-set-state`, since it’s necessary for server-rendering.
|
||||
- [deps] update `eslint`, `eslint-plugin-react`, `eslint-plugin-import`,
|
||||
- [dev deps] update `babel-preset-airbnb`, `tape`, `eslint-find-rules`
|
||||
- [meta] add ES2015-2018 in npm package keywords (#1587)
|
||||
- [meta] Add licenses to sub packages (#1746)
|
||||
- [docs] add `npx` shortcut (#1694)
|
||||
- [docs] Use HTTPS for links to ESLint documentation (#1628)
|
||||
|
||||
16.1.0 / 2017-10-16
|
||||
==================
|
||||
- [deps] update `eslint-config-airbnb-base`, `eslint` to v4.9
|
||||
@@ -308,42 +436,42 @@
|
||||
[pr-modular]: https://github.com/airbnb/javascript/pull/526
|
||||
[pr-legacy]: https://github.com/airbnb/javascript/pull/527
|
||||
|
||||
[array-bracket-spacing]: http://eslint.org/docs/rules/array-bracket-spacing
|
||||
[array-callback-return]: http://eslint.org/docs/rules/array-callback-return
|
||||
[arrow-body-style]: http://eslint.org/docs/rules/arrow-body-style
|
||||
[arrow-spacing]: http://eslint.org/docs/rules/arrow-spacing
|
||||
[computed-property-spacing]: http://eslint.org/docs/rules/computed-property-spacing
|
||||
[id-length]: http://eslint.org/docs/rules/id-length
|
||||
[indent]: http://eslint.org/docs/rules/indent
|
||||
[max-len]: http://eslint.org/docs/rules/max-len
|
||||
[newline-per-chained-call]: http://eslint.org/docs/rules/newline-per-chained-call
|
||||
[no-confusing-arrow]: http://eslint.org/docs/rules/no-confusing-arrow
|
||||
[no-const-assign]: http://eslint.org/docs/rules/no-const-assign
|
||||
[no-mixed-spaces-and-tabs]: http://eslint.org/docs/rules/no-mixed-spaces-and-tabs
|
||||
[no-multiple-empty-lines]: http://eslint.org/docs/rules/no-multiple-empty-lines
|
||||
[no-new-symbol]: http://eslint.org/docs/rules/no-new-symbol
|
||||
[no-restricted-imports]: http://eslint.org/docs/rules/no-restricted-imports
|
||||
[no-self-assign]: http://eslint.org/docs/rules/no-self-assign
|
||||
[no-undef]: http://eslint.org/docs/rules/no-undef
|
||||
[no-useless-constructor]: http://eslint.org/docs/rules/no-useless-constructor
|
||||
[no-whitespace-before-property]: http://eslint.org/docs/rules/no-whitespace-before-property
|
||||
[object-curly-spacing]: http://eslint.org/docs/rules/object-curly-spacing
|
||||
[object-shorthand]: http://eslint.org/docs/rules/object-shorthand
|
||||
[one-var-declaration-per-line]: http://eslint.org/docs/rules/one-var-declaration-per-line
|
||||
[prefer-arrow-callback]: http://eslint.org/docs/rules/prefer-arrow-callback
|
||||
[prefer-rest-params]: http://eslint.org/docs/rules/prefer-rest-params
|
||||
[prefer-template]: http://eslint.org/docs/rules/prefer-template
|
||||
[quote-props]: http://eslint.org/docs/rules/quote-props
|
||||
[space-before-function-paren]: http://eslint.org/docs/rules/space-before-function-paren
|
||||
[space-before-keywords]: http://eslint.org/docs/rules/space-before-keywords
|
||||
[space-in-parens]: http://eslint.org/docs/rules/space-in-parens
|
||||
[template-curly-spacing]: http://eslint.org/docs/rules/template-curly-spacing
|
||||
[array-bracket-spacing]: https://eslint.org/docs/rules/array-bracket-spacing
|
||||
[array-callback-return]: https://eslint.org/docs/rules/array-callback-return
|
||||
[arrow-body-style]: https://eslint.org/docs/rules/arrow-body-style
|
||||
[arrow-spacing]: https://eslint.org/docs/rules/arrow-spacing
|
||||
[computed-property-spacing]: https://eslint.org/docs/rules/computed-property-spacing
|
||||
[id-length]: https://eslint.org/docs/rules/id-length
|
||||
[indent]: https://eslint.org/docs/rules/indent
|
||||
[max-len]: https://eslint.org/docs/rules/max-len
|
||||
[newline-per-chained-call]: https://eslint.org/docs/rules/newline-per-chained-call
|
||||
[no-confusing-arrow]: https://eslint.org/docs/rules/no-confusing-arrow
|
||||
[no-const-assign]: https://eslint.org/docs/rules/no-const-assign
|
||||
[no-mixed-spaces-and-tabs]: https://eslint.org/docs/rules/no-mixed-spaces-and-tabs
|
||||
[no-multiple-empty-lines]: https://eslint.org/docs/rules/no-multiple-empty-lines
|
||||
[no-new-symbol]: https://eslint.org/docs/rules/no-new-symbol
|
||||
[no-restricted-imports]: https://eslint.org/docs/rules/no-restricted-imports
|
||||
[no-self-assign]: https://eslint.org/docs/rules/no-self-assign
|
||||
[no-undef]: https://eslint.org/docs/rules/no-undef
|
||||
[no-useless-constructor]: https://eslint.org/docs/rules/no-useless-constructor
|
||||
[no-whitespace-before-property]: https://eslint.org/docs/rules/no-whitespace-before-property
|
||||
[object-curly-spacing]: https://eslint.org/docs/rules/object-curly-spacing
|
||||
[object-shorthand]: https://eslint.org/docs/rules/object-shorthand
|
||||
[one-var-declaration-per-line]: https://eslint.org/docs/rules/one-var-declaration-per-line
|
||||
[prefer-arrow-callback]: https://eslint.org/docs/rules/prefer-arrow-callback
|
||||
[prefer-rest-params]: https://eslint.org/docs/rules/prefer-rest-params
|
||||
[prefer-template]: https://eslint.org/docs/rules/prefer-template
|
||||
[quote-props]: https://eslint.org/docs/rules/quote-props
|
||||
[space-before-function-paren]: https://eslint.org/docs/rules/space-before-function-paren
|
||||
[space-before-keywords]: https://eslint.org/docs/rules/space-before-keywords
|
||||
[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
|
||||
|
||||
21
packages/eslint-config-airbnb/LICENSE.md
Normal file
21
packages/eslint-config-airbnb/LICENSE.md
Normal file
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2012 Airbnb
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@@ -1,6 +1,6 @@
|
||||
# eslint-config-airbnb
|
||||
|
||||
[](http://badge.fury.io/js/eslint-config-airbnb)
|
||||
[](https://badge.fury.io/js/eslint-config-airbnb)
|
||||
|
||||
This package provides Airbnb's .eslintrc as an extensible shared config.
|
||||
|
||||
@@ -10,9 +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`, 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 use yarn, run `npm info "eslint-config-airbnb@latest" peerDependencies` to list the peer dependencies and versions, then run `yarn add --dev <dependency>@<version>` for each listed peer dependency. See below for npm instructions.
|
||||
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:
|
||||
|
||||
@@ -20,7 +20,16 @@ If you use yarn, run `npm info "eslint-config-airbnb@latest" peerDependencies` t
|
||||
npm info "eslint-config-airbnb@latest" peerDependencies
|
||||
```
|
||||
|
||||
Linux/OSX users can run
|
||||
If using **npm 5+**, use this shortcut
|
||||
|
||||
```sh
|
||||
npx install-peerdeps --dev eslint-config-airbnb
|
||||
```
|
||||
|
||||
If using **yarn**, you can also use the shortcut described above if you have npm 5+ installed on your machine, as the command will detect that you are using yarn and will act accordingly.
|
||||
Otherwise, run `npm info "eslint-config-airbnb@latest" peerDependencies` to list the peer dependencies and versions, then run `yarn add --dev <dependency>@<version>` for each listed peer dependency.
|
||||
|
||||
If using **npm < 5**, Linux/OSX users can run
|
||||
|
||||
```sh
|
||||
(
|
||||
@@ -32,23 +41,30 @@ If you use yarn, run `npm info "eslint-config-airbnb@latest" peerDependencies` t
|
||||
Which produces and runs a command like:
|
||||
|
||||
```sh
|
||||
npm install --save-dev eslint-config-airbnb eslint@^#.#.# eslint-plugin-jsx-a11y@^#.#.# eslint-plugin-import@^#.#.# eslint-plugin-react@^#.#.#
|
||||
npm install --save-dev eslint-config-airbnb eslint@^#.#.# eslint-plugin-jsx-a11y@^#.#.# eslint-plugin-import@^#.#.# eslint-plugin-react@^#.#.# eslint-plugin-react-hooks@^#.#.#
|
||||
```
|
||||
|
||||
Windows users can either install all the peer dependencies manually, or use the [install-peerdeps](https://github.com/nathanhleung/install-peerdeps) cli tool.
|
||||
If using **npm < 5**, Windows users can either install all the peer dependencies manually, or use the [install-peerdeps](https://github.com/nathanhleung/install-peerdeps) cli tool.
|
||||
|
||||
```sh
|
||||
npm install -g install-peerdeps
|
||||
install-peerdeps --dev eslint-config-airbnb
|
||||
```
|
||||
|
||||
The cli will produce and run a command like:
|
||||
|
||||
```sh
|
||||
npm install --save-dev eslint-config-airbnb eslint@^#.#.# eslint-plugin-jsx-a11y@^#.#.# eslint-plugin-import@^#.#.# eslint-plugin-react@^#.#.#
|
||||
npm install --save-dev eslint-config-airbnb eslint@^#.#.# eslint-plugin-jsx-a11y@^#.#.# eslint-plugin-import@^#.#.# eslint-plugin-react@^#.#.# eslint-plugin-react-hooks@^#.#.#
|
||||
```
|
||||
|
||||
2. Add `"extends": "airbnb"` to your .eslintrc
|
||||
2. Add `"extends": "airbnb"` to your `.eslintrc`
|
||||
|
||||
### eslint-config-airbnb/hooks
|
||||
|
||||
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
|
||||
|
||||
This entry point only errors on whitespace rules and sets all other rules to warnings. View the list of whitespace rules [here](https://github.com/airbnb/javascript/blob/master/packages/eslint-config-airbnb/whitespace.js).
|
||||
|
||||
### eslint-config-airbnb/base
|
||||
|
||||
@@ -58,8 +74,8 @@ This entry point is deprecated. See [eslint-config-airbnb-base](https://npmjs.co
|
||||
|
||||
This entry point is deprecated. See [eslint-config-airbnb-base](https://npmjs.com/eslint-config-airbnb-base).
|
||||
|
||||
See [Airbnb's Javascript styleguide](https://github.com/airbnb/javascript) and
|
||||
the [ESlint config docs](http://eslint.org/docs/user-guide/configuring#extending-configuration-files)
|
||||
See [Airbnb's JavaScript styleguide](https://github.com/airbnb/javascript) and
|
||||
the [ESlint config docs](https://eslint.org/docs/user-guide/configuring#extending-configuration-files)
|
||||
for more information.
|
||||
|
||||
## Improving this config
|
||||
|
||||
6
packages/eslint-config-airbnb/hooks.js
Normal file
6
packages/eslint-config-airbnb/hooks.js
Normal file
@@ -0,0 +1,6 @@
|
||||
module.exports = {
|
||||
extends: [
|
||||
'./rules/react-hooks.js',
|
||||
].map(require.resolve),
|
||||
rules: {}
|
||||
};
|
||||
@@ -1,7 +1,6 @@
|
||||
module.exports = {
|
||||
extends: [
|
||||
'eslint-config-airbnb-base',
|
||||
'eslint-config-airbnb-base/rules/strict',
|
||||
'./rules/react',
|
||||
'./rules/react-a11y',
|
||||
].map(require.resolve),
|
||||
|
||||
@@ -1,18 +1,32 @@
|
||||
{
|
||||
"name": "eslint-config-airbnb",
|
||||
"version": "16.1.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": "editorconfig-tools 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",
|
||||
"pretravis": "cd ../eslint-config-airbnb-base && npm install && npm link && cd - && npm link --no-save eslint-config-airbnb-base",
|
||||
"travis": "npm run --silent test",
|
||||
"posttravis": "npm unlink eslint-config-airbnb-base >/dev/null &"
|
||||
"link:eslint": "cd node_modules/eslint && npm link --production && cd -",
|
||||
"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 &"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -24,7 +38,11 @@
|
||||
"config",
|
||||
"airbnb",
|
||||
"javascript",
|
||||
"styleguide"
|
||||
"styleguide",
|
||||
"es2015",
|
||||
"es2016",
|
||||
"es2017",
|
||||
"es2018"
|
||||
],
|
||||
"author": "Jake Teton-Landis (https://twitter.com/@jitl)",
|
||||
"contributors": [
|
||||
@@ -48,29 +66,33 @@
|
||||
},
|
||||
"homepage": "https://github.com/airbnb/javascript",
|
||||
"dependencies": {
|
||||
"eslint-config-airbnb-base": "^12.1.0"
|
||||
"eslint-config-airbnb-base": "^15.0.0",
|
||||
"object.entries": "^1.1.6"
|
||||
},
|
||||
"devDependencies": {
|
||||
"babel-preset-airbnb": "^2.4.0",
|
||||
"babel-tape-runner": "^2.0.1",
|
||||
"editorconfig-tools": "^0.1.1",
|
||||
"eslint": "^4.9.0",
|
||||
"eslint-find-rules": "^3.1.1",
|
||||
"eslint-plugin-import": "^2.7.0",
|
||||
"eslint-plugin-jsx-a11y": "^6.0.2",
|
||||
"eslint-plugin-react": "^7.4.0",
|
||||
"in-publish": "^2.0.0",
|
||||
"@babel/runtime": "^7.21.5",
|
||||
"babel-preset-airbnb": "^4.5.0",
|
||||
"babel-tape-runner": "^3.0.0",
|
||||
"eclint": "^2.8.1",
|
||||
"eslint": "^7.32.0 || ^8.2.0",
|
||||
"eslint-find-rules": "^4.1.0",
|
||||
"eslint-plugin-import": "^2.27.5",
|
||||
"eslint-plugin-jsx-a11y": "^6.7.1",
|
||||
"eslint-plugin-react": "^7.32.2",
|
||||
"eslint-plugin-react-hooks": "^4.6.0",
|
||||
"in-publish": "^2.0.1",
|
||||
"react": ">= 0.13.0",
|
||||
"safe-publish-latest": "^1.1.1",
|
||||
"tape": "^4.8.0"
|
||||
"safe-publish-latest": "^2.0.0",
|
||||
"tape": "^5.6.3"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"eslint": "^4.9.0",
|
||||
"eslint-plugin-import": "^2.7.0",
|
||||
"eslint-plugin-jsx-a11y": "^6.0.2",
|
||||
"eslint-plugin-react": "^7.4.0"
|
||||
"eslint": "^7.32.0 || ^8.2.0",
|
||||
"eslint-plugin-import": "^2.27.5",
|
||||
"eslint-plugin-jsx-a11y": "^6.7.1",
|
||||
"eslint-plugin-react": "^7.32.2",
|
||||
"eslint-plugin-react-hooks": "^4.6.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 4"
|
||||
"node": "^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0"
|
||||
}
|
||||
}
|
||||
|
||||
304
packages/eslint-config-airbnb/rules/react-a11y.js
vendored
304
packages/eslint-config-airbnb/rules/react-a11y.js
vendored
@@ -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,85 +26,146 @@ 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
|
||||
'jsx-a11y/label-has-for': ['error', { components: ['label'] }],
|
||||
// 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'],
|
||||
}],
|
||||
|
||||
// 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',
|
||||
// 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',
|
||||
|
||||
// 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',
|
||||
// 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',
|
||||
|
||||
// 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',
|
||||
// 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',
|
||||
|
||||
// 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',
|
||||
// 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 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 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',
|
||||
|
||||
// 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',
|
||||
// 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: [],
|
||||
}],
|
||||
|
||||
// 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',
|
||||
// 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/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: [],
|
||||
ignoreElements: [
|
||||
'audio',
|
||||
'canvas',
|
||||
'embed',
|
||||
'input',
|
||||
'textarea',
|
||||
'tr',
|
||||
'video',
|
||||
],
|
||||
ignoreRoles: [
|
||||
'grid',
|
||||
'listbox',
|
||||
'menu',
|
||||
'menubar',
|
||||
'radiogroup',
|
||||
'row',
|
||||
'tablist',
|
||||
'toolbar',
|
||||
'tree',
|
||||
'treegrid',
|
||||
],
|
||||
depth: 5,
|
||||
}],
|
||||
|
||||
// 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',
|
||||
@@ -132,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'],
|
||||
@@ -177,18 +188,79 @@ 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'],
|
||||
}],
|
||||
|
||||
// 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: [],
|
||||
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',
|
||||
|
||||
// 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',
|
||||
},
|
||||
};
|
||||
|
||||
21
packages/eslint-config-airbnb/rules/react-hooks.js
vendored
Normal file
21
packages/eslint-config-airbnb/rules/react-hooks.js
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
module.exports = {
|
||||
plugins: [
|
||||
'react-hooks',
|
||||
],
|
||||
|
||||
parserOptions: {
|
||||
ecmaFeatures: {
|
||||
jsx: true,
|
||||
},
|
||||
},
|
||||
|
||||
rules: {
|
||||
// Enforce Rules of Hooks
|
||||
// https://github.com/facebook/react/blob/c11015ff4f610ac2924d1fc6d569a17657a404fd/packages/eslint-plugin-react-hooks/src/RulesOfHooks.js
|
||||
'react-hooks/rules-of-hooks': 'error',
|
||||
|
||||
// Verify the list of the dependencies for Hooks like useEffect and similar
|
||||
// https://github.com/facebook/react/blob/1204c789776cb01fbaf3e9f032e7e2ba85a44137/packages/eslint-plugin-react-hooks/src/ExhaustiveDeps.js
|
||||
'react-hooks/exhaustive-deps': 'error',
|
||||
},
|
||||
};
|
||||
401
packages/eslint-config-airbnb/rules/react.js
vendored
401
packages/eslint-config-airbnb/rules/react.js
vendored
@@ -1,3 +1,7 @@
|
||||
const baseStyleRules = require('eslint-config-airbnb-base/rules/style').rules;
|
||||
|
||||
const dangleRules = baseStyleRules['no-underscore-dangle'];
|
||||
|
||||
module.exports = {
|
||||
plugins: [
|
||||
'react',
|
||||
@@ -10,10 +14,15 @@ 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], {
|
||||
...dangleRules[1],
|
||||
allow: dangleRules[1].allow.concat(['__REDUX_DEVTOOLS_EXTENSION_COMPOSE__']),
|
||||
}],
|
||||
|
||||
// Specify whether double or single quotes should be used in JSX attributes
|
||||
// http://eslint.org/docs/rules/jsx-quotes
|
||||
// https://eslint.org/docs/rules/jsx-quotes
|
||||
'jsx-quotes': ['error', 'prefer-double'],
|
||||
|
||||
'class-methods-use-this': ['error', {
|
||||
@@ -23,98 +32,115 @@ module.exports = {
|
||||
'getDefaultProps',
|
||||
'getChildContext',
|
||||
'componentWillMount',
|
||||
'UNSAFE_componentWillMount',
|
||||
'componentDidMount',
|
||||
'componentWillReceiveProps',
|
||||
'UNSAFE_componentWillReceiveProps',
|
||||
'shouldComponentUpdate',
|
||||
'componentWillUpdate',
|
||||
'UNSAFE_componentWillUpdate',
|
||||
'componentDidUpdate',
|
||||
'componentWillUnmount',
|
||||
'componentDidCatch',
|
||||
'getSnapshotBeforeUpdate'
|
||||
],
|
||||
}],
|
||||
|
||||
// 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/master/docs/rules/forbid-prop-types.md
|
||||
'react/forbid-prop-types': ['error', { forbid: ['any', 'array', 'object'] }],
|
||||
// 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,
|
||||
checkChildContextTypes: true,
|
||||
}],
|
||||
|
||||
// Forbid certain props on DOM Nodes
|
||||
// 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,
|
||||
allowFunctions: false,
|
||||
allowBind: false,
|
||||
ignoreDOMComponents: true,
|
||||
}],
|
||||
|
||||
// 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,
|
||||
requiredFirst: false,
|
||||
sortShapeProp: true,
|
||||
}],
|
||||
|
||||
// Deprecated in favor of react/jsx-sort-props
|
||||
'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,
|
||||
@@ -124,68 +150,75 @@ module.exports = {
|
||||
reservedFirst: true,
|
||||
}],
|
||||
|
||||
// Enforce defaultProps declarations alphabetical sorting
|
||||
// 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
|
||||
'react/no-did-mount-set-state': 'error',
|
||||
// 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
|
||||
'react/no-multi-comp': ['error', { ignoreStateless: true }],
|
||||
// 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: [],
|
||||
@@ -193,92 +226,131 @@ 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/master/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',
|
||||
'/^(get|set)(?!(InitialState$|DefaultProps$|ChildContext$)).+$/',
|
||||
'instance-methods',
|
||||
'everything-else',
|
||||
'/^render.+$/',
|
||||
'render'
|
||||
'rendering',
|
||||
],
|
||||
groups: {
|
||||
lifecycle: [
|
||||
'displayName',
|
||||
'propTypes',
|
||||
'contextTypes',
|
||||
'childContextTypes',
|
||||
'mixins',
|
||||
'statics',
|
||||
'defaultProps',
|
||||
'constructor',
|
||||
'getDefaultProps',
|
||||
'getInitialState',
|
||||
'state',
|
||||
'getChildContext',
|
||||
'getDerivedStateFromProps',
|
||||
'componentWillMount',
|
||||
'UNSAFE_componentWillMount',
|
||||
'componentDidMount',
|
||||
'componentWillReceiveProps',
|
||||
'UNSAFE_componentWillReceiveProps',
|
||||
'shouldComponentUpdate',
|
||||
'componentWillUpdate',
|
||||
'UNSAFE_componentWillUpdate',
|
||||
'getSnapshotBeforeUpdate',
|
||||
'componentDidUpdate',
|
||||
'componentDidCatch',
|
||||
'componentWillUnmount'
|
||||
],
|
||||
rendering: [
|
||||
'/^render.+$/',
|
||||
'render'
|
||||
],
|
||||
},
|
||||
}],
|
||||
|
||||
// Prevent missing parentheses around multilines JSX
|
||||
// https://github.com/yannickcr/eslint-plugin-react/blob/master/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: true,
|
||||
assignment: true,
|
||||
return: true,
|
||||
arrow: true,
|
||||
declaration: 'parens-new-line',
|
||||
assignment: 'parens-new-line',
|
||||
return: 'parens-new-line',
|
||||
arrow: 'parens-new-line',
|
||||
condition: 'parens-new-line',
|
||||
logical: 'parens-new-line',
|
||||
prop: 'parens-new-line',
|
||||
}],
|
||||
|
||||
// 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/master/docs/rules/jsx-no-target-blank.md
|
||||
'react/jsx-no-target-blank': 'error',
|
||||
// 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: [
|
||||
],
|
||||
@@ -286,72 +358,235 @@ 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/master/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',
|
||||
afterOpening: 'never'
|
||||
afterOpening: 'never',
|
||||
beforeClosing: 'never',
|
||||
}],
|
||||
|
||||
// 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/master/docs/rules/require-default-props.md
|
||||
'react/require-default-props': 'error',
|
||||
// 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
|
||||
'react/forbid-foreign-prop-types': 'off',
|
||||
// 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/73abadb697034b5ccb514d79fb4689836fe61f91/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]?)+',
|
||||
message: '',
|
||||
}],
|
||||
|
||||
// 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
|
||||
'react/jsx-curly-brace-presence': ['error', { props: 'never', children: 'never' }]
|
||||
// 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/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/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/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/jsx-eslint/eslint-plugin-react/blob/843d71a432baf0f01f598d7cf1eea75ad6896e4b/docs/rules/button-has-type.md
|
||||
'react/button-has-type': ['error', {
|
||||
button: true,
|
||||
submit: true,
|
||||
reset: false,
|
||||
}],
|
||||
|
||||
// Ensures inline tags are not rendered without spaces between them
|
||||
'react/jsx-child-element-spacing': 'off',
|
||||
|
||||
// Prevent this from being used in stateless functional components
|
||||
// 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/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/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/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/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/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/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/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/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/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
|
||||
// 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
|
||||
// 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
|
||||
}],
|
||||
},
|
||||
|
||||
settings: {
|
||||
@@ -362,7 +597,7 @@ module.exports = {
|
||||
},
|
||||
react: {
|
||||
pragma: 'React',
|
||||
version: '15.0'
|
||||
version: 'detect',
|
||||
},
|
||||
propWrapperFunctions: [
|
||||
'forbidExtraProps', // https://www.npmjs.com/package/airbnb-prop-types
|
||||
|
||||
15
packages/eslint-config-airbnb/test/requires.js
Normal file
15
packages/eslint-config-airbnb/test/requires.js
Normal file
@@ -0,0 +1,15 @@
|
||||
/* eslint strict: 0, global-require: 0 */
|
||||
|
||||
'use strict';
|
||||
|
||||
const test = require('tape');
|
||||
|
||||
test('all entry points parse', (t) => {
|
||||
t.doesNotThrow(() => require('..'), 'index does not throw');
|
||||
t.doesNotThrow(() => require('../base'), 'base does not throw');
|
||||
t.doesNotThrow(() => require('../legacy'), 'legacy does not throw');
|
||||
t.doesNotThrow(() => require('../whitespace'), 'whitespace does not throw');
|
||||
t.doesNotThrow(() => require('../hooks'), 'hooks does not throw');
|
||||
|
||||
t.end();
|
||||
});
|
||||
@@ -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) => {
|
||||
@@ -22,13 +23,13 @@ Object.keys(files).forEach((name) => {
|
||||
t.plan(2);
|
||||
|
||||
// scan plugins for react and fail if it is found
|
||||
const hasReactPlugin = Object.prototype.hasOwnProperty.call(config, 'plugins') &&
|
||||
config.plugins.indexOf('react') !== -1;
|
||||
const hasReactPlugin = Object.prototype.hasOwnProperty.call(config, 'plugins')
|
||||
&& config.plugins.indexOf('react') !== -1;
|
||||
t.notOk(hasReactPlugin, 'there is no react plugin');
|
||||
|
||||
// scan rules for react/ and fail if any exist
|
||||
const reactRuleIds = Object.keys(config.rules)
|
||||
.filter(ruleId => ruleId.indexOf('react/') === 0);
|
||||
.filter((ruleId) => ruleId.indexOf('react/') === 0);
|
||||
t.deepEquals(reactRuleIds, [], 'there are no react/ rules');
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,66 +1,68 @@
|
||||
import test from 'tape';
|
||||
import { CLIEngine } from 'eslint';
|
||||
import eslintrc from '../';
|
||||
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 }],
|
||||
},
|
||||
...(CLIEngine ? { rules } : { overrideConfig: { rules } }),
|
||||
});
|
||||
|
||||
function lint(text) {
|
||||
// @see http://eslint.org/docs/developer-guide/nodejs-api.html#executeonfiles
|
||||
// @see http://eslint.org/docs/developer-guide/nodejs-api.html#executeontext
|
||||
const linter = cli.executeOnText(text);
|
||||
return linter.results[0];
|
||||
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 = 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() {}
|
||||
@@ -70,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() {}
|
||||
@@ -87,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');
|
||||
});
|
||||
});
|
||||
|
||||
48
packages/eslint-config-airbnb/whitespace-async.js
Executable file
48
packages/eslint-config-airbnb/whitespace-async.js
Executable file
@@ -0,0 +1,48 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
const entries = require('object.entries');
|
||||
const { ESLint } = require('eslint');
|
||||
|
||||
const baseConfig = require('.');
|
||||
const whitespaceRules = require('./whitespaceRules');
|
||||
|
||||
const severities = ['off', 'warn', 'error'];
|
||||
|
||||
function getSeverity(ruleConfig) {
|
||||
if (Array.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 (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';
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return errorsOnly;
|
||||
}
|
||||
|
||||
onlyErrorOnRules(whitespaceRules, baseConfig).then((config) => console.log(JSON.stringify(config)));
|
||||
54
packages/eslint-config-airbnb/whitespace.js
Normal file
54
packages/eslint-config-airbnb/whitespace.js
Normal file
@@ -0,0 +1,54 @@
|
||||
/* eslint global-require: 0 */
|
||||
|
||||
const { CLIEngine } = require('eslint');
|
||||
|
||||
if (CLIEngine) {
|
||||
/* eslint no-inner-declarations: 0 */
|
||||
const entries = require('object.entries');
|
||||
const whitespaceRules = require('./whitespaceRules');
|
||||
|
||||
const baseConfig = require('.');
|
||||
|
||||
const severities = ['off', 'warn', 'error'];
|
||||
|
||||
function getSeverity(ruleConfig) {
|
||||
if (Array.isArray(ruleConfig)) {
|
||||
return getSeverity(ruleConfig[0]);
|
||||
}
|
||||
if (typeof ruleConfig === 'number') {
|
||||
return severities[ruleConfig];
|
||||
}
|
||||
return ruleConfig;
|
||||
}
|
||||
|
||||
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 (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';
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return errorsOnly;
|
||||
}
|
||||
|
||||
module.exports = onlyErrorOnRules(whitespaceRules, baseConfig);
|
||||
} else {
|
||||
const path = require('path');
|
||||
const { execSync } = require('child_process');
|
||||
|
||||
module.exports = JSON.parse(String(execSync(path.join(__dirname, 'whitespace-async.js'))));
|
||||
}
|
||||
64
packages/eslint-config-airbnb/whitespaceRules.js
Normal file
64
packages/eslint-config-airbnb/whitespaceRules.js
Normal 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',
|
||||
];
|
||||
190
react/README.md
190
react/README.md
@@ -2,6 +2,8 @@
|
||||
|
||||
*A mostly reasonable approach to React and JSX*
|
||||
|
||||
This style guide is mostly based on the standards that are currently prevalent in JavaScript, although some conventions (i.e async/await or static class fields) may still be included or prohibited on a case-by-case basis. Currently, anything prior to stage 3 is not included nor recommended in this guide.
|
||||
|
||||
## Table of Contents
|
||||
|
||||
1. [Basic Rules](#basic-rules)
|
||||
@@ -23,13 +25,14 @@
|
||||
## 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 you're initializing the app from a file that is not JSX.
|
||||
- Do not use `React.createElement` unless you’re initializing the app from a file that is not JSX.
|
||||
- [`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
|
||||
@@ -49,7 +52,7 @@
|
||||
}
|
||||
```
|
||||
|
||||
And if you don't have state or refs, prefer normal functions (not arrow functions) over classes:
|
||||
And if you don’t have state or refs, prefer normal functions (not arrow functions) over classes:
|
||||
|
||||
```jsx
|
||||
// bad
|
||||
@@ -78,9 +81,9 @@
|
||||
|
||||
## Naming
|
||||
|
||||
- **Extensions**: Use `.jsx` extension for React components.
|
||||
- **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
|
||||
@@ -108,9 +111,10 @@
|
||||
// good
|
||||
import Footer from './Footer';
|
||||
```
|
||||
- **Higher-order Component Naming**: Use a composite of the higher-order component's name and the passed-in component's 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 component's `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.
|
||||
- **Higher-order Component Naming**: Use a composite of the higher-order component’s name and the passed-in component’s 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 component’s `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.
|
||||
|
||||
```jsx
|
||||
// bad
|
||||
@@ -143,6 +147,9 @@
|
||||
// bad
|
||||
<MyComponent style="fancy" />
|
||||
|
||||
// bad
|
||||
<MyComponent className="fancy" />
|
||||
|
||||
// good
|
||||
<MyComponent variant="fancy" />
|
||||
```
|
||||
@@ -165,7 +172,7 @@
|
||||
|
||||
## 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
|
||||
@@ -188,11 +195,51 @@
|
||||
>
|
||||
<Quux />
|
||||
</Foo>
|
||||
|
||||
// bad
|
||||
{showButton &&
|
||||
<Button />
|
||||
}
|
||||
|
||||
// bad
|
||||
{
|
||||
showButton &&
|
||||
<Button />
|
||||
}
|
||||
|
||||
// good
|
||||
{showButton && (
|
||||
<Button />
|
||||
)}
|
||||
|
||||
// good
|
||||
{showButton && <Button />}
|
||||
|
||||
// good
|
||||
{someReallyLongConditional
|
||||
&& anotherLongConditional
|
||||
&& (
|
||||
<Foo
|
||||
superLongParam="bar"
|
||||
anotherSuperLongParam="baz"
|
||||
/>
|
||||
)
|
||||
}
|
||||
|
||||
// good
|
||||
{someConditional ? (
|
||||
<Foo />
|
||||
) : (
|
||||
<Foo
|
||||
superLongParam="bar"
|
||||
anotherSuperLongParam="baz"
|
||||
/>
|
||||
)}
|
||||
```
|
||||
|
||||
## Quotes
|
||||
|
||||
- Always use double quotes (`"`) for JSX attributes, but single quotes (`'`) for all other JS. eslint: [`jsx-quotes`](http://eslint.org/docs/rules/jsx-quotes)
|
||||
- Always use double quotes (`"`) for JSX attributes, but single quotes (`'`) for all other JS. eslint: [`jsx-quotes`](https://eslint.org/docs/rules/jsx-quotes)
|
||||
|
||||
> Why? Regular HTML attributes also typically use double quotes instead of single, so JSX attributes mirror this convention.
|
||||
|
||||
@@ -212,7 +259,7 @@
|
||||
|
||||
## Spacing
|
||||
|
||||
- Always include a single space in your self-closing tag. eslint: [`no-multi-spaces`](http://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
|
||||
@@ -229,7 +276,7 @@
|
||||
<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
|
||||
@@ -241,7 +288,7 @@
|
||||
|
||||
## 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
|
||||
@@ -254,10 +301,11 @@
|
||||
<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
|
||||
@@ -274,7 +322,7 @@
|
||||
<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
|
||||
@@ -290,7 +338,7 @@
|
||||
<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.
|
||||
|
||||
@@ -302,7 +350,7 @@
|
||||
<img src="hello.jpg" alt="Me waving hello" />
|
||||
```
|
||||
|
||||
- Use only valid, non-abstract [ARIA roles](https://www.w3.org/TR/wai-aria/roles#role_definitions). 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
|
||||
@@ -315,7 +363,7 @@
|
||||
<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.
|
||||
|
||||
@@ -327,7 +375,11 @@
|
||||
<div />
|
||||
```
|
||||
|
||||
- Avoid using an array index as `key` prop, prefer a unique ID. ([why?](https://medium.com/@robinpokorny/index-as-a-key-is-an-anti-pattern-e0349aece318))
|
||||
- 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.
|
||||
|
||||
We don’t recommend using indexes for keys if the order of items may change.
|
||||
|
||||
```jsx
|
||||
// bad
|
||||
@@ -377,9 +429,61 @@
|
||||
};
|
||||
```
|
||||
|
||||
- Use spread props sparingly.
|
||||
> Why? Otherwise you’re more likely to pass unnecessary props down to components. And for React v15.6.1 and older, you could [pass invalid HTML attributes to the DOM](https://reactjs.org/blog/2017/09/08/dom-attributes-in-react-16.html).
|
||||
|
||||
Exceptions:
|
||||
|
||||
- HOCs that proxy down props and hoist propTypes
|
||||
|
||||
```jsx
|
||||
function HOC(WrappedComponent) {
|
||||
return class Proxy extends React.Component {
|
||||
Proxy.propTypes = {
|
||||
text: PropTypes.string,
|
||||
isLoading: PropTypes.bool
|
||||
};
|
||||
|
||||
render() {
|
||||
return <WrappedComponent {...this.props} />
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
- Spreading objects with known, explicit props. This can be particularly useful when testing React components with Mocha’s beforeEach construct.
|
||||
|
||||
```jsx
|
||||
export default function Foo {
|
||||
const props = {
|
||||
text: '',
|
||||
isPublished: false
|
||||
}
|
||||
|
||||
return (<div {...props} />);
|
||||
}
|
||||
```
|
||||
|
||||
Notes for use:
|
||||
Filter out unnecessary props when possible. Also, use [prop-types-exact](https://www.npmjs.com/package/prop-types-exact) to help prevent bugs.
|
||||
|
||||
```jsx
|
||||
// bad
|
||||
render() {
|
||||
const { irrelevantProp, ...relevantProps } = this.props;
|
||||
return <WrappedComponent {...this.props} />
|
||||
}
|
||||
|
||||
// good
|
||||
render() {
|
||||
const { irrelevantProp, ...relevantProps } = this.props;
|
||||
return <WrappedComponent {...relevantProps} />
|
||||
}
|
||||
```
|
||||
|
||||
## 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
|
||||
@@ -395,12 +499,12 @@
|
||||
|
||||
## 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
|
||||
render() {
|
||||
return <MyComponent className="long body" foo="bar">
|
||||
return <MyComponent variant="long body" foo="bar">
|
||||
<MyChild />
|
||||
</MyComponent>;
|
||||
}
|
||||
@@ -408,7 +512,7 @@
|
||||
// good
|
||||
render() {
|
||||
return (
|
||||
<MyComponent className="long body" foo="bar">
|
||||
<MyComponent variant="long body" foo="bar">
|
||||
<MyChild />
|
||||
</MyComponent>
|
||||
);
|
||||
@@ -423,17 +527,17 @@
|
||||
|
||||
## 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
|
||||
<Foo className="stuff"></Foo>
|
||||
<Foo variant="stuff"></Foo>
|
||||
|
||||
// good
|
||||
<Foo className="stuff" />
|
||||
<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
|
||||
@@ -450,7 +554,7 @@
|
||||
|
||||
## Methods
|
||||
|
||||
- Use arrow functions to close over local variables.
|
||||
- Use arrow functions to close over local variables. It is handy when you need to pass additional data to an event handler. Although, make sure they [do not massively hurt performance](https://www.bignerdranch.com/blog/choosing-the-best-approach-for-react-event-handlers/), in particular when passed to custom components that might be PureComponents, because they will trigger a possibly needless rerender every time.
|
||||
|
||||
```jsx
|
||||
function ItemList(props) {
|
||||
@@ -459,7 +563,7 @@
|
||||
{props.items.map((item, index) => (
|
||||
<Item
|
||||
key={item.key}
|
||||
onClick={() => doSomethingWith(item.name, index)}
|
||||
onClick={(event) => { doSomethingWith(event, item.name, index); }}
|
||||
/>
|
||||
))}
|
||||
</ul>
|
||||
@@ -467,9 +571,9 @@
|
||||
}
|
||||
```
|
||||
|
||||
- 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.
|
||||
> 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.
|
||||
|
||||
```jsx
|
||||
// bad
|
||||
@@ -483,6 +587,17 @@
|
||||
}
|
||||
}
|
||||
|
||||
// very bad
|
||||
class extends React.Component {
|
||||
onClickDiv = () => {
|
||||
// do stuff
|
||||
}
|
||||
|
||||
render() {
|
||||
return <div onClick={this.onClickDiv} />
|
||||
}
|
||||
}
|
||||
|
||||
// good
|
||||
class extends React.Component {
|
||||
constructor(props) {
|
||||
@@ -524,7 +639,7 @@
|
||||
}
|
||||
```
|
||||
|
||||
- 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
|
||||
@@ -552,7 +667,8 @@
|
||||
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`
|
||||
@@ -589,7 +705,7 @@
|
||||
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`
|
||||
@@ -615,7 +731,7 @@
|
||||
|
||||
## `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.
|
||||
|
||||
@@ -625,7 +741,7 @@
|
||||
|
||||
This JSX/React style guide is also available in other languages:
|
||||
|
||||
-  **Chinese (Simplified)**: [JasonBoy/javascript](https://github.com/JasonBoy/javascript/tree/master/react)
|
||||
-  **Chinese (Simplified)**: [jhcccc/javascript](https://github.com/jhcccc/javascript/tree/master/react)
|
||||
-  **Chinese (Traditional)**: [jigsawye/javascript](https://github.com/jigsawye/javascript/tree/master/react)
|
||||
-  **Español**: [agrcrobles/javascript](https://github.com/agrcrobles/javascript/tree/master/react)
|
||||
-  **Japanese**: [mitsuruog/javascript-style-guide](https://github.com/mitsuruog/javascript-style-guide/tree/master/react)
|
||||
@@ -634,6 +750,8 @@
|
||||
-  **Portuguese**: [ronal2do/javascript](https://github.com/ronal2do/airbnb-react-styleguide)
|
||||
-  **Russian**: [leonidlebedev/javascript-airbnb](https://github.com/leonidlebedev/javascript-airbnb/tree/master/react)
|
||||
-  **Thai**: [lvarayut/javascript-style-guide](https://github.com/lvarayut/javascript-style-guide/tree/master/react)
|
||||
-  **Turkish**: [alioguzhan/react-style-guide](https://github.com/alioguzhan/react-style-guide)
|
||||
-  **Ukrainian**: [ivanzusko/javascript](https://github.com/ivanzusko/javascript/tree/master/react)
|
||||
-  **Vietnam**: [uetcodecamp/jsx-style-guide](https://github.com/UETCodeCamp/jsx-style-guide)
|
||||
|
||||
**[⬆ back to top](#table-of-contents)**
|
||||
|
||||
Reference in New Issue
Block a user