arui-presets-lint
Version:
Config files for arui-apps
227 lines (226 loc) • 14.4 kB
JavaScript
import {} from '@typescript-eslint/utils';
import {} from 'eslint';
import globals from 'globals';
import tseslint from 'typescript-eslint';
import { TYPESCRIPT_SCRIPTS_SCOPE } from '../constants.js';
import { bestPracticesConfig } from './best-practices.js';
import { importsConfig } from './imports.js';
import { variablesConfig } from './variables.js';
const bestPracticesRules = bestPracticesConfig.rules;
const importsRules = importsConfig.rules;
const variablesRules = variablesConfig.rules;
export const typescriptConfig = {
name: 'arui-presets-lint/typescript',
files: [TYPESCRIPT_SCRIPTS_SCOPE],
languageOptions: {
parser: tseslint.parser,
ecmaVersion: 'latest',
sourceType: 'module',
parserOptions: {
projectService: true,
ecmaFeatures: { jsx: true },
},
globals: {
...globals.es2026,
...globals.browser,
...globals.node,
},
},
plugins: {
'@typescript-eslint': tseslint.plugin,
},
rules: {
// https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/src/configs/eslintrc/recommended-type-checked.ts
...tseslint.configs.recommendedTypeChecked.reduce((acc, obj) => ({
...acc,
...obj?.rules,
}), {}),
// Требовать явного указания типов возвращаемых данных и аргументов для методов публичных классов экспортируемых функций и классов
// https://typescript-eslint.io/rules/explicit-module-boundary-types
'@typescript-eslint/explicit-module-boundary-types': 'off',
// Требовать явно определенного возвращаемового типа для функций и методов класса
// https://typescript-eslint.io/rules/explicit-function-return-type
'@typescript-eslint/explicit-function-return-type': 'off',
// Требует использования либо T[], либо Array<T> для массивов
// https://typescript-eslint.io/rules/array-type
'@typescript-eslint/array-type': [
'error',
{ default: 'array-simple', readonly: 'array-simple' },
],
// Обеспечивает консистентное написание определения типов
// https://typescript-eslint.io/rules/consistent-type-assertions
'@typescript-eslint/consistent-type-assertions': 'error',
// Обеспечивает консистентное использование импорта типов
// https://typescript-eslint.io/rules/consistent-type-imports
'@typescript-eslint/consistent-type-imports': [
'error',
{ prefer: 'type-imports', fixStyle: 'inline-type-imports' },
],
// Обеспечивает консистентное использование экспорта типов
// https://typescript-eslint.io/rules/consistent-type-exports
'@typescript-eslint/consistent-type-exports': [
'error',
{ fixMixedExportsWithInlineTypeSpecifier: true },
],
// Определяет правила именования
// https://typescript-eslint.io/rules/naming-convention
'@typescript-eslint/naming-convention': [
'error',
{ selector: 'variable', format: ['camelCase', 'PascalCase', 'UPPER_CASE'] },
{ selector: 'function', format: ['camelCase', 'PascalCase'] },
{ selector: 'typeLike', format: ['PascalCase'] },
],
// Запрещает вызов require()
// https://typescript-eslint.io/rules/no-require-imports
'@typescript-eslint/no-require-imports': 'off',
// Гарантировать соответствие именованных импортов именованным экспортам
// Отключено, так как компилятор TypeScript это умеет делать
// https://github.com/un-ts/eslint-plugin-import-x/blob/master/docs/rules/named.md
'import-x/named': 'off',
// Запрет передачи в функцию переменной с типом any
// https://typescript-eslint.io/rules/no-unsafe-argument
'@typescript-eslint/no-unsafe-argument': 'off',
/*
Переопределяем extension rules
https://typescript-eslint.io/rules/#extension-rules
*/
// Требует использование "this" в методах классов
// https://eslint.org/docs/rules/class-methods-use-this
'class-methods-use-this': 'off',
// https://typescript-eslint.io/rules/class-methods-use-this
'@typescript-eslint/class-methods-use-this': bestPracticesRules['class-methods-use-this'],
// Запрещает неиспользуемые выражения
// https://eslint.org/docs/rules/no-unused-expressions
'no-unused-expressions': 'off',
// https://typescript-eslint.io/rules/no-unused-expressions
'@typescript-eslint/no-unused-expressions': bestPracticesRules['no-unused-expressions'],
// Требует `await` в `async function` (не рекомендуется к использованию)
// https://typescript-eslint.io/rules/require-await
'@typescript-eslint/require-await': 'off',
// Запрещает ненужный конструктор
// https://eslint.org/docs/rules/no-useless-constructor
'no-useless-constructor': 'off',
// https://typescript-eslint.io/rules/no-useless-constructor
'@typescript-eslint/no-useless-constructor': bestPracticesRules['no-useless-constructor'],
// Запрещает eval()-подобные методы
// https://eslint.org/docs/rules/no-implied-eval
'no-implied-eval': 'error',
// https://typescript-eslint.io/rules/no-implied-eval/
'@typescript-eslint/no-implied-eval': bestPracticesRules['no-implied-eval'],
// Запрещает создание функций внутри циклов
// https://eslint.org/docs/rules/no-loop-func
'no-loop-func': 'off',
// https://typescript-eslint.io/rules/no-loop-func
'@typescript-eslint/no-loop-func': bestPracticesRules['no-loop-func'],
// Запрещает «магические» числа
// https://eslint.org/docs/rules/no-magic-numbers
'no-magic-numbers': 'off',
// https://typescript-eslint.io/rules/no-magic-numbers
'@typescript-eslint/no-magic-numbers': bestPracticesRules['no-magic-numbers'],
// Поощряет использование точечной нотации, когда возможно
// https://eslint.org/docs/rules/dot-notation
'dot-notation': 'off',
// https://typescript-eslint.io/rules/dot-notation
'@typescript-eslint/dot-notation': bestPracticesRules['dot-notation'],
// Запрещает дублирование членов класса
// https://eslint.org/docs/rules/no-dupe-class-members
// Отключено, так как уже проверяется компилятором TypeScript
// https://typescript-eslint.io/rules/no-dupe-class-members
'no-dupe-class-members': 'off',
// Запрещает повторное объявление одной и той же переменной
// https://eslint.org/docs/latest/rules/no-redeclare#rule-details
// Отключено, так как уже проверяется компилятором TypeScript
// https://typescript-eslint.io/rules/no-redeclare
'no-redeclare': 'off',
// Запрещает пустые функции, кроме автономных/стрелочных
// https://eslint.org/docs/rules/no-empty-function
'no-empty-function': 'off',
// https://typescript-eslint.io/rules/no-empty-function
'@typescript-eslint/no-empty-function': bestPracticesRules['no-empty-function'],
// Требует, чтобы оператор return всегда/никогда возвращал значение
// https://eslint.org/docs/rules/consistent-return
// Отключено для ts, используйте вместо этого опцию noImplicitReturns в tsconfig.json
// https://typescript-eslint.io/rules/consistent-return
'consistent-return': 'off',
// Требует чтобы дефолтные параметры функций были в конце
// https://eslint.org/docs/rules/default-param-last
'default-param-last': 'off',
'@typescript-eslint/default-param-last': bestPracticesRules['default-param-last'],
// Запрещает дублирование значений в enum
// https://typescript-eslint.io/rules/no-duplicate-enum-values
'@typescript-eslint/no-duplicate-enum-values': 'error',
// Требует использования optional chaining вместо цепочек условий
// https://typescript-eslint.io/rules/prefer-optional-chain
'@typescript-eslint/prefer-optional-chain': 'error',
// Требует/запрещает инициализацию переменных при объявлении
// https://eslint.org/docs/rules/init-declarations
'init-declarations': 'off',
// https://typescript-eslint.io/rules/init-declarations
'@typescript-eslint/init-declarations': variablesRules['init-declarations'],
// Лимит на количество параметров в объявлении функции
// https://eslint.org/docs/rules/max-params
'max-params': 'off',
// https://typescript-eslint.io/rules/max-params
'@typescript-eslint/max-params': bestPracticesRules['max-params'],
// Запрещает конструктор Array
// https://eslint.org/docs/rules/no-array-constructor
'no-array-constructor': 'off',
// https://typescript-eslint.io/rules/no-array-constructor
'@typescript-eslint/no-array-constructor': bestPracticesRules['no-array-constructor'],
// Запрещает this вне классов или похожих объектов
// https://eslint.org/docs/rules/no-invalid-this
// Отключено, так как уже проверяется компилятором TypeScript в stict-режиме
// https://typescript-eslint.io/rules/no-redeclare
'no-invalid-this': 'off',
// Запрещает указанные имена при экспорте
// https://eslint.org/docs/rules/no-restricted-exports
'no-restricted-imports': 'off',
// https://typescript-eslint.io/rules/no-restricted-imports
'@typescript-eslint/no-restricted-imports': importsRules['no-restricted-imports'],
// Запрещает объявление переменных, уже объявленных во внешней области
// https://eslint.org/docs/latest/rules/no-shadow
'no-shadow': 'off',
// https://typescript-eslint.io/rules/no-shadow
'@typescript-eslint/no-shadow': variablesRules['no-shadow'],
// Запрещает объявление неиспользуемых переменных
// https://eslint.org/docs/rules/no-unused-vars
'no-unused-vars': 'off',
// https://typescript-eslint.io/rules/no-unused-vars
'@typescript-eslint/no-unused-vars': variablesRules['no-unused-vars'],
// Запрещает использование переменных до их объявления
// https://eslint.org/docs/rules/no-use-before-define
'no-use-before-define': 'off',
// https://typescript-eslint.io/rules/no-use-before-define
'@typescript-eslint/no-use-before-define': variablesRules['no-use-before-define'],
// Запрещает вызов объектов, не относящихся к Error через throw
// https://eslint.org/docs/latest/rules/no-throw-literal
'no-throw-literal': 'off',
// https://typescript-eslint.io/rules/only-throw-error
'@typescript-eslint/only-throw-error': 'error',
// Предпочитать деструктуризацию массивов и объектов
// https://eslint.org/docs/rules/prefer-destructuring
'prefer-destructuring': 'off',
// https://typescript-eslint.io/rules/prefer-destructuring/
'@typescript-eslint/prefer-destructuring': bestPracticesRules['prefer-destructuring'],
// Требует использовать объекты Error как причины отклонения Promise
// https://eslint.org/docs/rules/prefer-promise-reject-errors
'prefer-promise-reject-errors': 'off',
// https://typescript-eslint.io/rules/prefer-promise-reject-errors
'@typescript-eslint/prefer-promise-reject-errors': bestPracticesRules['prefer-promise-reject-errors'],
/*
Конец extension rules
*/
// Запрет возврата any из функций
// https://typescript-eslint.io/rules/no-unsafe-return/
'@typescript-eslint/no-unsafe-return': 'off',
// Запрет обращения к значениям с типом any
// https://typescript-eslint.io/rules/no-unsafe-member-access/
'@typescript-eslint/no-unsafe-member-access': 'off',
// Предотвращает использование промисов в местах, где этого делать не нужно
// https://typescript-eslint.io/rules/no-misused-promises/
'@typescript-eslint/no-misused-promises': ['error', { checksVoidReturn: false }],
// Принуждает правильно обрабатывать Promise-like операторы
// https://typescript-eslint.io/rules/no-floating-promises/
'@typescript-eslint/no-floating-promises': ['error', { ignoreIIFE: true }],
},
};