Incorrect sourcemap sources paths when outDir differs from source directory
Nobody has claimed this yet.
Assessment
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Newbie friendliness
- 45/100
- Issue type
- Bug
- Clarity
- Clearly specified
- Activity status
- Stale
- Tech stack
- typescript
- Domain
- build-system
Research direction
Start in packages/typescript/src/outputFile.ts, specifically findTypescriptOutput, and reproduce the issue with the linked project using npm install, npm run build, and jq on dist/project-1/index.js.map. Trace how the emitted sourcemap sources are returned and ensure the final sources resolve to my-project-1/src/test.ts as ../../my-project-1/src/test.ts.
Written by the indexing model from the issue text.
Description
- Rollup Plugin Name:
@rollup/plugin-typescript - Rollup Plugin Version: 12.3.0
- Rollup Version: 4.59.0
- Operating System (or Browser): Linux (reproducible on any OS)
- Node Version: v24.13.0
- Link to reproduction: https://stackblitz.com/~/github.com/skrtheboss/rollup-repro-5sqw8ygm
- May be ralated to: #1948
Expected Behavior
When the TypeScript source files live in a different directory tree than the outDir, the final bundled sourcemap should contain correct relative sources paths that resolve back to the actual .ts files.
For the reproduction project with source at my-project-1/src/test.ts and output at dist/project-1/, the sourcemap should contain:
"sources": ["../../my-project-1/src/test.ts"]
Resolving from the map file's directory: resolve("dist/project-1", "../../my-project-1/src/test.ts") → my-project-1/src/test.ts ✅
Actual Behavior
The sourcemap contains an incorrect path with one extra ../ level:
"sources": ["../../../my-project-1/src/test.ts"]
Resolving from the map file's directory: resolve("dist/project-1", "../../../my-project-1/src/test.ts") → goes above the project root ❌
This breaks source mapping in browsers, debuggers, and any other sourcemap consumer.
Additional Information
Root cause
TypeScript emits sourcemaps with sources paths relative to the output map file location (inside outDir). For example, when compiling my-project-1/src/test.ts with outDir: "../dist/project-1", TypeScript would write dist/project-1/src/test.js.map containing:
{ "sources": ["../../../my-project-1/src/test.ts"], "sourceRoot": "." }
This is correct when resolved from the map file's directory (dist/project-1/src/):
path.resolve("dist/project-1/src", ".", "../../../my-project-1/src/test.ts")
→ "my-project-1/src/test.ts" ✅
However, @rollup/plugin-typescript returns this sourcemap verbatim from the load hook. Rollup's getCollapsedSourcemap then resolves these source paths relative to path.dirname(id) — the original source file's directory (my-project-1/src/), not the output map file's directory:
path.resolve("my-project-1/src", ".", "../../../my-project-1/src/test.ts")
→ "../my-project-1/src/test.ts" (one level above project root) ❌
The mismatch occurs in findTypescriptOutput (packages/typescript/src/outputFile.ts), which returns the TypeScript-emitted sourcemap without rebasing the sources paths from the output directory to the source file directory.
Steps to reproduce
git clone https://github.com/skrtheboss/rollup-repro-5sqw8ygm
cd rollup-repro-5sqw8ygm
npm install
npm run build
cat dist/project-1/index.js.map | jq .sources
# Actual: ["../../../my-project-1/src/test.ts"] ❌
# Expected: ["../../my-project-1/src/test.ts"] ✅
- Dominant language
- JavaScript
- Stars
- 3.8k
- Forks
- 635
- PR merge metrics
- No merged PRs in 30d
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.
More from rollup/plugins
-
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
-
Difficulty 4/5 3-5 days Newbie friendliness 52/100
-
Difficulty 3/5 1-2 days Newbie friendliness 48/100
-
Difficulty 4/5 3-5 days Newbie friendliness 48/100
-
Support js-yaml v5 Open
Difficulty 4/5 3-5 days Newbie friendliness 45/100
Similar issues
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
avniproject/avni-client#2135 ·
-
automated broken-link
Difficulty 1/5 Under an hour Newbie friendliness 85/100
-
agent/security hive/hosted-available-lke648397-260827-5n31 security
Difficulty 2/5 1-3 hours Newbie friendliness 84/100
-
enhancement
Difficulty 2/5 1-3 hours Newbie friendliness 70/100
babalae/bettergi-scripts-list#3674 ·
-
A-Release-Notes C-Editing D-Modest S-Ready-For-Implementation
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
bevyengine/bevy-website#2595 ·