Derived Modular Arch
Инструменты

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-featureFeature импортирует другой feature
@derived-modular/public-apiМежмодульный импорт мимо */public/*
@derived-modular/no-barrelBarrel 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 не покрывает

ConcernESLintdma 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.

Что дальше

On this page