When you need to know where a module’s exports are used across a large codebase, Grep each exported function name individually. This identifies every import statement and reference efficiently, without loading every file.
The tracing pattern
Module utils/parser.ts exports parseJSON, parseCSV, parseXML. To find all usage:
Grep("parseJSON")→ finds all files importing or calling parseJSONGrep("parseCSV")→ finds all files importing or calling parseCSVGrep("parseXML")→ finds all files importing or calling parseXML
Each search returns matching files and lines — the complete usage map across the codebase.
Why Grep, not Glob?
Grep searches file contents — it finds import statements like import { parseJSON } from './utils/parser' inside files. Glob searches file paths — it finds files named parser.ts, not files that import from parser. A file named formatter.ts might import from parser, while parser-utils.ts might not. Content search is required.
Why not Read everything?
Reading 200+ files into context is wasteful. Grep achieves the same result with targeted searches that return only matching files and lines, consuming a fraction of the context.
Building the dependency graph
After Grep identifies which files use each export:
- Read the most critical consumers to understand usage patterns
- Follow the dependency chain further if needed (who calls the callers?)
- Use this understanding to assess impact of changes (if parseJSON changes, these 12 files are affected)
This is the foundation for safe refactoring: know all consumers before changing an API.
One-liner: Grep each exported function name to find all cross-module references — Grep searches file contents (imports, calls), Glob only searches file names, and reading all files wastes context.