Skip to content

Commit e259074

Browse files
committed
feat(config/eslint): provide React-specific configuration
The existing configuration attempts to auto-detect whether React-specific configurations should be loaded, however this detection does not work properly in monorepos. This provides 'eslint-react' which unconditionally loads React-specific configurations.
1 parent 02fec4a commit e259074

File tree

5 files changed

+57
-43
lines changed

5 files changed

+57
-43
lines changed

eslint-react.js

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
module.exports = require('./dist/config/eslintrc-react')

src/config/__tests__/umbrella.js

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ test('requiring some files does not blow up', () => {
22
require('../babel-transform')
33
require('../babelrc')
44
require('../eslintrc')
5+
require('../eslintrc-react')
56
require('../jest.config')
67
require('../lintstagedrc')
78
require('../prettierrc')

src/config/eslintrc-react.js

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
const {buildConfig} = require('./helpers/eslint')
2+
3+
module.exports = buildConfig({withReact: true})

src/config/eslintrc.js

+2-43
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,3 @@
1-
const {rules} = require('eslint-config-airbnb-typescript/lib/shared')
1+
const {buildConfig} = require('./helpers/eslint')
22

3-
const {ifAnyDep} = require('../utils')
4-
const {testMatch} = require('./jest.config')
5-
6-
const withBaseConfig = base => variant =>
7-
require.resolve(base + (variant ? `/${variant}` : ''))
8-
9-
const airbnb = withBaseConfig('eslint-config-airbnb-typescript')
10-
const prettier = withBaseConfig('eslint-config-prettier')
11-
12-
module.exports = {
13-
plugins: ['prettier', 'jest', ifAnyDep('react', 'react-hooks')].filter(
14-
Boolean,
15-
),
16-
extends: [
17-
ifAnyDep('react', airbnb(), airbnb('base')),
18-
'plugin:jest/recommended',
19-
prettier(),
20-
prettier('@typescript-eslint'),
21-
ifAnyDep('react', prettier('react')),
22-
].filter(Boolean),
23-
rules: {
24-
'prettier/prettier': 'error',
25-
'import/prefer-default-export': 'off',
26-
'import/no-extraneous-dependencies': [
27-
'error',
28-
{
29-
devDependencies: rules[
30-
'import/no-extraneous-dependencies'
31-
][1].devDependencies.concat('jest/**'),
32-
optionalDependencies: false,
33-
},
34-
],
35-
},
36-
overrides: [
37-
{
38-
files: testMatch,
39-
rules: {
40-
'no-empty': ['error', {allowEmptyCatch: true}],
41-
},
42-
},
43-
],
44-
}
3+
module.exports = buildConfig()

src/config/helpers/eslint.js

+50
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
const {rules} = require('eslint-config-airbnb-typescript/lib/shared')
2+
3+
const {hasAnyDep} = require('../../utils')
4+
const {testMatch} = require('../jest.config')
5+
6+
const withBaseConfig = base => variant =>
7+
require.resolve(base + (variant ? `/${variant}` : ''))
8+
9+
const airbnb = withBaseConfig('eslint-config-airbnb-typescript')
10+
const prettier = withBaseConfig('eslint-config-prettier')
11+
12+
const hasReact = hasAnyDep('react')
13+
14+
const buildConfig = ({withReact = false} = {}) => {
15+
const ifReact = (t, f) => (withReact || hasReact ? t : f)
16+
17+
return {
18+
plugins: ['prettier', 'jest', ifReact('react-hooks')].filter(Boolean),
19+
extends: [
20+
ifReact(airbnb(), airbnb('base')),
21+
'plugin:jest/recommended',
22+
prettier(),
23+
prettier('@typescript-eslint'),
24+
ifReact(prettier('react')),
25+
].filter(Boolean),
26+
rules: {
27+
'prettier/prettier': 'error',
28+
'import/prefer-default-export': 'off',
29+
'import/no-extraneous-dependencies': [
30+
'error',
31+
{
32+
devDependencies: rules[
33+
'import/no-extraneous-dependencies'
34+
][1].devDependencies.concat('jest/**'),
35+
optionalDependencies: false,
36+
},
37+
],
38+
},
39+
overrides: [
40+
{
41+
files: testMatch,
42+
rules: {
43+
'no-empty': ['error', {allowEmptyCatch: true}],
44+
},
45+
},
46+
],
47+
}
48+
}
49+
50+
module.exports = {buildConfig}

0 commit comments

Comments
 (0)