Restricted direct importers
restrictedDirectImportersDetection constrains which files may directly import a set of target files or node modules. It looks only at direct import edges - it does not follow transitive chains and never builds a dependency graph, which makes it cheap and precise for "only these files may import X" rules.
What this check does​
You declare the targets as either files or modules (glob patterns), then choose one policy:
allowImporters(whitelist): only files matching these patterns may directly import a target. Any other direct importer is a violation.denyImporters(blacklist): files matching these patterns may not directly import a target. Any matching direct importer is a violation.
Only direct imports count. If a.ts imports b.ts and b.ts imports the target, then b.ts is a direct importer (and may be reported) but a.ts is not - it only reaches the target transitively. To reason about transitive reachability from entry points, use restrictedImporters instead.
Why it is important​
- Enforce a single access point: require that a config, client, or singleton is imported only through an approved wrapper (
allowImporters), so usage stays centralized. - Keep layers from reaching in: forbid a set of files (e.g.
src/public/**) from importing internal modules directly (denyImporters). - Cheap and exact: because it inspects only direct edges, it is fast and its findings map 1:1 to import statements you can fix.
Restricted Direct Importers vs. Restricted Importers​
Both answer "who may import this target", but at different depths:
restrictedImportersreasons about transitive reachability from a rule's entry points and requires a dependency graph.restrictedDirectImportersreasons about direct import edges only - it flags the exact files that import the target, regardless of entry points, without building a graph.
Reach for direct importers when you care about the import statement itself (the file that writes import ... from 'target'); reach for restrictedImporters when you care about which entry points can end up depending on the target through any chain.
Configuration​
Whitelist - only the approved wrapper may import the server config directly:
{
"rules": [
{
"path": ".",
"restrictedDirectImportersDetection": {
"enabled": true,
"files": ["utils/configs/internal.ts"],
"allowImporters": ["utils/configs/**"]
}
}
]
}
Any file outside utils/configs/** that directly imports utils/configs/internal.ts is reported.
Blacklist - forbid public code from importing internal modules directly:
{
"rules": [
{
"path": ".",
"restrictedDirectImportersDetection": {
"enabled": true,
"files": ["src/internal/**"],
"denyImporters": ["src/public/**"]
}
}
]
}
Constraining a node module​
Use modules (instead of files) to constrain which files may directly import a node module. modules are matched as module-name glob patterns (the same matching restrictedImports uses for denyModules): axios matches axios and axios/*, and @legacy/* matches any package in the @legacy scope.
{
"rules": [
{
"path": ".",
"restrictedDirectImportersDetection": {
"enabled": true,
"modules": ["axios", "@legacy/*"],
"denyImporters": ["src/domain/**"]
}
}
]
}
files and modules are mutually exclusive - provide exactly one. allowImporters and denyImporters are mutually exclusive too - provide exactly one.
Options​
enabled(boolean, required): Whether to enable restricted direct importers detection.files(array of strings): Glob patterns for the target files whose direct importers are constrained. Mutually exclusive withmodules; exactly one is required when enabled.modules(array of strings): Node-module name glob patterns for the targets whose direct importers are constrained. Mutually exclusive withfiles; exactly one is required when enabled.allowImporters(array of strings): Whitelist of files permitted to directly import a target. Any other direct importer is a violation. Mutually exclusive withdenyImporters; exactly one is required when enabled.denyImporters(array of strings): Blacklist of files forbidden from directly importing a target. Any matching direct importer is a violation. Mutually exclusive withallowImporters; exactly one is required when enabled.ignoreMatches(array of strings, optional): Importer patterns to exempt - a direct importer matching any of these is never reported. This filters the importer side only; it does not narrow thefiles/modulestargets.ignoreTypeImports(boolean, optional): Ignore type-only imports when determining direct importers (default: false).
All path and module fields (files, modules, allowImporters, denyImporters, ignoreMatches) support glob patterns.
Defining multiple restricted direct importers rules​
Like other detectors, restrictedDirectImportersDetection can be a single object or an array of objects - use an array to constrain different targets within the same workspace:
{
"rules": [
{
"path": ".",
"restrictedDirectImportersDetection": [
{
"enabled": true,
"files": ["utils/configs/serverConfig/index.ts"],
"allowImporters": ["utils/configs/**"]
},
{
"enabled": true,
"modules": ["axios"],
"denyImporters": ["src/domain/**"]
}
]
}
]
}
Related checks​
restrictedImporters- the transitive reacher counterpart.restrictedImports- the dual: restrict what entry points may reach.moduleBoundaries- directional allow/deny rules between groups of files.