From bed93b48f561a271162ec95ddcd88deaf0e8c759 Mon Sep 17 00:00:00 2001 From: Klaus Meinhardt Date: Wed, 8 Aug 2018 11:12:48 +0200 Subject: [PATCH] fix moduleNameResolver cache Fixes: #26271 --- src/compiler/moduleNameResolver.ts | 3 +- src/testRunner/unittests/moduleResolution.ts | 21 ++++++++++++++ ...lLinkDeclarationEmitModuleNames.errors.txt | 28 +++++++++++++++++++ ...symbolLinkDeclarationEmitModuleNames.types | 6 ++-- 4 files changed, 54 insertions(+), 4 deletions(-) create mode 100644 tests/baselines/reference/symbolLinkDeclarationEmitModuleNames.errors.txt diff --git a/src/compiler/moduleNameResolver.ts b/src/compiler/moduleNameResolver.ts index f93f2d7eb64..bfc3718490d 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 shorted 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 e97a3f5fc42..84975750ac8 100644 --- a/src/testRunner/unittests/moduleResolution.ts +++ b/src/testRunner/unittests/moduleResolution.ts @@ -321,6 +321,27 @@ namespace ts { checkResolvedModule(resolution.resolvedModule, createResolvedModule(resolvedFileName, /*isExternalLibraryImport*/ true)); }); } + + it("uses originalPath for caching", () => { + const host = createModuleResolutionHost( + /*hasDirectoryExists*/ true, + { + name: "/a.ts", + symlinks: ["/sub/node_modules/a/index.ts"], + }, + ); + const cache = createModuleResolutionCache("/", (f) => f); + let resolution = nodeModuleNameResolver("a", "/sub/foo.ts", {}, host, cache); + checkResolvedModule(resolution.resolvedModule, { + extension: Extension.Ts, + isExternalLibraryImport: true, + originalPath: "/sub/node_modules/a/index.ts", + packageId: undefined, + resolvedFileName: "/a.ts", + }); + resolution = nodeModuleNameResolver("a", "/foo.ts", {}, host, cache); + assert.isUndefined(resolution.resolvedModule, "lookup in parent directory doesn't hit the cache"); + }); }); describe("Module resolution - relative imports", () => { diff --git a/tests/baselines/reference/symbolLinkDeclarationEmitModuleNames.errors.txt b/tests/baselines/reference/symbolLinkDeclarationEmitModuleNames.errors.txt new file mode 100644 index 00000000000..42dfebba6cb --- /dev/null +++ b/tests/baselines/reference/symbolLinkDeclarationEmitModuleNames.errors.txt @@ -0,0 +1,28 @@ +tests/cases/compiler/monorepo/context/src/bindingkey.ts(1,29): error TS2307: Cannot find module '@loopback/context'. + + +==== tests/cases/compiler/monorepo/core/src/application.ts (0 errors) ==== + import { Constructor } from "@loopback/context"; + export type ControllerClass = Constructor; +==== tests/cases/compiler/monorepo/core/src/usage.ts (0 errors) ==== + import { ControllerClass } from './application'; + import { BindingKey } from '@loopback/context'; + + export const CONTROLLER_CLASS = BindingKey.create(null as any); // line in question +==== tests/cases/compiler/monorepo/context/src/value-promise.ts (0 errors) ==== + export type Constructor = (...args: any[]) => T; +==== tests/cases/compiler/monorepo/context/src/bindingkey.ts (1 errors) ==== + import { Constructor } from "@loopback/context" + ~~~~~~~~~~~~~~~~~~~ +!!! error TS2307: Cannot find module '@loopback/context'. + export class BindingKey { + readonly __type: T; + static create>(ctor: T) { + return new BindingKey(); + } + } + +==== tests/cases/compiler/monorepo/context/index.ts (0 errors) ==== + export * from "./src/value-promise"; + export * from "./src/bindingkey"; + \ No newline at end of file diff --git a/tests/baselines/reference/symbolLinkDeclarationEmitModuleNames.types b/tests/baselines/reference/symbolLinkDeclarationEmitModuleNames.types index 1101327b283..b6934a8d75f 100644 --- a/tests/baselines/reference/symbolLinkDeclarationEmitModuleNames.types +++ b/tests/baselines/reference/symbolLinkDeclarationEmitModuleNames.types @@ -15,9 +15,9 @@ import { BindingKey } from '@loopback/context'; export const CONTROLLER_CLASS = BindingKey.create(null as any); // line in question >CONTROLLER_CLASS : BindingKey> >BindingKey.create(null as any) : BindingKey> ->BindingKey.create : >(ctor: T) => BindingKey +>BindingKey.create : (ctor: T) => BindingKey >BindingKey : typeof BindingKey ->create : >(ctor: T) => BindingKey +>create : (ctor: T) => BindingKey >null as any : any >null : null @@ -37,7 +37,7 @@ export class BindingKey { >__type : T static create>(ctor: T) { ->create : >(ctor: T) => BindingKey +>create : (ctor: T) => BindingKey >ctor : T return new BindingKey();