evanw / esbuild

An extremely fast bundler for the web
https://esbuild.github.io/
MIT License
37.58k stars 1.11k forks source link

compilerOptions.paths not resolved when tsconfig extends from another package #3767

Closed matthewaptaylor closed 1 month ago

matthewaptaylor commented 1 month ago

ESBuild correctly follows the TS behaviour of the extends field in tsconfig.json looking into the exports field of a dependency, such as documented in #3058. For example this is resolved:

"extends": "@repo/tsconfig/base"

when the package.json of @repo/tsconfig exports ./base:

{
  "name": "@repo/tsconfig",
  "private": true,
  "version": "0.1.0",
  "exports": {
    "./base": "./base.json"
  }
}

However, if @repo/tsconfig/base includes a compilerOptions.paths property, these aliases cannot be resolved when building and the build fails. The only way for it to be resolved is to instead change the original extends field to a relative import, such as:

"extends": "../../tooling/typescript/base.json"

Paths should be resolved even when extending from a tsconfig from a package.

Please see this reproduction repo

evanw commented 1 month ago

It looks like this has to do with a pnpm-specific "workspace" feature and symlinks.