dep-radius

What radius cannot see

Every blind spot, in plain words, and what to do about it. Honesty beats a green checkmark.

Reading names in code gets you far, but not everywhere. When radius can't see how a package is used, it says so, and the update goes to review instead of quiet. In the brief, these show up under "cannot see how you use these", and in JSON under usage.cannotSee.

Used in ways names can't show

KindIn plain wordsTypical example
script-binrun from scripts in package.json"lint": "eslint ."
config-referencenamed in a config filea plugin listed in .babelrc
side-effect-importimported only for side effectsimport "reflect-metadata"
css-importimported from CSS@import "tailwindcss"
convention-frameworka framework used through file conventionsnext, with its app/ folder
ambient-typestypes that apply globally@types/node

For these, radius can't know which part of the package you rely on. Your build and your tests can.

Usage radius couldn't follow

KindIn plain words
namespace-escapethe whole module is passed around (doSomething(z))
computed-memberread with computed keys (lib[name]())
dynamic-import-escapeloaded with import() and passed on
prefix-dynamic-importloaded by a computed subpath (import(`lodash/${fn}`))
public-reexportre-exported to your own consumers, who may use anything
unresolved-local-importreached through a local import that didn't resolve
derived-escapea value built from it travels through too many files
unparseable-fileused in a file that didn't parse
unresolved-against-surfacea name you use isn't in its types at all

For the whole project

Some things hide usage everywhere at once, so they're reported once, at the top of the brief (and in JSON under wholeProject), without downgrading every package:

  • require(someVariable) and import(someVariable) with a non-literal name,
  • generated files that were skipped,
  • files that didn't parse.

The limits, stated plainly

  • Behaviour changes are only seen through release notes. If a function keeps its signature but does something different, and no note says so, radius can't know.
  • No type checker runs over your code. A member reached through a callback or a value from somewhere radius didn't follow is matched by name only ("possibly").
  • A local name that shadows an import isn't analysed.
  • Types that re-export another package's types are judged from the notes only.
  • Release notes come from GitHub and the package's own changelog. Other forges aren't read yet.
  • Transitive dependencies are out of scope. Your lockfile and an install cooldown own that risk.

Each brief lists the limits that applied to that run, so nothing here is a surprise later.

On this page