From ba90986805063d8a4a760cca0eb7752943455b48 Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Tue, 30 Mar 2021 11:35:07 -0700 Subject: [PATCH 1/2] Add failing test case --- src/testRunner/tsconfig.json | 1 + src/testRunner/unittests/tsbuild/clean.ts | 16 ++++++++++++++ .../file-name-and-output-name-clashing.js | 21 +++++++++++++++++++ 3 files changed, 38 insertions(+) create mode 100644 src/testRunner/unittests/tsbuild/clean.ts create mode 100644 tests/baselines/reference/tsbuild/clean/initial-build/file-name-and-output-name-clashing.js diff --git a/src/testRunner/tsconfig.json b/src/testRunner/tsconfig.json index 34c55d0d5da99..bf372efb81c20 100644 --- a/src/testRunner/tsconfig.json +++ b/src/testRunner/tsconfig.json @@ -113,6 +113,7 @@ "unittests/services/textChanges.ts", "unittests/services/transpile.ts", "unittests/tsbuild/amdModulesWithOut.ts", + "unittests/tsbuild/clean.ts", "unittests/tsbuild/configFileErrors.ts", "unittests/tsbuild/configFileExtends.ts", "unittests/tsbuild/containerOnlyReferenced.ts", diff --git a/src/testRunner/unittests/tsbuild/clean.ts b/src/testRunner/unittests/tsbuild/clean.ts new file mode 100644 index 0000000000000..90bb298529028 --- /dev/null +++ b/src/testRunner/unittests/tsbuild/clean.ts @@ -0,0 +1,16 @@ +namespace ts { + describe("unittests:: tsbuild - clean", () => { + verifyTsc({ + scenario: "clean", + subScenario: `file name and output name clashing`, + commandLineArgs: ["--b", "/src/tsconfig.json", "-clean"], + fs: () => loadProjectFromFiles({ + "/src/index.js": "", + "/src/bar.ts": "", + "/src/tsconfig.json": JSON.stringify({ + compilerOptions: { allowJs: true }, + }), + }), + }); + }); +} \ No newline at end of file diff --git a/tests/baselines/reference/tsbuild/clean/initial-build/file-name-and-output-name-clashing.js b/tests/baselines/reference/tsbuild/clean/initial-build/file-name-and-output-name-clashing.js new file mode 100644 index 0000000000000..9bb218a63b5fb --- /dev/null +++ b/tests/baselines/reference/tsbuild/clean/initial-build/file-name-and-output-name-clashing.js @@ -0,0 +1,21 @@ +Input:: +//// [/lib/lib.d.ts] + + +//// [/src/bar.ts] + + +//// [/src/index.js] + + +//// [/src/tsconfig.json] +{"compilerOptions":{"allowJs":true}} + + + +Output:: +/lib/tsc --b /src/tsconfig.json -clean +exitCode:: ExitStatus.Success + + +//// [/src/index.js] unlink From d728fd32d3b2fec9db4a3a85f5b1bf89fdb0b7e8 Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Tue, 30 Mar 2021 15:02:35 -0700 Subject: [PATCH 2/2] Do not delete output file names that are same as input file name Fixes #43116 --- src/compiler/tsbuildPublic.ts | 4 ++++ .../clean/initial-build/file-name-and-output-name-clashing.js | 1 - 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/compiler/tsbuildPublic.ts b/src/compiler/tsbuildPublic.ts index ddebecc2e55bd..d642f79a12447 100644 --- a/src/compiler/tsbuildPublic.ts +++ b/src/compiler/tsbuildPublic.ts @@ -1717,7 +1717,11 @@ namespace ts { continue; } const outputs = getAllProjectOutputs(parsed, !host.useCaseSensitiveFileNames()); + if (!outputs.length) continue; + const inputFileNames = new Set(parsed.fileNames.map(f => toPath(state, f))); for (const output of outputs) { + // If output name is same as input file name, do not delete and ignore the error + if (inputFileNames.has(toPath(state, output))) continue; if (host.fileExists(output)) { if (filesToDelete) { filesToDelete.push(output); diff --git a/tests/baselines/reference/tsbuild/clean/initial-build/file-name-and-output-name-clashing.js b/tests/baselines/reference/tsbuild/clean/initial-build/file-name-and-output-name-clashing.js index 9bb218a63b5fb..e8cecc75d8cac 100644 --- a/tests/baselines/reference/tsbuild/clean/initial-build/file-name-and-output-name-clashing.js +++ b/tests/baselines/reference/tsbuild/clean/initial-build/file-name-and-output-name-clashing.js @@ -18,4 +18,3 @@ Output:: exitCode:: ExitStatus.Success -//// [/src/index.js] unlink