feod-structure/no-file-cycles
Циклы зависимостей между файлами.
Выключено в recommended и strict. Включается настройками проекта. Autofix отсутствует. Поддерживается ESLint и Oxlint.
Зачем нужно
Находит циклические зависимости между исходными файлами всех известных слоёв, в том числе внутри одного модуля.
Примеры
Ошибка
// src/modules/User/a.ts
import { b } from './b';
export const a = () => b();
// src/modules/User/b.ts
import { a } from './a';
export const b = () => a();Корректно
// src/modules/User/a.ts
import { b } from './b';
export const a = () => b();
// src/modules/User/b.ts
export const b = () => 'user';Разрыв файлового цикла
// src/modules/User/b.ts
import { a } from './a';
export const b = () => a();
export const b = () => 'user'; Уберите обратную зависимость либо вынесите общую часть в третий файл, который не импортирует потребителей.
Настройка
createConfig({ cycles: { files: true } });| Поле проекта | Прямая опция | По умолчанию |
|---|---|---|
cycles.files | enabled | false в проектном конфиге |
singleFileModules | singleFileModules | false |
transitModules | transitModules | [] |
При ручном включении правила enabled по умолчанию не отключает анализ. Прямые options также принимают группы пути, алиасы, layers, layerDirs.
Ограничения и отличие от модульного графа
Учитываются value-зависимости; явные type-only рёбра пропускаются. cycles.types: 'include' относится только к no-module-cycles и не меняет файловый граф.
Граф строится по исходникам на диске с offline-резолвером в пределах выбранного корня. Рёбра, которые невозможно статически извлечь или разрешить, могут быть пропущены. При необходимости отдельно запрещайте computed/unresolved импорты в layer-imports. Циклическая компонента сообщается один раз за прогон и может быть привязана к посещённому файлу, который запустил анализ.