microsoft / microsoft/TypeScript
tsc includes previous output in result when allowJs is enabled and "exclude" is non-empty
Nobody has claimed this yet.
- Dominant language
- Go
- Stars
- 111k
- Forks
- 14.3k
- Avg merge
- 2d 4h
- Merged PRs (30d)
- 132
Description
TypeScript Version: 2.7.0-dev.20171222
Code
For easy access, clone this gist: https://gist.github.com/WasabiFan/6922d6eb6224945ac809c216fdc37089
test.ts:
// Source code here
tsconfig.json:
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"outDir": "out",
"allowJs": true
},
"exclude": [
"node_modules"
]
}
Removing the exclude block or disabling allowJs avoids the issue.
Note that this is an easy state to get into: in my case, I generated a VSCode extension with their official templates and then enabled allowJs. I didn't realize what was going on until my PC ran out of RAM, as it automatically ran the watch task and the depth grew every time I saved.
Expected behavior:
I can compile the project with tsc as many times as I'd like.
Actual behavior:
PS D:\...> git clone https://gist.github.com/WasabiFan/6922d6eb6224945ac809c216fdc37089 tsc-recursion-demo-gist
Cloning into 'tsc-recursion-demo-gist'...
remote: Counting objects: 7, done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 7 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (7/7), done.
PS D:\...> cd .\tsc-recursion-demo-gist\
PS D:\...\tsc-recursion-demo-gist> tsc -p .
PS D:\...\tsc-recursion-demo-gist> tsc -p .
error TS5055: Cannot write file 'D:/.../tsc-recursion-demo-gist/out/test.js' because it would overwrite input file.
PS D:\...\tsc-recursion-demo-gist> tsc -p .
error TS5055: Cannot write file 'D:/.../tsc-recursion-demo-gist/out/out/test.js' because it would overwrite input file.
error TS5055: Cannot write file 'D:/.../tsc-recursion-demo-gist/out/test.js' because it would overwrite input file.
PS D:\...\tsc-recursion-demo-gist> tsc -p .
error TS5055: Cannot write file 'D:/.../tsc-recursion-demo-gist/out/out/out/test.js' because it would overwrite input file.
error TS5055: Cannot write file 'D:/.../tsc-recursion-demo-gist/out/out/test.js' because it would overwrite input file.
error TS5055: Cannot write file 'D:/.../tsc-recursion-demo-gist/out/test.js' because it would overwrite input file.
PS D:\...\tsc-recursion-demo-gist> tsc -p .
error TS5055: Cannot write file 'D:/.../tsc-recursion-demo-gist/out/out/out/out/test.js' because it would overwrite input file.
error TS5055: Cannot write file 'D:/.../tsc-recursion-demo-gist/out/out/out/test.js' because it would overwrite input file.
error TS5055: Cannot write file 'D:/.../tsc-recursion-demo-gist/out/out/test.js' because it would overwrite input file.
error TS5055: Cannot write file 'D:/.../tsc-recursion-demo-gist/out/test.js' because it would overwrite input file.
PS D:\...\tsc-recursion-demo-gist> tsc -p .
error TS5055: Cannot write file 'D:/.../tsc-recursion-demo-gist/out/out/out/out/out/test.js' because it would overwrite input file.
error TS5055: Cannot write file 'D:/.../tsc-recursion-demo-gist/out/out/out/out/test.js' because it would overwrite input file.
error TS5055: Cannot write file 'D:/.../tsc-recursion-demo-gist/out/out/out/test.js' because it would overwrite input file.
error TS5055: Cannot write file 'D:/.../tsc-recursion-demo-gist/out/out/test.js' because it would overwrite input file.
error TS5055: Cannot write file 'D:/.../tsc-recursion-demo-gist/out/test.js' because it would overwrite input file.
The fix (and the best option) is to exclude the output directory. But given that existing templates don't do that, I think this is a significant issue. I don't understand why this doesn't happen when the exclude block is removed; I assume there's an internal safety to prevent this problem that's overridden.
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
Clone the linked gist and reproduce the issue with test.ts and tsconfig.json, using allowJs, a non-empty exclude, and outDir. Start by tracing the project input discovery and repeated tsc -p behavior. Done means repeated compilations no longer include prior output under out/ as new input or produce recursive output paths.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- javascript, typescript
- Domain
- compilers
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 30/100