ESLint Plugin
Плагин проверяет структуру проекта и цепочки импортов FEOD прямо в редакторе.
Предупреждение!
Плагин пока не опубликован в npm. Документация описывает будущую структуру пакета и будет актуальна после релиза.
Что проверяет
- соблюдение уровней (common → modules → pages → app)
- запрет обратных импортов
- ограничение доступа к внутренним модулям
Установка
pnpm add -D @feod/eslint-structure-pluginБыстрый старт (Flat config, ESM)
// eslint.config.js
import feodStructure from "@feod/eslint-structure-plugin";
export default [
{
plugins: {
"feod-structure": feodStructure,
},
...feodStructure.configs.recommended,
},
];Правила
feod-structure/layer-imports— цепочка импортов FEOD + публичный API модулей/подмодулей.feod-structure/no-common-index— запретcommon/**/index.*и их импорта.feod-structure/no-common-deep— ограничение глубины вложенности вcommon.feod-structure/no-zigzag-imports— запрет «зигзага» относительных импортов между модулями.feod-structure/no-unknown-files— запрет файлов вне известных уровней FEOD.feod-structure/visibility-levels— лимиты глубины импортов для уровней (default/transparent/open).feod-structure/no-submodule-of-submodule— запрет импорта вложенных подмодулей.feod-structure/pages-private-modules— ограничение доступа к приватным модулям страниц (_page).
Пресеты
configs.recommended— базовый набор правил.configs.strict— включает все проверки, включаяvisibility-levels.
Опции
Большинство правил принимает следующие опции. Все пути считаются относительно rootDir, если не указано иное:
rootDir— корень проекта для расчёта абсолютных путей. В flat‑config на ESM используйтеnew URL(".", import.meta.url).pathname.srcRoot— имя корневой папки исходников (по умолчаниюsrc). Если у вас структураsource/илиapp/, укажите её здесь.layerDirs— переопределение имён слоёв относительноsrcRoot, например:{ pages: "screens", modules: "features" }. Это влияет на все проверки слоёв.aliasPrefix— префикс алиаса (по умолчанию@). Используется для резолва импортов вида@/pages/....aliasRoot— корень алиаса (по умолчанию равенsrcRoot). Например, если алиас указывает наsource/, задайтеaliasRoot: "source".layerAliases— алиасы слоёв (по умолчанию@app,@pages,@modules,@common,@global). Нужны, если вы используете кастомные алиасы слоёв.transitModules— список модулей, которые считаются сквозными (modules/<name>/*без папкиmodules/). Для них разрешены прямые подмодули, но приватное ядроmodules/<name>/_/доступно только этим подмодулям.singleFileModules— включает поддержку однофайловых модулей (modules/foo.ts). По умолчанию выключено, чтобы не ломать существующие правила.modulePages— включает поддержку страниц в модулях (modules/<name>/pages). Такие страницы подчиняются правиламpages, но могут импортироваться изmodules/<name>/index.*для передачи вapp.ignore— glob или список glob‑паттернов для исключений. Удобно для автогенерируемых файлов и сборочных артефактов.
Пример с настройками (Flat config, ESM):
import feodStructure from "@feod/eslint-structure-plugin";
export default [
{
plugins: {
"feod-structure": feodStructure,
},
rules: {
"feod-structure/layer-imports": [
"error",
{
rootDir: new URL(".", import.meta.url).pathname,
srcRoot: "source",
aliasPrefix: "@",
aliasRoot: "source",
ignore: ["source/**/__generated__/**"],
},
],
"feod-structure/no-common-deep": ["error", { maxDepth: 1 }],
},
},
];Приватные модули страниц
Приватный модуль страницы — папка с префиксом _ внутри pages. Правило pages-private-modules запрещает импорт таких модулей вне их области.
/pages/_homeдоступен только из/pages/home.*./pages/profile/_profileдоступен из любых файлов в/pages/profile/**.
Пример:
// pages/home.vue
import { useHome } from "./_home";
// pages/profile/index.vue
import { ProfileHeader } from "./_profile";Сквозные модули
Сквозные модули размещают подмодули напрямую в modules/<name>/ без папки modules/. Укажите их в transitModules:
// eslint.config.js
const feodStructure = require("@feod/eslint-structure-plugin");
module.exports = [
{
plugins: { "feod-structure": feodStructure },
rules: {
"feod-structure/layer-imports": [
"error",
{ rootDir: __dirname, transitModules: ["package-manager"] },
],
},
},
];Правило ограничивает импорты приватного ядра (modules/<name>/_/) только для подмодулей этого сквозного модуля и требует публичный API модуля для подмодулей.
Однофайловые модули
Однофайловый модуль лежит напрямую в modules/ (например, modules/logger.ts). Включите поддержку через singleFileModules:
// eslint.config.js
const feodStructure = require("@feod/eslint-structure-plugin");
module.exports = [
{
plugins: { "feod-structure": feodStructure },
rules: {
"feod-structure/layer-imports": [
"error",
{ rootDir: __dirname, singleFileModules: true },
],
},
},
];Страницы внутри модулей
При modulePages: true страницы в modules/<name>/pages подчиняются тем же правилам, что и обычные pages, но их можно импортировать в index.* своего модуля для передачи в app.
const feodStructure = require("@feod/eslint-structure-plugin");
module.exports = [
{
plugins: { "feod-structure": feodStructure },
rules: {
"feod-structure/layer-imports": [
"error",
{ rootDir: __dirname, modulePages: true },
],
},
},
];Поддержка резолвера
Плагин учитывает import/resolver в настройках ESLint (например, eslint-import-resolver-node, typescript).