-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy patheslint.config.js
More file actions
146 lines (145 loc) · 3.85 KB
/
eslint.config.js
File metadata and controls
146 lines (145 loc) · 3.85 KB
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
import eslint from '@eslint/js';
import checkFile from 'eslint-plugin-check-file';
import importPlugin from 'eslint-plugin-import';
import jsdoc from 'eslint-plugin-jsdoc';
import react from 'eslint-plugin-react';
import reactHooks from 'eslint-plugin-react-hooks';
import globals from 'globals';
import tseslint from 'typescript-eslint';
export default tseslint.config(
eslint.configs.recommended,
...tseslint.configs.recommended,
react.configs.flat.recommended,
react.configs.flat['jsx-runtime'],
{
plugins: {
'react-hooks': reactHooks,
},
rules: {
...reactHooks.configs.recommended.rules,
},
settings: {
react: {
version: 'detect',
},
},
},
{
languageOptions: {
globals: {
...globals.browser,
},
},
},
{
plugins: {
'check-file': checkFile,
},
rules: {
// File naming: PascalCase for components, camelCase for everything else
'check-file/filename-naming-convention': [
'error',
{
// Components use PascalCase (App.tsx and all .tsx in components/)
'**/src/App.tsx': 'PASCAL_CASE',
'**/src/components/**/*.tsx': 'PASCAL_CASE',
// Non-component files use camelCase
'**/src/hooks/*.{ts,tsx}': 'CAMEL_CASE',
'**/src/services/**/*.ts': 'CAMEL_CASE',
'**/src/shared/*.ts': 'CAMEL_CASE',
},
{ ignoreMiddleExtensions: true },
],
// Folder naming: camelCase
'check-file/folder-naming-convention': [
'error',
{ '**/src/**/': 'CAMEL_CASE' },
],
},
},
{
rules: {
'@typescript-eslint/naming-convention': [
'error',
// Default for variables: camelCase or UPPER_CASE
{
selector: 'variable',
format: ['camelCase', 'UPPER_CASE', 'PascalCase'],
leadingUnderscore: 'allowDouble',
},
// Functions: camelCase or PascalCase (for React components)
{
selector: 'function',
format: ['camelCase', 'PascalCase'],
},
// Types & Interfaces: PascalCase
{
selector: 'typeLike',
format: ['PascalCase'],
},
// Parameters: camelCase
{
selector: 'parameter',
format: ['camelCase'],
leadingUnderscore: 'allow',
},
],
},
},
{
plugins: {
import: importPlugin,
},
rules: {
// Import organization
'import/order': [
'error',
{
groups: [
'builtin',
'external',
'internal',
['parent', 'sibling'],
'index',
'type',
],
'newlines-between': 'never',
alphabetize: { order: 'asc', caseInsensitive: true },
},
],
'import/no-duplicates': 'error',
// Prefer logger utility over console.*
'no-console': 'warn',
// Enforce self-closing tags when no children
'react/self-closing-comp': 'error',
// Prevent unnecessary curly braces in JSX
'react/jsx-curly-brace-presence': ['error', { props: 'never', children: 'never' }],
},
},
{
files: ['src/services/**/*.ts', 'src/hooks/**/*.{ts,tsx}', 'src/shared/**/*.ts'],
plugins: {
jsdoc,
},
rules: {
// Require JSDoc on exported function declarations in services, hooks, and shared
'jsdoc/require-jsdoc': ['warn', {
require: {
FunctionDeclaration: false,
MethodDefinition: false,
ClassDeclaration: false,
},
contexts: [
'ExportNamedDeclaration > FunctionDeclaration',
],
checkConstructors: false,
}],
// Require @param tags for function parameters
'jsdoc/require-param': 'warn',
'jsdoc/require-param-description': 'warn',
},
},
{
ignores: ['dist/', 'src-tauri/'],
}
);