UNPKG

6.1 kBJavaScriptView Raw
1module.exports = {
2 extends: ['@3fs', '@3fs/eslint-config/configs/jsx-a11y'],
3 plugins: ['react'],
4 parserOptions: { ecmaFeatures: { jsx: true } },
5 settings: {
6 'import/resolver': {
7 node: {
8 extensions: [
9 '.js',
10 '.jsx',
11 '.json'
12 ]
13 }
14 },
15 'react': {
16 pragma: 'React',
17 version: 'detect'
18 }
19 },
20 /*
21 * View link below for react rules documentation
22 * https://github.com/yannickcr/eslint-plugin-react#list-of-supported-rules
23 */
24 rules: {
25 'jsx-quotes': ['error', 'prefer-double'],
26
27 // REACT RULES
28 'react/boolean-prop-naming': 'off',
29 'react/button-has-type': 'error',
30 'react/destructuring-assignment': 'error',
31 'react/display-name': ['off', { ignoreTranspilerName: false }],
32 'react/forbid-dom-props': 'off',
33 'react/forbid-prop-types': [
34 'error',
35 {
36 forbid: [
37 'any',
38 'array',
39 'object'
40 ]
41 }
42 ],
43 'react/jsx-boolean-value': ['error', 'never'],
44 'react/jsx-closing-bracket-location': ['error', 'line-aligned'],
45 'react/jsx-closing-tag-location': 'off',
46 'react/jsx-curly-spacing': [
47 'error',
48 'never',
49 { allowMultiline: true }
50 ],
51 'react/jsx-handler-names': [
52 'off',
53 {
54 eventHandlerPrefix: 'handle',
55 eventHandlerPropPrefix: 'on'
56 }
57 ],
58 'react/jsx-indent-props': ['error', 2],
59 'react/jsx-key': 'off',
60 'react/jsx-max-props-per-line': ['error', { maximum: 1, when: 'multiline' }],
61 'react/jsx-no-bind': [
62 'error',
63 {
64 ignoreRefs: true,
65 allowArrowFunctions: true,
66 allowBind: false
67 }
68 ],
69 'react/jsx-no-duplicate-props': ['error', { ignoreCase: true }],
70 'react/jsx-no-literals': 'off',
71 'react/jsx-no-undef': 'error',
72 'react/jsx-pascal-case': [
73 'error',
74 {
75 allowAllCaps: true,
76 ignore: []
77 }
78 ],
79 'react/sort-prop-types': [
80 'off',
81 {
82 ignoreCase: true,
83 callbacksLast: false,
84 requiredFirst: false
85 }
86 ],
87 'react/jsx-sort-prop-types': 'off',
88 'react/jsx-sort-props': [
89 'off',
90 {
91 ignoreCase: true,
92 callbacksLast: false,
93 shorthandFirst: false,
94 shorthandLast: false,
95 noSortAlphabetically: false,
96 reservedFirst: true
97 }
98 ],
99 'react/jsx-uses-react': ['error'],
100 'react/jsx-uses-vars': 'error',
101 'react/no-danger': 'warn',
102 'react/no-deprecated': ['error'],
103 'react/no-did-mount-set-state': 'error',
104 'react/no-did-update-set-state': 'error',
105 'react/no-will-update-set-state': 'error',
106 'react/no-direct-mutation-state': 'off',
107 'react/no-is-mounted': 'error',
108 'react/no-multi-comp': ['error', { ignoreStateless: true }],
109 'react/no-set-state': 'off',
110 'react/no-string-refs': 'error',
111 'react/no-unknown-property': 'error',
112 'react/prefer-es6-class': ['error', 'always'],
113 'react/prefer-read-only-props': 'off',
114 'react/prefer-stateless-function': ['error', { ignorePureComponents: true }],
115 'react/prop-types': [
116 'error',
117 {
118 ignore: [],
119 customValidators: [],
120 skipUndeclared: false
121 }
122 ],
123 'react/react-in-jsx-scope': 'error',
124 'react/require-render-return': 'error',
125 'react/self-closing-comp': 'error',
126 'react/sort-comp': [
127 'error',
128 {
129 order: [
130 'static-methods',
131 'lifecycle',
132 '/^on.+$/',
133 '/^(get|set)(?!(InitialState$|DefaultProps$|ChildContext$)).+$/',
134 'everything-else',
135 '/^render.+$/',
136 'render'
137 ]
138 }
139 ],
140 'react/state-in-constructor': 'off',
141 'react/static-property-placement': 'off',
142 'react/jsx-wrap-multilines': [
143 'error',
144 {
145 declaration: true,
146 assignment: true,
147 return: true,
148 arrow: true
149 }
150 ],
151 'react/jsx-first-prop-new-line': ['error', 'multiline-multiprop'],
152 'react/jsx-fragments': ['error', 'element'],
153 'react/jsx-equals-spacing': ['error', 'never'],
154 'react/jsx-indent': ['error', 2],
155 'react/jsx-no-target-blank': 'error',
156 'react/jsx-filename-extension': ['error', { extensions: ['.js', '.jsx'] }],
157 'react/jsx-no-comment-textnodes': 'error',
158 'react/no-render-return-value': 'error',
159 'react/require-optimization': ['off', { allowDecorators: [] }],
160 'react/no-find-dom-node': 'error',
161 'react/forbid-component-props': ['off', { forbid: [] }],
162 'react/forbid-elements': ['off', { forbid: [] }],
163 'react/no-danger-with-children': 'error',
164 'react/no-unused-prop-types': [
165 'error',
166 {
167 customValidators: [],
168 skipShapeProps: true
169 }
170 ],
171 'react/style-prop-object': 'error',
172 'react/no-unescaped-entities': 'error',
173 'react/no-children-prop': 'error',
174 'react/jsx-curly-newline': ['error', { multiline: 'consistent', singleline: 'consistent' }],
175 'react/jsx-tag-spacing': [
176 'error',
177 {
178 closingSlash: 'never',
179 beforeSelfClosing: 'allow',
180 afterOpening: 'never'
181 }
182 ],
183 'react/jsx-child-element-spacing': 'error',
184 'react/jsx-curly-brace-presence': ['error', { props: 'always', children: 'never' }],
185 'react/jsx-max-depth': ['error', { 'max': 5 }],
186 'react/jsx-one-expression-per-line': ['error', { allow: 'single-child' }],
187 'react/jsx-props-no-multi-spaces': 'error',
188 'react/jsx-props-no-spreading': 'off',
189 'react/jsx-sort-default-props': 'off',
190 'react/no-access-state-in-setstate': 'error',
191 'react/no-this-in-sfc': 'error',
192 'react/no-typos': 'error',
193 'react/no-unsafe': ['error', { checkAliases: true }],
194 'react/no-unused-state': 'error',
195 'react/no-array-index-key': 'error',
196 'react/require-default-props': 'error',
197 'react/forbid-foreign-prop-types': 'off',
198 'react/void-dom-elements-no-children': 'error',
199 'react/default-props-match-prop-types': ['off', { allowRequiredDefaults: false }],
200 'react/no-redundant-should-component-update': 'off'
201 }
202};