Beta Документация для beta‑теста, возможны ошибки и неточности.
Перейти к содержимому

ESLint Plugin

Плагин проверяет структуру проекта и цепочки импортов FEOD прямо в редакторе.

Предупреждение!

Плагин пока не опубликован в npm. Документация описывает будущую структуру пакета и будет актуальна после релиза.

Что проверяет

  • соблюдение уровней (common → modules → pages → app)
  • запрет обратных импортов
  • ограничение доступа к внутренним модулям

Установка

bash
pnpm add -D @feod/eslint-structure-plugin

Быстрый старт (Flat config, ESM)

js
// 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):

js
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/**.

Пример:

ts
// pages/home.vue
import { useHome } from "./_home";

// pages/profile/index.vue
import { ProfileHeader } from "./_profile";

Сквозные модули

Сквозные модули размещают подмодули напрямую в modules/<name>/ без папки modules/. Укажите их в transitModules:

js
// 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:

js
// 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.

js
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).