map() dedupes globally on ${method}::${path} (first-seen wins). When a repo has multiple apps under one scan, two siblings registering the same (method, path) (e.g. /health, /metrics, /{proxy+}) collapse to one row — and consumers that filter the result back to a single app may end up with the survivor attributed to the other app's file, silently losing the route for its real owner.
Likely scenarios: monorepos / SST-style repos where multiple services share a root manifest and conventionally expose health, catch-all, or auth routes.
Considerations for a fix:
- Per-file dedup
(file, method, path) would solve this, but flips the answer to a different question: same logical route registered from two files (mounted middleware, catch-all + SPA fallback, double-registration bugs) becomes two rows instead of one. Sometimes that's noise, sometimes it's the truth a tool wants to surface.
- A dedup-mode option lets each consumer pick the view that matches its question. CLI keeps the clean default; tools doing per-app scoping ask for per-file rows.
Suggested API (open to alternatives):
map(repoPath, { dedup: 'route' | 'file-route' | 'none' }) // default 'route'
Or simpler: export mapRaw so power users can do their own dedup downstream.
map()dedupes globally on${method}::${path}(first-seen wins). When a repo has multiple apps under one scan, two siblings registering the same(method, path)(e.g./health,/metrics,/{proxy+}) collapse to one row — and consumers that filter the result back to a single app may end up with the survivor attributed to the other app's file, silently losing the route for its real owner.Likely scenarios: monorepos / SST-style repos where multiple services share a root manifest and conventionally expose health, catch-all, or auth routes.
Considerations for a fix:
(file, method, path)would solve this, but flips the answer to a different question: same logical route registered from two files (mounted middleware, catch-all + SPA fallback, double-registration bugs) becomes two rows instead of one. Sometimes that's noise, sometimes it's the truth a tool wants to surface.Suggested API (open to alternatives):
Or simpler: export
mapRawso power users can do their own dedup downstream.