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

feod-structure/no-file-cycles ​

Циклы зависимостей между файлами.

Выключено в recommended и strict. Включается настройками проекта. Autofix отсутствует. Поддерживается ESLint и Oxlint.

Зачем нужно ​

Находит циклические зависимости между исходными файлами всех известных слоёв, в том числе внутри одного модуля.

Примеры ​

Ошибка ​

ts
// 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();

Корректно ​

ts
// src/modules/User/a.ts
import { b } from './b'; 
export const a = () => b();

// src/modules/User/b.ts
export const b = () => 'user';

Разрыв файлового цикла ​

ts
// src/modules/User/b.ts
import { a } from './a'; 
export const b = () => a(); 
export const b = () => 'user'; 

Уберите обратную зависимость либо вынесите общую часть в третий файл, который не импортирует потребителей.

Настройка ​

js
createConfig({ cycles: { files: true } });
Поле проектаПрямая опцияПо умолчанию
cycles.filesenabledfalse в проектном конфиге
singleFileModulessingleFileModulesfalse
transitModulestransitModules[]

При ручном включении правила enabled по умолчанию не отключает анализ. Прямые options также принимают группы пути, алиасы, layers, layerDirs.

Ограничения и отличие от модульного графа ​

Учитываются value-зависимости; явные type-only рёбра пропускаются. cycles.types: 'include' относится только к no-module-cycles и не меняет файловый граф.

Граф строится по исходникам на диске с offline-резолвером в пределах выбранного корня. Рёбра, которые невозможно статически извлечь или разрешить, могут быть пропущены. При необходимости отдельно запрещайте computed/unresolved импорты в layer-imports. Циклическая компонента сообщается один раз за прогон и может быть привязана к посещённому файлу, который запустил анализ.

Реализация ​

Исходный код · Тесты · Все правила