Skip to content

Commit 0f4a615

Browse files
author
Andy
authored
Fix isSourceFileFromExternalLibrary for file with redirect (#27917)
* Fix isSourceFileFromExternalLibrary for file with redirect * Alternate fix * Use currentNodeModulesDepth > 0
1 parent 1dadee8 commit 0f4a615

File tree

2 files changed

+24
-0
lines changed

2 files changed

+24
-0
lines changed

src/compiler/program.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2031,6 +2031,7 @@ namespace ts {
20312031
redirect.resolvedPath = resolvedPath;
20322032
redirect.originalFileName = originalFileName;
20332033
redirect.redirectInfo = { redirectTarget, unredirected };
2034+
sourceFilesFoundSearchingNodeModules.set(path, currentNodeModulesDepth > 0);
20342035
Object.defineProperties(redirect, {
20352036
id: {
20362037
get(this: SourceFile) { return this.redirectInfo!.redirectTarget.id; },

src/testRunner/unittests/programMissingFiles.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,4 +98,27 @@ namespace ts {
9898
]);
9999
});
100100
});
101+
102+
describe("Program.isSourceFileFromExternalLibrary", () => {
103+
it("works on redirect files", () => {
104+
// In this example '/node_modules/foo/index.d.ts' will redirect to '/node_modules/bar/node_modules/foo/index.d.ts'.
105+
const a = new documents.TextDocument("/a.ts", 'import * as bar from "bar"; import * as foo from "foo";');
106+
const bar = new documents.TextDocument("/node_modules/bar/index.d.ts", 'import * as foo from "foo";');
107+
const fooPackageJsonText = '{ "name": "foo", "version": "1.2.3" }';
108+
const fooIndexText = "export const x: number;";
109+
const barFooPackage = new documents.TextDocument("/node_modules/bar/node_modules/foo/package.json", fooPackageJsonText);
110+
const barFooIndex = new documents.TextDocument("/node_modules/bar/node_modules/foo/index.d.ts", fooIndexText);
111+
const fooPackage = new documents.TextDocument("/node_modules/foo/package.json", fooPackageJsonText);
112+
const fooIndex = new documents.TextDocument("/node_modules/foo/index.d.ts", fooIndexText);
113+
114+
const fs = vfs.createFromFileSystem(Harness.IO, /*ignoreCase*/ false, { documents: [a, bar, barFooPackage, barFooIndex, fooPackage, fooIndex], cwd: "/" });
115+
const program = createProgram(["/a.ts"], emptyOptions, new fakes.CompilerHost(fs, { newLine: NewLineKind.LineFeed }));
116+
117+
for (const file of [a, bar, barFooIndex, fooIndex]) {
118+
const isExternalExpected = file !== a;
119+
const isExternalActual = program.isSourceFileFromExternalLibrary(program.getSourceFile(file.file)!);
120+
assert.equal(isExternalActual, isExternalExpected, `Expected ${file.file} isSourceFileFromExternalLibrary to be ${isExternalExpected}, got ${isExternalActual}`);
121+
}
122+
});
123+
});
101124
}

0 commit comments

Comments
 (0)