182 lines
5.1 KiB
JavaScript
182 lines
5.1 KiB
JavaScript
module.exports = {
|
|
root: true,
|
|
parser: '@typescript-eslint/parser',
|
|
parserOptions: {
|
|
ecmaVersion: 2022,
|
|
sourceType: 'module',
|
|
project: './tsconfig.json',
|
|
tsconfigRootDir: __dirname,
|
|
},
|
|
plugins: [
|
|
'@typescript-eslint',
|
|
'import',
|
|
'prefer-arrow',
|
|
],
|
|
extends: [
|
|
'eslint:recommended',
|
|
'plugin:@typescript-eslint/recommended',
|
|
'plugin:@typescript-eslint/recommended-requiring-type-checking',
|
|
'prettier', // Must be last to override other configs
|
|
],
|
|
rules: {
|
|
// TypeScript specific
|
|
'@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }],
|
|
'@typescript-eslint/explicit-function-return-type': 'warn',
|
|
'@typescript-eslint/explicit-module-boundary-types': 'warn',
|
|
'@typescript-eslint/no-explicit-any': 'error',
|
|
'@typescript-eslint/no-non-null-assertion': 'off',
|
|
'@typescript-eslint/prefer-nullish-coalescing': 'error',
|
|
'@typescript-eslint/prefer-optional-chain': 'error',
|
|
'@typescript-eslint/no-unnecessary-type-assertion': 'error',
|
|
'@typescript-eslint/no-floating-promises': 'error',
|
|
'@typescript-eslint/await-thenable': 'error',
|
|
'@typescript-eslint/require-await': 'error',
|
|
'@typescript-eslint/no-misused-promises': 'error',
|
|
|
|
// Import rules
|
|
'import/order': ['error', {
|
|
'groups': [
|
|
'builtin',
|
|
'external',
|
|
'internal',
|
|
'parent',
|
|
'sibling',
|
|
'index',
|
|
],
|
|
'pathGroups': [
|
|
{
|
|
'pattern': '#root/**',
|
|
'group': 'internal',
|
|
'position': 'before'
|
|
}
|
|
],
|
|
'pathGroupsExcludedImportTypes': ['builtin'],
|
|
'newlines-between': 'never',
|
|
'alphabetize': {
|
|
'order': 'asc',
|
|
'caseInsensitive': true
|
|
}
|
|
}],
|
|
'import/no-unresolved': 'error',
|
|
'import/extensions': ['error', 'always', {
|
|
'ts': 'always',
|
|
'js': 'always'
|
|
}],
|
|
|
|
// General code quality
|
|
'no-console': 'off', // Allowed for game development
|
|
'no-debugger': 'warn',
|
|
'no-unused-vars': 'off', // Use TypeScript version instead
|
|
'prefer-const': 'error',
|
|
'no-var': 'error',
|
|
'object-shorthand': 'error',
|
|
'prefer-template': 'error',
|
|
'prefer-arrow-callback': 'error',
|
|
'arrow-body-style': ['error', 'as-needed'],
|
|
|
|
// Stylistic (handled by Prettier, but some logical ones)
|
|
'curly': ['error', 'all'],
|
|
'brace-style': 'off', // Prettier handles this
|
|
'comma-dangle': 'off', // Prettier handles this
|
|
'quotes': 'off', // Prettier handles this
|
|
'semi': 'off', // Prettier handles this
|
|
|
|
// Best practices
|
|
'eqeqeq': ['error', 'always'],
|
|
'no-eval': 'error',
|
|
'no-implied-eval': 'error',
|
|
'no-new-wrappers': 'error',
|
|
'no-throw-literal': 'error',
|
|
'no-return-await': 'error',
|
|
|
|
// Complexity
|
|
'complexity': ['warn', 10],
|
|
'max-lines': ['warn', { max: 500, skipBlankLines: true, skipComments: true }],
|
|
'max-lines-per-function': ['warn', { max: 100, skipBlankLines: true, skipComments: true }],
|
|
|
|
// Naming conventions
|
|
'@typescript-eslint/naming-convention': [
|
|
'error',
|
|
{
|
|
'selector': 'default',
|
|
'format': ['PascalCase', 'camelCase']
|
|
},
|
|
{
|
|
'selector': 'function',
|
|
'format': ['PascalCase', 'camelCase']
|
|
},
|
|
{
|
|
'selector': 'variable',
|
|
'format': ['camelCase', 'UPPER_CASE', 'PascalCase'],
|
|
'prefix': ['_', 'BP_', 'AC_', 'WBP_', 'UBP_', 'ABP_', 'IMC_', 'IA_', 'DT_', 'BFL_', 'U', 'A', 'T', 'F']
|
|
},
|
|
{
|
|
'selector': 'variable',
|
|
'format': ['camelCase', 'UPPER_CASE', 'PascalCase'],
|
|
'filter': {
|
|
'regex': '^(?!_|BP_|AC_|WBP_|UBP_|ABP_|IA_|DT_|IMC_|BFL_|U[A-Z]|A[A-Z]|T[A-Z]|F[A-Z])',
|
|
'match': true
|
|
}
|
|
},
|
|
// Unreal Engine classes with prefixes
|
|
{
|
|
'selector': 'class',
|
|
'format': ['PascalCase'],
|
|
'prefix': ['_', 'BP_', 'AC_', 'WBP_', 'UBP_', 'ABP_', 'IMC_', 'IA_', 'DT_', 'FT_', 'BFL_', 'U', 'A', 'T', 'F']
|
|
},
|
|
// Regular classes without prefix
|
|
{
|
|
'selector': 'class',
|
|
'format': ['PascalCase'],
|
|
'filter': {
|
|
'regex': '^(?!_|BP_|AC_|WBP_|UBP_|ABP_|IA_|IMC_|BFL_|U[A-Z]|A[A-Z]|T[A-Z]|F[A-Z])',
|
|
'match': true
|
|
}
|
|
},
|
|
// Interfaces and Structs
|
|
{
|
|
'selector': 'interface',
|
|
'format': ['PascalCase'],
|
|
'prefix': ['S_', 'I_', 'I']
|
|
},
|
|
// Enums
|
|
{
|
|
'selector': 'enum',
|
|
'format': ['PascalCase'],
|
|
'prefix': ['E_', 'E']
|
|
},
|
|
{
|
|
'selector': 'enumMember',
|
|
'format': ['PascalCase']
|
|
}
|
|
],
|
|
|
|
'@typescript-eslint/no-unsafe-member-access': 'off'
|
|
},
|
|
settings: {
|
|
'import/resolver': {
|
|
'typescript': {
|
|
'alwaysTryTypes': true,
|
|
'project': './tsconfig.json'
|
|
},
|
|
'node': {
|
|
'extensions': ['.js', '.ts', '.json']
|
|
}
|
|
},
|
|
'import/parsers': {
|
|
'@typescript-eslint/parser': ['.ts', '.tsx']
|
|
}
|
|
},
|
|
env: {
|
|
browser: true,
|
|
es2022: true,
|
|
node: true,
|
|
},
|
|
ignorePatterns: [
|
|
'node_modules/',
|
|
'dist/',
|
|
'build/',
|
|
'**/*.d.ts'
|
|
]
|
|
};
|