diff --git a/src/compiler/moduleNameResolver.ts b/src/compiler/moduleNameResolver.ts index 9c2b4c197e2..d973be251c5 100644 --- a/src/compiler/moduleNameResolver.ts +++ b/src/compiler/moduleNameResolver.ts @@ -401,7 +401,8 @@ namespace ts { } directoryPathMap.set(path, result); - const resolvedFileName = result.resolvedModule && result.resolvedModule.resolvedFileName; + const resolvedFileName = result.resolvedModule && + (result.resolvedModule.originalPath || result.resolvedModule.resolvedFileName); // find common prefix between directory and resolved file name // this common prefix should be the shortest path that has the same resolution // directory: /a/b/c/d/e diff --git a/src/testRunner/unittests/moduleResolution.ts b/src/testRunner/unittests/moduleResolution.ts index 2dd75d75f57..76afb4a9b82 100644 --- a/src/testRunner/unittests/moduleResolution.ts +++ b/src/testRunner/unittests/moduleResolution.ts @@ -403,6 +403,30 @@ namespace ts { checkResolvedModule(resolution.resolvedModule, createResolvedModule(resolvedFileName, /*isExternalLibraryImport*/ true)); }); } + + it("uses originalPath for caching", () => { + const host = createModuleResolutionHost( + /*hasDirectoryExists*/ true, + { + name: "/modules/a.ts", + symlinks: ["/sub/node_modules/a/index.ts"], + }, + { + name: "/sub/node_modules/a/package.json", + content: '{"version": "0.0.0", "main": "./index"}' + } + ); + const compilerOptions: CompilerOptions = { moduleResolution: ModuleResolutionKind.NodeJs }; + const cache = createModuleResolutionCache("/", (f) => f); + let resolution = resolveModuleName("a", "/sub/dir/foo.ts", compilerOptions, host, cache); + checkResolvedModule(resolution.resolvedModule, createResolvedModule("/modules/a.ts", /*isExternalLibraryImport*/ true)); + + resolution = resolveModuleName("a", "/sub/foo.ts", compilerOptions, host, cache); + checkResolvedModule(resolution.resolvedModule, createResolvedModule("/modules/a.ts", /*isExternalLibraryImport*/ true)); + + resolution = resolveModuleName("a", "/foo.ts", compilerOptions, host, cache); + assert.isUndefined(resolution.resolvedModule, "lookup in parent directory doesn't hit the cache"); + }); }); describe("Module resolution - relative imports", () => { diff --git a/tests/cases/compiler/symbolLinkDeclarationEmitModuleNames.ts b/tests/cases/compiler/symbolLinkDeclarationEmitModuleNames.ts index 95defd4ecc7..90a5c19196e 100644 --- a/tests/cases/compiler/symbolLinkDeclarationEmitModuleNames.ts +++ b/tests/cases/compiler/symbolLinkDeclarationEmitModuleNames.ts @@ -22,4 +22,4 @@ export class BindingKey { export * from "./src/value-promise"; export * from "./src/bindingkey"; -// @link: tests/cases/compiler/monorepo/context -> tests/cases/compiler/monorepo/core/node_modules/@loopback/context \ No newline at end of file +// @link: tests/cases/compiler/monorepo/context -> tests/cases/compiler/monorepo/node_modules/@loopback/context \ No newline at end of file