forked from dnd-side-project/dnd-9th-5-frontend
-
Notifications
You must be signed in to change notification settings - Fork 0
/
.eslintrc.js
191 lines (169 loc) ยท 5.74 KB
/
.eslintrc.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
module.exports = {
root: true,
env: {
es6: true,
node: true,
},
parser: '@typescript-eslint/parser',
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/recommended',
'eslint-config-prettier',
'next/core-web-vitals',
],
plugins: ['@typescript-eslint', 'import', 'prettier', 'react', 'react-hooks', 'jsx-a11y'],
settings: {
'import/resolver': {
node: {
extensions: ['.js', '.jsx', '.ts', '.tsx'],
},
},
},
rules: {
'prettier/prettier': 0,
'react-hooks/exhaustive-deps': 'error',
// TypeScript์์ ์ด๋ฏธ ์ก๊ณ ์๋ ๋ฌธ์ ์ด๊ธฐ ๋๋ฌธ์ + location, document ๋ฑ์ global variable๋ ์ก์์
'no-undef': 'off',
// ์๋ 3๊ฐ์ ๊ฒฝ์ฐ, Prettier๊ฐ ์ด๋ฏธ ์ ํด ์ฃผ๊ณ ์๋ ๋ถ๋ถ์ด๊ธฐ ๋๋ฌธ์
indent: 'off',
'@typescript-eslint/indent': 'off',
semi: 'off',
// ์ด๋ฏธ ๋๋ฆฌ ์ฐ์ด๊ณ ์์ด ์๋ฌ ์๊ฐ ๊ฐ๋น์ด ๋์ง ์์ ์ ์ ๊บผ๋ก๋๋ค.
'@typescript-eslint/no-non-null-assertion': 'off',
'@typescript-eslint/no-explicit-any': 'off',
// Strict-boolean-expression์ ์ฌ์ฉํ ์ง ์์ง ๊ฒฐ๋ก ์ด ๋์ง ์์์
'no-extra-boolean-cast': 'off',
// union type์ ๋ฐ๋ ํจ์์์ ๋ชจ๋ ๊ฒฝ์ฐ์ ์์ ๋ํด return ํด๋ eslint๊ฐ ์ถ๋ก ํ์ง ๋ชปํ๊ณ ์์ด์ warn๋ง ํ๊ณ ์์
'getter-return': 'warn',
// ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ํ์๊ฐ ์์ด์
'@typescript-eslint/explicit-function-return-type': 'off',
// Hoisting์ ์ ๋ต์ ์ผ๋ก ์ฌ์ฉํ ๊ฒฝ์ฐ๊ฐ ๋ง์์
'@typescript-eslint/no-use-before-define': 'off',
// ๋ชจ๋ธ ์ ์ ๋ถ๋ถ์์ class์ interface๋ฅผ ํฉ์น๊ธฐ ์ํด ์ฌ์ฉํ๋ ์ฉ๋ฒ๋ ์ก๊ณ ์์ด์
'@typescript-eslint/no-empty-interface': 'off',
// ๋ชจ๋ธ ์ ์ ๋ถ๋ถ์์ ํ๋ผ๋ฏธํฐ ํ๋กํผํฐ๋ฅผ ์ ์ฐ๊ณ ์์ด์
'@typescript-eslint/no-parameter-properties': 'off',
// TypeScript์์ ์ด๋ฏธ ์ ํด์ฃผ๊ณ ์์ด์
'react/prop-types': 'off',
// React.memo, React.forwardRef์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ๋ง๊ณ ์์ด์
'react/display-name': 'off',
// ํญ๋ด๋น ์ดํ ๋ฐฉ์ง
'react/jsx-no-target-blank': 'error',
// ๋ถํ์ํ Fragment ๋ฐฉ์ง
'react/jsx-no-useless-fragment': 'warn',
'no-async-promise-executor': 'warn',
'@typescript-eslint/prefer-as-const': 'warn',
'@typescript-eslint/no-non-null-asserted-optional-chain': 'warn',
'@typescript-eslint/ban-types': 'warn',
'@typescript-eslint/no-inferrable-types': 'warn',
'@typescript-eslint/no-empty-function': 'off',
'@typescript-eslint/naming-convention': [
'error',
{
format: ['camelCase', 'UPPER_CASE', 'PascalCase'],
selector: 'variable',
leadingUnderscore: 'allow',
},
{
format: ['camelCase', 'PascalCase'],
selector: 'function',
filter: { regex: '[ใฑ-ใ
|ใ
-ใ
ฃ|๊ฐ-ํฃ]', match: false },
},
{
format: ['PascalCase'],
selector: 'interface',
filter: { regex: '[ใฑ-ใ
|ใ
-ใ
ฃ|๊ฐ-ํฃ]', match: false },
},
{
format: ['PascalCase'],
selector: 'typeAlias',
filter: { regex: '[ใฑ-ใ
|ใ
-ใ
ฃ|๊ฐ-ํฃ]', match: false },
},
],
'@typescript-eslint/explicit-module-boundary-types': 'off',
'@typescript-eslint/array-type': ['error', { default: 'array-simple' }],
'@typescript-eslint/no-unused-vars': ['warn', { ignoreRestSiblings: true }],
'@typescript-eslint/member-ordering': [
'error',
{
default: [
'public-static-field',
'private-static-field',
'public-instance-field',
'private-instance-field',
'public-constructor',
'private-constructor',
'public-instance-method',
'private-instance-method',
],
},
],
'no-warning-comments': [
'warn',
{
terms: ['TODO', 'FIXME', 'XXX', 'BUG'],
location: 'anywhere',
},
],
'object-shorthand': ['error', 'always'],
'prefer-const': 'error',
'no-var': 'error',
eqeqeq: ['error', 'always', { null: 'ignore' }],
'import/no-duplicates': 'off',
'sort-imports': [
'error',
{
ignoreDeclarationSort: true,
ignoreMemberSort: false,
},
],
'import/newline-after-import': ['error'],
'react-hooks/rules-of-hooks': 'error',
'react/jsx-uses-react': 'off',
'react/react-in-jsx-scope': 'off',
'react/jsx-key': 'warn',
// ์ ๊ทผ์ฑ, ์ถฉ๋ถํ ์กํ๋ฉด error๋ก ์ฌ๋ฆด ์์
'jsx-a11y/alt-text': [
'warn',
{
img: ['Image', 'Dialog.Image'],
},
],
'jsx-a11y/aria-props': 'error', // ์ ๋๋ก๋ aria-* ์ด๋ฆ์ธ์ง ํ์ธ
'jsx-a11y/aria-proptypes': 'error', // ์ ๋๋ก๋ aria-*์ value ์ธ์ง ๊ฒ์ฌ
'jsx-a11y/aria-role': 'warn', // ํ์ค role ๊ฐ์ธ์ง ํ์ธํ๋ ๋ฃฐ
'jsx-a11y/role-supports-aria-props': 'warn', // ์๋ก ๊ฐ์ด ์ฐ๋ฉด ์๋๋ aria-* ๊ฐ ์๋์ง ํ์ธํ๋๋ฃฐ
'jsx-a11y/aria-unsupported-elements': 'warn', // ํด๋น element์์ ๋ฏธ์ง์ํ๋ aria๊ฐ ๋ค์ด์๋์ง ํ์ธํ๋ ๋ฃฐ
'jsx-a11y/img-redundant-alt': [
'warn',
{
components: ['Image', 'Dialog.Image'],
words: ['์ฌ์ง', '์ด๋ฏธ์ง'],
},
],
'import/order': [
'warn',
{
groups: [
['builtin', 'external'],
['internal', 'parent', 'sibling', 'index'],
['object'],
['type'],
],
'newlines-between': 'always',
alphabetize: {
order: 'asc',
caseInsensitive: true,
},
},
],
},
overrides: [
{
files: ['**/*.js', 'scripts/**/*.ts'],
rules: {
'@typescript-eslint/no-var-requires': 'warn',
},
},
],
};