Skip to content

Commit bed93b4

Browse files
committed
fix moduleNameResolver cache
Fixes: #26271
1 parent 937afab commit bed93b4

File tree

4 files changed

+54
-4
lines changed

4 files changed

+54
-4
lines changed

src/compiler/moduleNameResolver.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -401,7 +401,8 @@ namespace ts {
401401
}
402402
directoryPathMap.set(path, result);
403403

404-
const resolvedFileName = result.resolvedModule && result.resolvedModule.resolvedFileName;
404+
const resolvedFileName = result.resolvedModule &&
405+
(result.resolvedModule.originalPath || result.resolvedModule.resolvedFileName);
405406
// find common prefix between directory and resolved file name
406407
// this common prefix should be the shorted path that has the same resolution
407408
// directory: /a/b/c/d/e

src/testRunner/unittests/moduleResolution.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,27 @@ namespace ts {
321321
checkResolvedModule(resolution.resolvedModule, createResolvedModule(resolvedFileName, /*isExternalLibraryImport*/ true));
322322
});
323323
}
324+
325+
it("uses originalPath for caching", () => {
326+
const host = createModuleResolutionHost(
327+
/*hasDirectoryExists*/ true,
328+
{
329+
name: "/a.ts",
330+
symlinks: ["/sub/node_modules/a/index.ts"],
331+
},
332+
);
333+
const cache = createModuleResolutionCache("/", (f) => f);
334+
let resolution = nodeModuleNameResolver("a", "/sub/foo.ts", {}, host, cache);
335+
checkResolvedModule(resolution.resolvedModule, {
336+
extension: Extension.Ts,
337+
isExternalLibraryImport: true,
338+
originalPath: "/sub/node_modules/a/index.ts",
339+
packageId: undefined,
340+
resolvedFileName: "/a.ts",
341+
});
342+
resolution = nodeModuleNameResolver("a", "/foo.ts", {}, host, cache);
343+
assert.isUndefined(resolution.resolvedModule, "lookup in parent directory doesn't hit the cache");
344+
});
324345
});
325346

326347
describe("Module resolution - relative imports", () => {
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
tests/cases/compiler/monorepo/context/src/bindingkey.ts(1,29): error TS2307: Cannot find module '@loopback/context'.
2+
3+
4+
==== tests/cases/compiler/monorepo/core/src/application.ts (0 errors) ====
5+
import { Constructor } from "@loopback/context";
6+
export type ControllerClass = Constructor<any>;
7+
==== tests/cases/compiler/monorepo/core/src/usage.ts (0 errors) ====
8+
import { ControllerClass } from './application';
9+
import { BindingKey } from '@loopback/context';
10+
11+
export const CONTROLLER_CLASS = BindingKey.create<ControllerClass>(null as any); // line in question
12+
==== tests/cases/compiler/monorepo/context/src/value-promise.ts (0 errors) ====
13+
export type Constructor<T> = (...args: any[]) => T;
14+
==== tests/cases/compiler/monorepo/context/src/bindingkey.ts (1 errors) ====
15+
import { Constructor } from "@loopback/context"
16+
~~~~~~~~~~~~~~~~~~~
17+
!!! error TS2307: Cannot find module '@loopback/context'.
18+
export class BindingKey<T> {
19+
readonly __type: T;
20+
static create<T extends Constructor<any>>(ctor: T) {
21+
return new BindingKey<T>();
22+
}
23+
}
24+
25+
==== tests/cases/compiler/monorepo/context/index.ts (0 errors) ====
26+
export * from "./src/value-promise";
27+
export * from "./src/bindingkey";
28+

tests/baselines/reference/symbolLinkDeclarationEmitModuleNames.types

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@ import { BindingKey } from '@loopback/context';
1515
export const CONTROLLER_CLASS = BindingKey.create<ControllerClass>(null as any); // line in question
1616
>CONTROLLER_CLASS : BindingKey<import("tests/cases/compiler/monorepo/context/src/value-promise").Constructor<any>>
1717
>BindingKey.create<ControllerClass>(null as any) : BindingKey<import("tests/cases/compiler/monorepo/context/src/value-promise").Constructor<any>>
18-
>BindingKey.create : <T extends import("tests/cases/compiler/monorepo/context/src/value-promise").Constructor<any>>(ctor: T) => BindingKey<T>
18+
>BindingKey.create : <T extends any>(ctor: T) => BindingKey<T>
1919
>BindingKey : typeof BindingKey
20-
>create : <T extends import("tests/cases/compiler/monorepo/context/src/value-promise").Constructor<any>>(ctor: T) => BindingKey<T>
20+
>create : <T extends any>(ctor: T) => BindingKey<T>
2121
>null as any : any
2222
>null : null
2323

@@ -37,7 +37,7 @@ export class BindingKey<T> {
3737
>__type : T
3838

3939
static create<T extends Constructor<any>>(ctor: T) {
40-
>create : <T extends Constructor<any>>(ctor: T) => BindingKey<T>
40+
>create : <T extends any>(ctor: T) => BindingKey<T>
4141
>ctor : T
4242

4343
return new BindingKey<T>();

0 commit comments

Comments
 (0)