microsoft / microsoft/TypeScript
`libReplacement: true` lookup folder should be configurable (via `typeRoots` ?)
- Dominant language
- Go
- Stars
- 111k
- Forks
- 14.3k
- PR merge metrics
- PR metrics pending
Description
### 🔎 Search Terms
When `libReplacement: true` is used, for example
```
"libReplacement": true,
"lib": ["dom", "esnext"],
```
It is currently not possible to instruct the TS compiler to look for `@typescript/lib-dom/` in a custom folder, which makes it impossible to leverage `libReplacement: true` in setups where the folder does not reside in the parent chain (real-world scenario in the Chromium repository). For example adding something as follows has no effect.
```
"typeRoots": [
"./some/sibling/folder/node_modules/@typescript", <-- Does not work
"./some/sibling/folder/node_modules/@typescript/lib-dom" <-- Does not work either
],
```
Pasting `--traceResolution` output for reference.
```
======== Resolving module '@typescript/lib-dom' from '/usr/local/home/workspace/chromium/src/out/gchrome/gen/ui/webui/resources/tools/eslint/__lib_node_modules_lookup_lib.dom.d.ts__.ts'. ========
Explicitly specified module resolution kind: 'Node10'.
Loading module '@typescript/lib-dom' from 'node_modules' folder, target file types: TypeScript, Declaration.
Searching all ancestor node_modules directories for preferred extensions: TypeScript, Declaration.
Directory '/usr/local/home/workspace/chromium/src/out/gchrome/gen/ui/webui/resources/tools/eslint/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-dom'
Directory '/usr/local/home/workspace/chromium/src/out/gchrome/gen/ui/webui/resources/tools/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-dom'
Directory '/usr/local/home/workspace/chromium/src/out/gchrome/gen/ui/webui/resources/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-dom'
Directory '/usr/local/home/workspace/chromium/src/out/gchrome/gen/ui/webui/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-dom'
Directory '/usr/local/home/workspace/chromium/src/out/gchrome/gen/ui/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-dom'
Directory '/usr/local/home/workspace/chromium/src/out/gchrome/gen/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-dom'
Directory '/usr/local/home/workspace/chromium/src/out/gchrome/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-dom'
Directory '/usr/local/home/workspace/chromium/src/out/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-dom'
Directory '/usr/local/home/workspace/chromium/src/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-dom'
Directory '/usr/local/home/workspace/chromium/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-dom'
Directory '/usr/local/home/workspace/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-dom'
Directory '/usr/local/home/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-dom'
Directory '/usr/local/home/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-dom'
Directory '/usr/local/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-dom'
Directory '/usr/local/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-dom'
Directory '/usr/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-dom'
Directory '/node_modules' does not exist, skipping all lookups in it.
Scoped package detected, looking in 'typescript__lib-dom'
Loading module '@typescript/lib-dom' from 'node_modules' folder, target file types: JavaScript.
Searching all ancestor node_modules directories for fallback extensions: JavaScript.
Directory '/usr/local/home/workspace/chromium/src/out/gchrome/gen/ui/webui/resources/tools/eslint/node_modules' does not exist, skipping all lookups in it.
Directory '/usr/local/home/workspace/chromium/src/out/gchrome/gen/ui/webui/resources/tools/node_modules' does not exist, skipping all lookups in it.
Directory '/usr/local/home/workspace/chromium/src/out/gchrome/gen/ui/webui/resources/node_modules' does not exist, skipping all lookups in it.
Directory '/usr/local/home/workspace/chromium/src/out/gchrome/gen/ui/webui/node_modules' does not exist, skipping all lookups in it.
Directory '/usr/local/home/workspace/chromium/src/out/gchrome/gen/ui/node_modules' does not exist, skipping all lookups in it.
Directory '/usr/local/home/workspace/chromium/src/out/gchrome/gen/node_modules' does not exist, skipping all lookups in it.
Directory '/usr/local/home/workspace/chromium/src/out/gchrome/node_modules' does not exist, skipping all lookups in it.
Directory '/usr/local/home/workspace/chromium/src/out/node_modules' does not exist, skipping all lookups in it.
Directory '/usr/local/home/workspace/chromium/src/node_modules' does not exist, skipping all lookups in it.
Directory '/usr/local/home/workspace/chromium/node_modules' does not exist, skipping all lookups in it.
Directory '/usr/local/home/workspace/node_modules' does not exist, skipping all lookups in it.
Directory '/usr/local/home/node_modules' does not exist, skipping all lookups in it.
Directory '/usr/local/home/node_modules' does not exist, skipping all lookups in it.
Directory '/usr/local/node_modules' does not exist, skipping all lookups in it.
Directory '/usr/local/node_modules' does not exist, skipping all lookups in it.
Directory '/usr/node_modules' does not exist, skipping all lookups in it.
Directory '/node_modules' does not exist, skipping all lookups in it.
======== Module name '@typescript/lib-dom' was not resolved. ========
```
Or if `typeRoots` is not the right way, there should be some way to customize where to look.
Let me know if you think a minimal repro is needed. Skipping for now as the above setup seems easy to reproduce.
### 🕗 Version & Regression Information
Reproducing on v 6.0.2. Did not try previous versions.
### 🙁 Actual behavior
No way exists to tell `tsc` where to locate the `@typescript/lib-dom/` folder.
### 🙂 Expected behavior
There should be a way tell `tsc` where to locate the `@typescript/lib-dom/` folder, similar to how this is done with `typeRoots` for types listed in `types`.
Contributor guide
Research direction
Start by reproducing the configuration with libReplacement, typeRoots, and --traceResolution, then trace how tsc resolves @typescript/lib-dom. Compare the lookup with typeRoots behavior and define a configuration path that works for sibling folders; done means the custom location resolves reliably and regression coverage verifies it.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- compilers
- Issue type
- Feature
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100