deslop/re-export-cycle

Disallow import cycles formed by re-export statements (export * / export { } from).

  • Category: Dead Code
  • Severity: warn
  • Source: deslop-js
  • Framework: global
  • Enabled when: react-doctor deadCode analysis enabled (default true); whole-project scan only — skipped in --diff/--staged modes
  • Documentation: https://github.com/millionco/deslop-js

Validation prompt

Use this to decide whether a fired diagnostic is real or a false positive.

Fires when deslop's detectReExportCycles finds a strongly-connected component in the re-export-only edge graph: kind self-loop reports a single file whose reason is that it 're-exports from itself — the barrel imports its own root, which breaks bundler tree-shaking and risks TDZ runtime errors', while kind multi-node reports a ring whose reason is 'N modules form a re-export cycle — refactor consumers to import from the leaf module instead of the barrel'; both arrive at confidence high. False positive to suppress: the entire ring is type-only re-exports (export type { } from / export type *), since deslop builds the cycle edge without checking isTypeOnly but bundlers erase type re-exports at compile time, so there is no runtime initialization order or TDZ hazard — suppress when every link in the reported files is a type re-export.

Fix prompt

Use this once validation confirms the diagnostic is real.

Break the cycle by re-pointing consumers at the leaf module instead of routing through the barrel: for a self-loop, delete the barrel's re-export of its own path (e.g. remove export * from './index' inside index.ts) so it only re-exports its real submodules; for a multi-node ring, find the file that both produces and re-imports a symbol and have it import directly from the defining leaf file (import { foo } from './foo') rather than from the barrel that re-exports back to it, leaving the barrel as a one-directional aggregation. If the ring is genuinely type-only, convert the offending statements to export type { ... } from so the edge is compiled away. See https://github.com/millionco/deslop-js