arui-presets-lint
Version:
Config files for arui-apps
251 lines (250 loc) • 16.7 kB
JavaScript
import {} from 'eslint';
import { importX } from 'eslint-plugin-import-x';
import simpleImportSortPlugin from 'eslint-plugin-simple-import-sort';
import { GLOBAL_SCRIPTS_SCOPE } from '../constants.js';
export const importsConfig = {
// https://github.com/un-ts/eslint-plugin-import-x/blob/master/src/config/flat/typescript.ts
...importX.flatConfigs.typescript,
name: 'arui-presets-lint/imports',
files: [GLOBAL_SCRIPTS_SCOPE],
plugins: {
'import-x': importX,
'simple-import-sort': simpleImportSortPlugin,
},
settings: {
...importX.flatConfigs.typescript.settings,
// https://github.com/un-ts/eslint-plugin-import-x?tab=readme-ov-file#settings
'import-x/parsers': {
'@typescript-eslint/parser': ['.ts', '.tsx', '.d.ts', '.mts', '.cts', '.mtsx'],
},
'import-x/external-module-folders': ['node_modules', 'node_modules/@types'],
'import-x/resolver': {
typescript: true,
node: {
extensions: [
'.ts',
'.tsx',
'.mtsx',
'.js',
'.jsx',
'.mjsx',
'.json',
'.d.ts',
'.mjs',
'.mts',
'.cjs',
'.cts',
],
},
},
'import-x/core-modules': [],
'import-x/ignore': ['node_modules', String.raw `\.(coffee|scss|css|less|hbs|svg|json)$`],
},
rules: {
...importX.flatConfigs.typescript.rules,
// гарантировать соответствие именованных импортов именованным экспортам
// https://github.com/un-ts/eslint-plugin-import-x/blob/master/docs/rules/named.md
'import-x/named': 'error',
// гарантировать соответствие импорта по умолчанию экспорту по умолчанию
// https://github.com/un-ts/eslint-plugin-import-x/blob/master/docs/rules/default.md
'import-x/default': 'off',
// https://github.com/un-ts/eslint-plugin-import-x/blob/master/docs/rules/namespace.md
'import-x/namespace': 'off',
// запрещать недопустимые экспорты, например несколько экспортов по умолчанию
// https://github.com/un-ts/eslint-plugin-import-x/blob/master/docs/rules/export.md
'import-x/export': 'error',
// запрещать совпадение имени импорта по умолчанию с именованным экспортом
// https://github.com/un-ts/eslint-plugin-import-x/blob/master/docs/rules/no-named-as-default.md
'import-x/no-named-as-default': 'error',
// предупреждать при обращении к свойствам экспорта по умолчанию, которые также являются именованными экспортами
// https://github.com/un-ts/eslint-plugin-import-x/blob/master/docs/rules/no-named-as-default-member.md
'import-x/no-named-as-default-member': 'warn',
// запрещать использование импортов, помеченных в JSDoc как устаревшие
// https://github.com/un-ts/eslint-plugin-import-x/blob/master/docs/rules/no-deprecated.md
'import-x/no-deprecated': 'off',
// Запрещать использование посторонних пакетов
// https://github.com/un-ts/eslint-plugin-import-x/blob/master/docs/rules/no-extraneous-dependencies.md
// пути рассматриваются как абсолютные и относительные к домашней папке проекта
'import-x/no-extraneous-dependencies': [
'error',
{
devDependencies: [
// В тестах - разрешаем импорт из devDependencies
'**/*.{stories,test,tests,spec}.{js,jsx,ts,tsx,mts,cts,mtsx,ctsx,mjsx,cjsx}',
// Для всех файлов на первом уровен вложенности проекта - разрешаем импорт из devDependencies
'*.*',
],
},
],
// Запрещать изменяемые экспорты
// https://github.com/un-ts/eslint-plugin-import-x/blob/master/docs/rules/no-mutable-exports.md
'import-x/no-mutable-exports': 'error',
// запрещать require()
// https://github.com/un-ts/eslint-plugin-import-x/blob/master/docs/rules/no-commonjs.md
'import-x/no-commonjs': 'off',
// запрещать AMD require/define
// https://github.com/un-ts/eslint-plugin-import-x/blob/master/docs/rules/no-amd.md
'import-x/no-amd': 'error',
// запрещать размещение операторов, не являющихся import, перед операторами import
// https://github.com/un-ts/eslint-plugin-import-x/blob/master/docs/rules/first.md
'import-x/first': 'error',
// запрещать дублирующиеся импорты
// https://github.com/un-ts/eslint-plugin-import-x/blob/master/docs/rules/no-duplicates.md
'import-x/no-duplicates': ['error', { 'prefer-inline': true, considerQueryString: true }],
// Обеспечивать единообразное использование расширений файлов в пути импорта
// https://github.com/un-ts/eslint-plugin-import-x/blob/master/docs/rules/extensions.md
'import-x/extensions': 'off',
// Требовать пустую строку после последнего import/require в группе
// https://github.com/un-ts/eslint-plugin-import-x/blob/master/docs/rules/newline-after-import.md
'import-x/newline-after-import': 'error',
// Требовать, чтобы модули с единственным экспортом использовали экспорт по умолчанию
// https://github.com/un-ts/eslint-plugin-import-x/blob/master/docs/rules/prefer-default-export.md
'import-x/prefer-default-export': 'off',
// Ограничивать, какие файлы можно импортировать в заданной папке
// https://github.com/un-ts/eslint-plugin-import-x/blob/master/docs/rules/no-restricted-paths.md
'import-x/no-restricted-paths': 'off',
// Запрещать слишком большое количество зависимостей у модулей
// https://github.com/un-ts/eslint-plugin-import-x/blob/master/docs/rules/max-dependencies.md
'import-x/max-dependencies': ['off', { max: 10 }],
// Запрещать импорт модулей с использованием абсолютных путей
// https://github.com/un-ts/eslint-plugin-import-x/blob/master/docs/rules/no-absolute-path.md
'import-x/no-absolute-path': 'error',
// Запрещать вызовы require() с выражениями
// https://github.com/un-ts/eslint-plugin-import-x/blob/master/docs/rules/no-dynamic-require.md
'import-x/no-dynamic-require': 'error',
// предотвращать импорт вложенных модулей других модулей
// https://github.com/un-ts/eslint-plugin-import-x/blob/master/docs/rules/no-internal-modules.md
'import-x/no-internal-modules': [
'off',
{
allow: [],
},
],
// Предупреждать, если модуль может быть ошибочно разобран потребителем как скрипт
// использующим Unambiguous JavaScript Grammar
// https://github.com/un-ts/eslint-plugin-import-x/blob/master/docs/rules/unambiguous.md
// не следует включать до тех пор, пока это предложение хотя бы не будет представлено TC39.
// На данный момент это не реализовано.
'import-x/unambiguous': 'off',
// Запрещать синтаксис загрузчиков Webpack в импортируемых путях
// https://github.com/un-ts/eslint-plugin-import-x/blob/master/docs/rules/no-webpack-loader-syntax.md
'import-x/no-webpack-loader-syntax': 'error',
// Предотвращать не присвоенные импорты
// https://github.com/un-ts/eslint-plugin-import-x/blob/master/docs/rules/no-unassigned-import.md
// импорт ради побочных эффектов вполне допустим, если они нужны.
'import-x/no-unassigned-import': 'off',
// Предотвращать импорт значения по умолчанию как будто оно именованное
// https://github.com/un-ts/eslint-plugin-import-x/blob/master/docs/rules/no-named-default.md
'import-x/no-named-default': 'error',
// Сообщать, если экспорт по умолчанию у модуля безымянный
// https://github.com/un-ts/eslint-plugin-import-x/blob/master/docs/rules/no-anonymous-default-export.md
'import-x/no-anonymous-default-export': [
'off',
{
allowArray: false,
allowArrowFunction: false,
allowAnonymousClass: false,
allowAnonymousFunction: false,
allowLiteral: false,
allowObject: false,
},
],
// Сообщать, когда именованные экспорты не сгруппированы в одной декларации экспорта
// или когда присутствуют множественные присваивания CommonJS module.exports или объекта exports
// в одном файле.
// https://github.com/un-ts/eslint-plugin-import-x/blob/master/docs/rules/group-exports.md
'import-x/group-exports': 'off',
// Запрещать экспорты по умолчанию
// https://github.com/un-ts/eslint-plugin-import-x/blob/master/docs/rules/no-default-export.md
'import-x/no-default-export': 'off',
// Запрещать именованные экспорты
// https://github.com/un-ts/eslint-plugin-import-x/blob/master/docs/rules/no-named-export.md
'import-x/no-named-export': 'off',
// Запрещать модулю импортировать сам себя
// https://github.com/un-ts/eslint-plugin-import-x/blob/master/docs/rules/no-self-import.md
'import-x/no-self-import': 'error',
// Запрещать циклические зависимости между модулями
// https://github.com/un-ts/eslint-plugin-import-x/blob/master/docs/rules/no-cycle.md
// maxDepth ограничивает глубину обхода графа импортов (без лимита правило сильно замедляет линтинг на больших проектах)
'import-x/no-cycle': ['error', { ignoreExternal: true, maxDepth: 20 }],
// Гарантировать отсутствие бесполезных сегментов пути
// https://github.com/un-ts/eslint-plugin-import-x/blob/master/docs/rules/no-useless-path-segments.md
'import-x/no-useless-path-segments': ['error', { noUselessIndex: true }],
// для динамических импортов требуется начальный комментарий с webpackChunkName
// https://github.com/un-ts/eslint-plugin-import-x/blob/master/docs/rules/dynamic-import-chunkname.md
'import-x/dynamic-import-chunkname': [
'off',
{
importFunctions: [],
webpackChunknameFormat: '[0-9a-zA-Z-_/.]+',
},
],
// Используйте это правило, чтобы предотвратить импорты в каталоги на относительных родительских путях.
// https://github.com/un-ts/eslint-plugin-import-x/blob/master/docs/rules/no-relative-parent-imports.md
'import-x/no-relative-parent-imports': 'off',
// Используйте это правило, чтобы предотвратить импорт пакетов через относительные пути.
// https://github.com/un-ts/eslint-plugin-import-x/blob/master/docs/rules/no-relative-packages.md
'import-x/no-relative-packages': 'error',
// Обеспечивает единообразный стиль написания импорта типов в typescript
// https://github.com/un-ts/eslint-plugin-import-x/blob/master/docs/rules/consistent-type-specifier-style.md
'import-x/consistent-type-specifier-style': ['error', 'prefer-inline'],
// Запрет смешивания CommonJS и ESM в одном файле
// https://github.com/un-ts/eslint-plugin-import-x/blob/master/docs/rules/no-import-module-exports.md
'import-x/no-import-module-exports': 'off',
// Правила сортировки импортов
// https://github.com/lydell/eslint-plugin-simple-import-sort/blob/main/README.md
'simple-import-sort/imports': [
'warn',
{
groups: [
[
'^(assert|buffer|child_process|cluster|console|constants|crypto|dgram|dns|domain|events|fs|http|https|module|net|os|path|punycode|querystring|readline|repl|stream|string_decoder|sys|timers|tls|tty|url|util|vm|zlib|freelist|v8|process|async_hooks|http2|perf_hooks)(/.*|$)',
],
['^react', '^redux', String.raw `^@?\w`],
['@alfalab/*', '^arui-(feather|private)(/?.*|$)'],
['^#'],
[String.raw `^\.\.(?!/?$)`, String.raw `^\.\./?$`],
[String.raw `^\./(?=.*/)(?!/?$)`, String.raw `^\.(?!/?$)`, String.raw `^\./?$`],
[String.raw `^.+\.s?css$`],
],
},
],
// Список запрещенных импортов
// https://eslint.org/docs/latest/rules/no-restricted-imports
'no-restricted-imports': [
'error',
{
paths: [
{
name: 'lodash',
message: 'Import specific parts of "lodash" explicitly, for example: `import isEqual from "lodash/isEqual"`. This will help ensure greater consistency in builds and make it easier to align versions across projects',
},
],
patterns: [
{
group: ['lodash.*'],
message: 'Import specific parts of "lodash" explicitly, for example: `import isEqual from "lodash/isEqual"`. This will help ensure greater consistency in builds and make it easier to align versions across projects',
},
],
},
],
// Запрещает указанные имена при экспорте
// https://eslint.org/docs/rules/no-restricted-exports
'no-restricted-exports': [
'error',
{
restrictedNamedExports: [
'default', // use `export default` to provide a default export
'then', // this will cause tons of confusion when your module is dynamically `import()`ed, and will break in most node ESM versions
],
},
],
// Запрещает импорт с одного и того же пути более одного раза
// https://eslint.org/docs/rules/no-duplicate-imports
// Заменено правилом https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-duplicates.md
'no-duplicate-imports': 'off',
// Сортировка импортов
// https://eslint.org/docs/rules/sort-imports
'sort-imports': 'off',
},
};