module.exports = {
root: true,
parser: '@typescript-eslint/parser',
parserOptions: {
ecmaVersion: 2022,
sourceType: 'module',
project: './tsconfig.json'
},
plugins: ['@typescript-eslint'],
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/recommended',
'plugin:@typescript-eslint/recommended-requiring-type-checking'
],
rules: {
// Clean Code rules - Martin Fowler & Uncle Bob standards
'max-lines-per-function': ['error', {
max: 20,
skipBlankLines: true,
skipComments: true
}],
'max-lines': ['error', {
max: 200,
skipBlankLines: true,
skipComments: true
}],
'max-params': ['error', 3],
'complexity': ['error', 5],
'max-depth': ['error', 3],
'max-nested-callbacks': ['error', 2],
// TypeScript specific rules
'@typescript-eslint/explicit-function-return-type': ['error', {
allowExpressions: true,
allowTypedFunctionExpressions: true
}],
'@typescript-eslint/no-explicit-any': 'error',
'@typescript-eslint/no-unused-vars': ['error', {
argsIgnorePattern: '^_',
varsIgnorePattern: '^_'
}],
'@typescript-eslint/strict-boolean-expressions': 'error',
'@typescript-eslint/no-floating-promises': 'error',
'@typescript-eslint/no-misused-promises': 'error',
'@typescript-eslint/await-thenable': 'error',
// General code quality
'no-console': ['warn', { allow: ['warn', 'error'] }],
'no-debugger': 'error',
'no-alert': 'error',
'prefer-const': 'error',
'no-var': 'error',
'eqeqeq': ['error', 'always'],
'curly': ['error', 'all'],
'brace-style': ['error', '1tbs'],
// Import rules
'no-duplicate-imports': 'error',
'sort-imports': ['error', {
ignoreCase: false,
ignoreDeclarationSort: true,
ignoreMemberSort: false
}]
},
env: {
node: true,
es2022: true
},
ignorePatterns: [
'dist',
'node_modules',
'*.config.js',
'*.config.ts',
'.eslintrc.cjs'
]
}