Deno warns that a links field is illegal in a non-root package, but then still
uses that same links field to resolve dependencies. Both can't be true.
Version
deno 2.9.2 (also 2.9.0)
Project structure
deno-repro/
├── core/
│ ├── deno.json name @repro/core
│ └── src/index.ts exports core()
├── middle/
│ ├── deno.json name @repro/middle, links ["../core"]
│ └── src/index.ts imports @repro/core
└── top/
├── deno.json name @repro/top, links ["../core", "../middle"]
└── src/index.ts imports @repro/middle
Dependency direction: top imports middle, middle imports core.
Flow
flowchart TD
A["cd top and run: deno check src/"] --> B["top is the active root"]
B --> C["Deno reads middle as a linked package"]
C --> D{"middle declares a links field"}
D -->|treated as non-root config| W["Warning: links can only be specified in workspace root"]
D -->|but the field is still used| E["resolve @repro/core through middle links"]
E --> F["fetch core/src/index.ts, success"]
F --> G["type check passes, exit 0"]
classDef warn fill:#ffebee,stroke:#c62828,color:#000;
classDef ok fill:#e8f5e9,stroke:#2e7d32,color:#000;
class W warn;
class G ok;
Both outcomes come from the same links field in middle: it is flagged as
illegal (W) yet used successfully to resolve (G).