feod-structure/no-submodule-of-submodule
Доступ к глубоким подмодулям только владельцу и непосредственным parent/child.
Включено как error в recommended и strict. Autofix отсутствует. Поддерживается ESLint и Oxlint.
Зачем нужно
Сохраняет локальность глубокой иерархии: публичный index глубокого подмодуля не делает его доступным из любого места проекта.
Что проверяет
Обычные подмодули распознаются по Parent/modules/Child/modules/Leaf. Для цели глубже первого подмодуля (depth > 1) импорт разрешён только её владельцу, непосредственному родителю или непосредственному ребёнку. Сосед, посторонний модуль и предок через несколько уровней не получают доступ.
Примеры
Leaf находится на глубине 2. Ему не запрещено существовать: правило ограничивает, кто может обращаться к нему напрямую.
Ошибка
// src/modules/Other/index.ts
import { leaf } from '../Parent/modules/Child/modules/Leaf';
// src/modules/Parent/index.ts
import { leaf } from './modules/Child/modules/Leaf'; // пропущен уровень ChildКорректно
// src/modules/Parent/modules/Child/index.ts
import { leaf } from './modules/Leaf'; // непосредственный родитель
// src/modules/Parent/modules/Child/modules/Leaf/view.ts
import { state } from './state'; // собственный владелецНастройка
createConfig({ layerDirs: { modules: 'features' } });Отдельного числового лимита у правила нет. Прямые options принимают группы пути, алиасы, layerDirs: { modules: '…' }. Вложенный разделитель modules остаётся соглашением распознавателя; переименование верхнего слоя не меняет его.
Связанные ограничения
Правило входит и в recommended, и в strict. Оно не запрещает создавать глубокие подмодули — ограничивает доступ к ним. Политики parentImports, childImportsParent и visibility задаются в layer-imports. Разрешение непосредственного parent/child здесь не отменяет проверки публичного API там. Если архитектура намеренно открывает глубокие модули наружу, это правило можно отключить отдельно.