microsoft / microsoft/TypeScript
Invalid import path rewrite in declaration file
Nobody has claimed this yet.
- Dominant language
- Go
- Stars
- 111k
- Forks
- 14.4k
- Avg merge
- 1d 19h
- Merged PRs (30d)
- 117
Description
🔎 Search Terms
"import paths", "imports rewrite"
🕗 Version & Regression Information
- This changed between versions 5.5.4 and 5.6.3
⏯ Repository with repro
https://github.com/MariaSolOs/path-rewrite-bug
💻 Code
The linked repository contains all of the necessary code to reproduce the issue. This is a pnpm monorepo with 4 packages.
mod1 simply exports the following interface and makes it available outside the package:
// mod1/index.ts
export interface Foo {
foo: string;
}
// mod1/package.json
{
...
"exports": {
".": {
"types": "./dist/index.d.ts",
"default": "./dist/index.js"
}
}
}
mod2 depends on mod1 and exports its types.
// mod2/index.ts
import { Foo } from "mod1";
export const createFoo = (foo: string): Foo => ({ foo });
export type * from "mod1";
// mod2/package.json
{
...
"exports": {
".": {
"types": "./dist/index.d.ts",
"default": "./dist/index.js"
}
},
"dependencies": {
"mod1": "workspace:*"
}
}
mod3 depends on mod2 and exports a simple getFoo function using the imported function from mod2:
// mod3/index.ts
import { createFoo } from "mod2";
export const getFoo = () => createFoo("foo");
// mod3/package.json
{
...
"exports": {
".": {
"types": "./dist/index.d.ts",
"default": "./dist/index.js"
}
},
"dependencies": {
"mod2": "workspace:*"
}
}
Finally, mod4 depends on mod3 and uses getFoo to create another function:
// mod4/index.ts
import { getFoo } from "mod3";
export const foo = getFoo();
// mod4/package.json
{
...
"exports": {
".": {
"types": "./dist/index.d.ts",
"default": "./dist/index.js"
}
},
"dependencies": {
"mod3": "workspace:*"
}
}
🙁 Actual behavior
Because mod3 has an invalid index.d.ts, mod4 fails compilation when doing a lib check of mod3's type declaration files. This is the invalid declaration file from mod3:
export declare const getFoo: () => import("mod1").Foo;
//# sourceMappingURL=index.d.ts.map
🙂 Expected behavior
For the behavior from previous versions of TypeScript to be maintained: Since mod2 re-exports mod1s types, and since mod3 depends on mod2, compiling mod3 should produce this:
export declare const getFoo: () => import("mod2").Foo;
//# sourceMappingURL=index.d.ts.map
Additional information about the issue
No response
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the linked path-rewrite-bug pnpm monorepo and build the mod1 through mod4 packages using the versions described in the issue. Inspect mod3's generated dist/index.d.ts and verify whether its declaration imports Foo through mod2 rather than mod1. Done means the generated declaration matches the expected output and mod4 passes compilation with declaration files checked.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- compilers
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Clearly specified
- Newbie friendliness
- 48/100