eslint-import-resolver-typescript

A TypeScript-aware module resolver that plugs into eslint-plugin-import(-x) so ESLint can correctly follow .ts/.tsx imports, tsconfig paths, and package export maps.

Tool
npm
v4.4.5
827stars
ISC

Repository Health

Pre-computed score based on development activity, maintenance, community, maturity, and trend momentum.How we score it →
50/100Fair
Development Activity16
Maintenance44
Community52
Maturity60
Momentum28

Technical Analysis

AI-assessed by reading the actual repository — architecture, code quality, innovation, and documentation.How we score it →
69/100Good
Architecture72
Code Quality78
Innovation55
Learning Curve70

eslint-import-resolver-typescript adds TypeScript support to eslint-plugin-import and eslint-plugin-import-x, which otherwise only understand plain JavaScript module resolution. Without it, rules like import/no-unresolved and import/named misfire constantly in a TypeScript codebase because ESLint’s default resolver has no notion of .ts, .tsx, .d.ts extensions, tsconfig.json path mapping, or the imports/exports fields in package.json.

Under the hood it delegates the actual filesystem resolution to unrs-resolver (a Rust-backed resolver also used by other tools in the Rust-JS ecosystem for speed), while it owns the TypeScript-specific policy layer: parsing tsconfig.json/jsconfig.json via get-tsconfig, matching path aliases, preferring @types/* type declarations over sibling .js/.jsx files, and supporting multiple tsconfigs in a monorepo (either as an explicit array, a glob, or TypeScript project references).

Configuration is exposed two ways: as a flat-config resolver object (createTypeScriptImportResolver) for eslint-plugin-import-x@>=4.5, and as the classic import/resolver: { typescript: {...} } settings block for older eslint-plugin-import setups. Both accept the same option surface — alwaysTryTypes, bun (for Bun’s built-in modules), project path(s), plus pass-through options like conditionNames, extensions, and mainFields that map directly onto unrs-resolver’s own resolution algorithm.

It has been a near-default dependency in TypeScript + ESLint projects since 2017, with 45 contributors and a v2/v3/v4 history that tracks changes in how Node and bundlers resolve TypeScript-specific file extensions and export conditions.

What You Get

  • Flat-config resolver factory - createTypeScriptImportResolver() for direct use in eslint.config.js with eslint-plugin-import-x >=4.5, no legacy settings block needed
  • Classic settings-block support - import/resolver: { typescript: {...} } for .eslintrc and older eslint-plugin-import versions
  • tsconfig/jsconfig path mapping - resolves paths aliases from tsconfig.json or jsconfig.json, including glob patterns and arrays for monorepos
  • TypeScript project references support - can resolve nested tsconfigs across a monorepo using references, avoiding one-tsconfig-per-package duplication
  • @types/* precedence - alwaysTryTypes resolves ambient type declarations over sibling plain JS files, useful for packages with separate @types definitions
  • Bun module resolution - bun: true (or running under bun --bun eslint) resolves Bun’s built-in modules like bun:test
  • Rust-backed resolution engine - delegates to unrs-resolver for the actual filesystem walk, keeping large-project lint runs fast

Common Use Cases

  • Fixing false-positive import/no-unresolved errors - a team adds TypeScript to a JS codebase and ESLint’s import rules start flagging valid .ts imports as unresolved; this resolver fixes that without disabling the rule
  • Monorepos with multiple tsconfigs - a pnpm/Yarn workspace with per-package tsconfig.json files configures project: 'packages/*/tsconfig.json' so cross-package imports resolve correctly from any file
  • Migrating from .eslintrc to flat config - a project moving to ESLint 9’s flat config switches from the import/resolver settings object to createTypeScriptImportResolver() for a cleaner, importable config
  • Projects using path aliases - an app defines @/* path mapping in tsconfig.json for absolute imports; without this resolver ESLint can’t verify those aliased imports actually point to real files
  • Bun-based TypeScript projects - a project running on Bun needs ESLint to recognize bun:test and other Bun built-ins as valid imports rather than flagging them as missing modules

Under The Hood

Architecture The package centers on a single resolve() function in src/index.ts that layers TypeScript-specific policy on top of a general-purpose resolver. It first short-circuits Node/Bun core modules via isBuiltin/isBunBuiltin, then normalizes caller options in normalize-options.ts (resolving and sorting candidate tsconfig projects by directory affinity in helpers.ts’s sortProjectsByAffinity), and finally delegates the actual filesystem walk to an unrs-resolver ResolverFactory instance. Three module-level caches (resolverCache, tsconfigCache, matcherCache), keyed by a stable hash of the options plus cwd, avoid re-parsing tsconfig files and rebuilding resolvers across repeated ESLint rule invocations — a meaningful cost given ESLint calls resolvers per-import, per-file. The design cleanly separates “which tsconfig applies to this file” (this package’s job) from “how do we actually resolve a module path” (delegated entirely to unrs-resolver), so a change to Node’s module resolution algorithm is absorbed by the dependency rather than requiring changes here.

Tech Stack Written in TypeScript, built dual-format (ESM lib/index.js + CJS lib/index.cjs) via tsc and tsdown, and published under the import-js GitHub org. Core runtime dependencies are narrow and purpose-built: unrs-resolver (Rust-backed resolution), get-tsconfig (tsconfig/jsconfig parsing and path-matcher creation), is-bun-module, stable-hash-x for cache keys, and tinyglobby for glob-pattern project globbing. It integrates with ESLint via the eslint-import-context package’s useRuleContext() rather than depending on ESLint directly, letting it work across both eslint-plugin-import and eslint-plugin-import-x. Yarn Berry (PnP-aware, packageManager: yarn@4.9.2) manages the workspace, with changesets driving releases.

Code Quality Tests run under Vitest (vitest run) plus a standalone e2e smoke test (tests/e2e/withJsExtension/test.cjs), with an extensive tests/e2e/ suite covering path-alias resolution, multiple tsconfigs, tsconfig project references, dotted include/exclude paths, and querystring-suffixed imports — each as its own fixture directory with a real tsconfig and expected resolution snapshot. The project enforces a 100%-minimum type-coverage threshold via the type-coverage tool (typeCoverage.atLeast: 100 in package.json), which is a stronger and more unusual guarantee than typical --noImplicitAny type checking. Linting runs through the shared @1stg/common-config ESLint config plus a dedicated tsc --noEmit pass, and CI (GitHub Actions) enforces both on every PR alongside Codecov coverage reporting. No test framework gaps were found; the codebase is small and every exported function has corresponding fixture coverage.

API Design The public surface is deliberately narrow: one resolver factory (createTypeScriptImportResolver) for flat config, and one options object shape shared with the legacy import/resolver.typescript settings block, so migrating between ESLint config formats requires no relearning. Defaults are sensible and documented inline in the README (default extensions, extensionAlias, conditionNames, mainFields are all shown as copy-pasteable JSON), which keeps the common case a one-line alwaysTryTypes: true addition to config while still exposing every knob unrs-resolver itself supports for advanced monorepo or non-standard resolution setups.

Used by 48 apps in this directory

TypeScript
99%
Other

Activepieces

Automation · AI Assistants

24,298

Open-source AI automation platform that converts 280+ workflow integrations into MCP servers for LLMs, with no-code builders and TypeScript extensibility.

View details
92
Repo Health
85
Technical
64
Dependency
Built with
TypeScript99%
Updated today
TypeScript
87%
Other

AFFiNE

Productivity · Project Management · Note Taking

72,238

Write, draw, and plan in one infinite canvas — the open-source alternative to Notion and Miro that keeps your data yours.

View details
91
Repo Health
87
Technical
67
Dependency
Built with
TypeScript87%
Updated yesterday
Go
86%
Apache 2.0

Authelia

Security · Authentication

28,815

OpenID Certified SSO and MFA portal for securing self-hosted web applications behind reverse proxies.

View details
91
Repo Health
81
Technical
76
Dependency
Built with
Go86%
TypeScript12%
Updated today
Rust
67%
MIT

Bun

Developer Tools

95,895

An all-in-one JavaScript and TypeScript toolkit — one Rust-and-JavaScriptCore binary that replaces Node.js, npm, a bundler, and a test runner with faster equivalents.

View details
92
Repo Health
91
Technical
64
Dependency
Built with
Rust67%
C++19%
Updated yesterday
TypeScript
99%
Other

byterover-cli

AI Agents · AI Code Assistants

4,956

A portable memory layer for AI coding agents — curate structured project knowledge into a version-controlled context tree that syncs across tools, machines, and teammates.

View details
52
Repo Health
83
Technical
70
Dependency
Built with
TypeScript99%
Updated 2 months ago
TypeScript
99%
AGPL 3.0

Cherry Studio

AI Assistants

51,521

All-in-one AI desktop client with 300+ assistants and multi-model support

View details
89
Repo Health
84
Technical
71
Dependency
Built with
TypeScript99%
Updated today
TypeScript
84%
Apache 2.0

Continue

Developer Tools · AI Development · AI Code Assistants

35,808

Open-source coding agent for VS Code, JetBrains, and CLI with support for 30+ LLM providers.

View details
81
Repo Health
88
Technical
62
Dependency
Built with
TypeScript84%
Updated yesterday
TypeScript
45%
Other

Convex Backend

Developer Tools · Databases

12,494

Open-source reactive database that lets developers build live-updating apps with pure TypeScript, strong consistency, and real-time subscriptions—no separate API layer required.

View details
87
Repo Health
82
Technical
68
Dependency
Built with
TypeScript45%
Rust43%
Updated 2 days ago
Go
49%
Other

Cosmos-Server

Security · Authentication

6,146

All-in-one self-hosted home server with SmartShield anti-DDoS, Nebula mesh VPN, automatic HTTPS, and a 250-app marketplace — all secured behind a unified auth layer.

View details
85
Repo Health
59
Technical
64
Dependency
Built with
Go49%
JavaScript48%
Updated 2 days ago

Join founders buildingwith open source

Opinionated takes, migration guides, cost-saving tips, and insights from the open source ecosystem.

Subscribe on Substack
Join 750+ subscribers

Search