ESLint
Плагин @derived-modular/eslint-plugin — четыре архитектурных правила в редакторе.
@derived-modular/eslint-plugin даёт быструю обратную связь прямо в редакторе: неправильный импорт подсвечивается при сохранении, без ожидания CI.
Это не замена dma check. Плагин смотрит на один файл за раз и не видит циклы в графе. В CI всё равно нужен CLI.
Установка
npm install -D @derived-modular/eslint-plugin eslintНужен ESLint 9+ с плоской конфигурацией.
Минимальная настройка
// eslint.config.js
import dma from "@derived-modular/eslint-plugin";
export default [
...dma.configs.recommended,
{
settings: {
dma: {
srcRoot: "src",
compositionRoots: ["app", "pages", "routes"],
},
},
},
];Пресет recommended включает все четыре правила с уровнем error.
Правила
| Правило | Что ловит |
|---|---|
@derived-modular/layer-direction | Импорт не вниз по слоям |
@derived-modular/feature-to-feature | Feature импортирует другой feature |
@derived-modular/public-api | Межмодульный импорт мимо */public/* |
@derived-modular/no-barrel | Barrel index с реэкспортами внутри модуля |
Настройки settings.dma
| Ключ | По умолчанию | Описание |
|---|---|---|
srcRoot | "src" | Корень исходников |
compositionRoots | ["app", "pages", "routes"] | Папки корень композиции |
Если не заданы, плагин читает srcRoot / compositionRoots из dma.config.* (поиск вверх). Precedence: settings.dma > конфиг > defaults.
Плагин разрешает относительные импорты и @/ → srcRoot. Сложные алиасы из tsconfig, которые ESLint сам не резолвит, могут потребовать дополнительной настройки хоста. Импорты npm-пакетов игнорируются.
@derived-modular/no-barrel умеет autofix импортов в barrel с одним re-export target (переписать на public path).
pages/ и routes/ обрабатываются как app/ — для Next.js App Router, Astro, TanStack Router, SvelteKit.
Что ESLint не покрывает
| Concern | ESLint | dma check |
|---|---|---|
no-cycle | — | ✓ |
feature-has-inbound | — | ✓ |
service-no-inbound | — | ✓ |
dma doctor сигналы | — | ✓ |
Если ESLint молчит, а dma check падает — это нормально. Запускайте оба.
Oxlint
Те же правила доступны через @derived-modular/oxlint-plugin — JS-плагины для Oxlint. Статус alpha.
Biome
Если в проекте Biome вместо ESLint — см. Biome. Покрытие слабее (GritQL-эвристики), но dma check в CI обязателен в любом случае.
Пример из репозитория
Живой конфиг — examples/next-app/eslint.config.js.