Настройка ESLint
@o-feod/eslint-structure-plugin подключает проверки FEOD к ESLint Flat config. Общий каталог правил также применим к Oxlint.
Установка
pnpm add -D eslint @o-feod/eslint-structure-pluginПримеры с createConfig и configFromProject требуют версии с этими экспортами. Для 0.1.0 используйте статический пресет и опции правил из следующего примера.
Быстрый старт
// eslint.config.mjs
import feod from '@o-feod/eslint-structure-plugin';
export default [{
...feod.configs.recommended,
plugins: { 'feod-structure': feod },
files: ['src/**/*.{js,mjs,cjs}'],
}];pnpm exec eslint srcЗапускайте команду из корня проекта. Статический пресет не читает конфигурацию FEOD с диска. strict подключается аналогично через feod.configs.strict. Его отличие — visibility-levels; ограничения начнут действовать после задания levels.
Общая конфигурация проекта
Создайте feod.config.json или секцию feod в package.json — один из источников:
{
"$schema": "https://feod.dev/feod.schema.json",
"rootDefault": {
"layerDirs": { "global": "globals" },
"modules": { "requirePublicEntry": true }
},
"roots": { "src": {} }
}// eslint.config.mjs
import { fileURLToPath } from 'node:url';
import { configFromProject } from '@o-feod/eslint-structure-plugin';
export default [{
...configFromProject({
rootDir: fileURLToPath(new URL('.', import.meta.url)),
preset: 'strict',
}),
files: ['src/**/*.{js,mjs,cjs}'],
}];configFromProject регистрирует плагин, загружает настройки и строит правила для всех корней. Для workspace указывайте rootDir пакета явно. Если корней несколько, добавьте их в files. Исходник вне всех FEOD-корней не проверяется архитектурными правилами.
Для настроек прямо в JS используйте createConfig(config, options) вместо configFromProject. Эта функция проверяет объект и не читает файлы:
import { createConfig } from '@o-feod/eslint-structure-plugin';
export default [createConfig({
common: { maxDepth: 2 },
singleFileModules: true,
})];Все поля, правила наследования и несколько корней описаны в конфигурации.
TypeScript
FEOD не поставляет парсер. Добавьте парсер TypeScript к тому же набору файлов:
pnpm add -D @typescript-eslint/parser// eslint.config.mjs
import tsParser from '@typescript-eslint/parser';
import { configFromProject } from '@o-feod/eslint-structure-plugin';
export default [{
...configFromProject(),
files: ['src/**/*.{ts,tsx,mts,cts}'],
languageOptions: {
parser: tsParser,
parserOptions: { ecmaFeatures: { jsx: true } },
},
}];Для проверок деклараций включите также нужные .d.ts, .d.mts, .d.cts: они попадают в приведённые маски. Само расширение .d.ts не превращает обычный импорт в import type.
Vue SFC
Для .vue внешним парсером должен быть vue-eslint-parser, а парсер TypeScript передаётся в его parserOptions.parser:
pnpm add -D vue-eslint-parser @typescript-eslint/parser// eslint.config.mjs
import vueParser from 'vue-eslint-parser';
import tsParser from '@typescript-eslint/parser';
import { configFromProject } from '@o-feod/eslint-structure-plugin';
export default [{
...configFromProject(),
files: ['src/**/*.vue'],
languageOptions: {
parser: vueParser,
parserOptions: {
parser: tsParser,
ecmaVersion: 'latest',
sourceType: 'module',
},
},
}];Это конфигурация для Vue-файлов; для отдельных .ts добавьте блок из предыдущего примера. FEOD проверяет зависимости в <script> и <script setup>. Проверки шаблонов подключайте через eslint-plugin-vue.
Алиасы и резолвер
Встроенный резолвер понимает @/…, алиасы слоёв и относительные пути. Для иных алиасов задайте layerAliases в конфигурации FEOD:
{ "rootDefault": { "layerAliases": { "#features": "src/modules" } } }Также поддерживается settings['import/resolver'], например с установленным eslint-import-resolver-typescript:
settings: {
'import/resolver': { typescript: { project: './tsconfig.json' } },
}Этот фрагмент добавляется в ESLint config рядом с rules и languageOptions. Совпадение алиасов сборщика, TypeScript и линтера настраивается проектом.
Severity и отключение правил
Сохраняйте сгенерированные options при замене error на warn:
import { configFromProject } from '@o-feod/eslint-structure-plugin';
const config = configFromProject();
const [, options] = config.rules['feod-structure/layer-imports'];
config.rules['feod-structure/layer-imports'] = ['warn', options];
config.rules['feod-structure/no-common-deep'] = 'off';
export default [config];Замена всей записи на 'warn' теряет пути, политики и настройки корней. Отключение можно ограничить отдельным files-блоком Flat config; особенности проверок, которые сканируют файловую систему, разобраны в миграции.
Подключение одного правила
Для ручного подключения регистрируйте плагин и передавайте только options, поддерживаемые выбранным правилом:
import feod from '@o-feod/eslint-structure-plugin';
export default [{
plugins: { 'feod-structure': feod },
files: ['src/**/*.{js,mjs,cjs}'],
rules: {
'feod-structure/layer-imports': ['error', {
srcRoot: 'src',
layerAliases: { '#features': 'src/modules' },
}],
},
}];Точные параметры приведены на страницах правил. Проектная запись modules.publicEntries и прямая опция правила publicEntries — разные уровни конфигурации; не переносите весь объект FEOD внутрь options одного правила.