Skip to content

tsc includes previous output in result when allowJs is enabled and "exclude" is non-empty #20862

@WasabiFan

Description

@WasabiFan

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    In DiscussionNot yet reached consensusSuggestionAn idea for TypeScript

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions