Skip to content

Commit 2bb56da

Browse files
committed
Always respect preserveSymlinks
1 parent 3115572 commit 2bb56da

7 files changed

+62
-22
lines changed

src/compiler/moduleNameResolver.ts

Lines changed: 52 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,37 @@ function resolvedTypeScriptOnly(resolved: Resolved | undefined): PathAndPackageI
201201
return { fileName: resolved.path, packageId: resolved.packageId };
202202
}
203203

204+
function createResolvedModuleWithFailedLookupLocationsHandlingSymlink(
205+
moduleName: string,
206+
resolved: Resolved | undefined,
207+
isExternalLibraryImport: boolean | undefined,
208+
failedLookupLocations: string[],
209+
affectingLocations: string[],
210+
diagnostics: Diagnostic[],
211+
state: ModuleResolutionState,
212+
): ResolvedModuleWithFailedLookupLocations {
213+
// If this is from node_modules for non relative name, always respect preserveSymlinks
214+
if (!state.resultFromCache &&
215+
!state.compilerOptions.preserveSymlinks &&
216+
resolved &&
217+
isExternalLibraryImport &&
218+
!resolved.originalPath &&
219+
!isExternalModuleNameRelative(moduleName)
220+
) {
221+
const { resolvedFileName, originalPath } = getOriginalAndResolvedFileName(resolved.path, state.host, state.traceEnabled);
222+
if (originalPath) resolved = { ...resolved, path: resolvedFileName, originalPath };
223+
}
224+
return createResolvedModuleWithFailedLookupLocations(
225+
state.compilerOptions,
226+
resolved,
227+
isExternalLibraryImport,
228+
failedLookupLocations,
229+
affectingLocations,
230+
diagnostics,
231+
state.resultFromCache,
232+
);
233+
}
234+
204235
function createResolvedModuleWithFailedLookupLocations(
205236
compilerOptions: CompilerOptions,
206237
resolved: Resolved | undefined,
@@ -436,6 +467,16 @@ function arePathsEqual(path1: string, path2: string, host: ModuleResolutionHost)
436467
return comparePaths(path1, path2, !useCaseSensitiveFileNames) === Comparison.EqualTo;
437468
}
438469

470+
function getOriginalAndResolvedFileName(fileName: string, host: ModuleResolutionHost, traceEnabled: boolean) {
471+
const resolvedFileName = realPath(fileName, host, traceEnabled);
472+
const pathsAreEqual = arePathsEqual(fileName, resolvedFileName, host);
473+
return {
474+
// If the fileName and realpath are differing only in casing prefer fileName so that we can issue correct errors for casing under forceConsistentCasingInFileNames
475+
resolvedFileName: pathsAreEqual ? fileName : resolvedFileName,
476+
originalPath: pathsAreEqual ? undefined : fileName,
477+
};
478+
}
479+
439480
/**
440481
* @param {string | undefined} containingFile - file that contains type reference directive, can be undefined if containing file is unknown.
441482
* This is possible in case if resolution is performed for directives specified via 'types' parameter. In this case initial path for secondary lookups
@@ -526,13 +567,12 @@ export function resolveTypeReferenceDirective(typeReferenceDirectiveName: string
526567
let resolvedTypeReferenceDirective: ResolvedTypeReferenceDirective | undefined;
527568
if (resolved) {
528569
const { fileName, packageId } = resolved;
529-
const resolvedFileName = options.preserveSymlinks ? fileName : realPath(fileName, host, traceEnabled);
530-
const pathsAreEqual = arePathsEqual(fileName, resolvedFileName, host);
570+
let resolvedFileName = fileName, originalPath: string | undefined;
571+
if (!options.preserveSymlinks) ({ resolvedFileName, originalPath } = getOriginalAndResolvedFileName(fileName, host, traceEnabled));
531572
resolvedTypeReferenceDirective = {
532573
primary,
533-
// If the fileName and realpath are differing only in casing prefer fileName so that we can issue correct errors for casing under forceConsistentCasingInFileNames
534-
resolvedFileName: pathsAreEqual ? fileName : resolvedFileName,
535-
originalPath: pathsAreEqual ? undefined : fileName,
574+
resolvedFileName,
575+
originalPath,
536576
packageId,
537577
isExternalLibraryImport: pathContainsNodeModules(fileName),
538578
};
@@ -1792,14 +1832,14 @@ function nodeModuleNameResolverWorker(features: NodeResolutionFeatures, moduleNa
17921832
result = tryResolve(extensions);
17931833
}
17941834

1795-
return createResolvedModuleWithFailedLookupLocations(
1796-
compilerOptions,
1835+
return createResolvedModuleWithFailedLookupLocationsHandlingSymlink(
1836+
moduleName,
17971837
result?.value?.resolved,
17981838
result?.value?.isExternalLibraryImport,
17991839
failedLookupLocations,
18001840
affectingLocations,
18011841
diagnostics,
1802-
state.resultFromCache
1842+
state,
18031843
);
18041844

18051845
function tryResolve(extensions: Extensions): SearchResult<{ resolved: Resolved, isExternalLibraryImport: boolean }> {
@@ -1823,18 +1863,8 @@ function nodeModuleNameResolverWorker(features: NodeResolutionFeatures, moduleNa
18231863
}
18241864
resolved = loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, containingDirectory, state, cache, redirectedReference);
18251865
}
1826-
if (!resolved) return undefined;
1827-
1828-
let resolvedValue = resolved.value;
1829-
if (!compilerOptions.preserveSymlinks && resolvedValue && !resolvedValue.originalPath) {
1830-
const path = realPath(resolvedValue.path, host, traceEnabled);
1831-
const pathsAreEqual = arePathsEqual(path, resolvedValue.path, host);
1832-
const originalPath = pathsAreEqual ? undefined : resolvedValue.path;
1833-
// If the path and realpath are differing only in casing prefer path so that we can issue correct errors for casing under forceConsistentCasingInFileNames
1834-
resolvedValue = { ...resolvedValue, path: pathsAreEqual ? resolvedValue.path : path, originalPath };
1835-
}
18361866
// For node_modules lookups, get the real path so that multiple accesses to an `npm link`-ed module do not create duplicate files.
1837-
return { value: resolvedValue && { resolved: resolvedValue, isExternalLibraryImport: true } };
1867+
return resolved && { value: resolved.value && { resolved: resolved.value, isExternalLibraryImport: true } };
18381868
}
18391869
else {
18401870
const { path: candidate, parts } = normalizePathForCJSResolution(containingDirectory, moduleName);
@@ -3061,14 +3091,14 @@ export function classicNameResolver(moduleName: string, containingFile: string,
30613091
tryResolve(Extensions.TypeScript | Extensions.Declaration) ||
30623092
tryResolve(Extensions.JavaScript | (compilerOptions.resolveJsonModule ? Extensions.Json : 0));
30633093
// No originalPath because classic resolution doesn't resolve realPath
3064-
return createResolvedModuleWithFailedLookupLocations(
3065-
compilerOptions,
3094+
return createResolvedModuleWithFailedLookupLocationsHandlingSymlink(
3095+
moduleName,
30663096
resolved && resolved.value,
30673097
resolved?.value && pathContainsNodeModules(resolved.value.path),
30683098
failedLookupLocations,
30693099
affectingLocations,
30703100
diagnostics,
3071-
state.resultFromCache
3101+
state,
30723102
);
30733103

30743104
function tryResolve(extensions: Extensions): SearchResult<Resolved> {

tests/baselines/reference/moduleResolutionWithExtensions_withPaths.trace.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
"File '/node_modules/foo/lib/test.tsx' does not exist.",
1212
"File '/node_modules/foo/lib/test.d.ts' exist - use it as a name resolution result.",
1313
"File '/node_modules/foo/package.json' does not exist.",
14+
"Resolving real path for '/node_modules/foo/lib/test.d.ts', result '/node_modules/foo/lib/test.d.ts'.",
1415
"======== Module name 'foo/test.js' was successfully resolved to '/node_modules/foo/lib/test.d.ts'. ========",
1516
"======== Resolving module 'foo/test' from '/test.ts'. ========",
1617
"Explicitly specified module resolution kind: 'NodeJs'.",
@@ -23,6 +24,7 @@
2324
"File '/node_modules/foo/lib/test.tsx' does not exist.",
2425
"File '/node_modules/foo/lib/test.d.ts' exist - use it as a name resolution result.",
2526
"File '/node_modules/foo/package.json' does not exist according to earlier cached lookups.",
27+
"Resolving real path for '/node_modules/foo/lib/test.d.ts', result '/node_modules/foo/lib/test.d.ts'.",
2628
"======== Module name 'foo/test' was successfully resolved to '/node_modules/foo/lib/test.d.ts'. ========",
2729
"======== Resolving module './relative.js' from '/test.ts'. ========",
2830
"Explicitly specified module resolution kind: 'NodeJs'.",

tests/baselines/reference/moduleResolutionWithSuffixes_one_externalModule_withPaths.trace.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
"File '/node_modules/some-library/lib/index.ios.ts' does not exist.",
1414
"File '/node_modules/some-library/lib/index.ios.tsx' does not exist.",
1515
"File '/node_modules/some-library/lib/index.ios.d.ts' exist - use it as a name resolution result.",
16+
"Resolving real path for '/node_modules/some-library/lib/index.ios.d.ts', result '/node_modules/some-library/lib/index.ios.d.ts'.",
1617
"======== Module name 'some-library' was successfully resolved to '/node_modules/some-library/lib/index.ios.d.ts'. ========",
1718
"======== Resolving module 'some-library/index' from '/test.ts'. ========",
1819
"Explicitly specified module resolution kind: 'NodeJs'.",
@@ -25,6 +26,7 @@
2526
"File '/node_modules/some-library/lib/index.ios.tsx' does not exist.",
2627
"File '/node_modules/some-library/lib/index.ios.d.ts' exist - use it as a name resolution result.",
2728
"File '/node_modules/some-library/package.json' does not exist.",
29+
"Resolving real path for '/node_modules/some-library/lib/index.ios.d.ts', result '/node_modules/some-library/lib/index.ios.d.ts'.",
2830
"======== Module name 'some-library/index' was successfully resolved to '/node_modules/some-library/lib/index.ios.d.ts'. ========",
2931
"======== Resolving module 'some-library/index.js' from '/test.ts'. ========",
3032
"Explicitly specified module resolution kind: 'NodeJs'.",
@@ -38,5 +40,6 @@
3840
"File '/node_modules/some-library/lib/index.ios.tsx' does not exist.",
3941
"File '/node_modules/some-library/lib/index.ios.d.ts' exist - use it as a name resolution result.",
4042
"File '/node_modules/some-library/package.json' does not exist according to earlier cached lookups.",
43+
"Resolving real path for '/node_modules/some-library/lib/index.ios.d.ts', result '/node_modules/some-library/lib/index.ios.d.ts'.",
4144
"======== Module name 'some-library/index.js' was successfully resolved to '/node_modules/some-library/lib/index.ios.d.ts'. ========"
4245
]

tests/baselines/reference/pathMappingBasedModuleResolution_withExtension_MapedToNodeModules.trace.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,5 +35,6 @@
3535
"File name '/node_modules/foo/bar/foobar.js' has a '.js' extension - stripping it.",
3636
"File '/node_modules/foo/bar/foobar.js' exist - use it as a name resolution result.",
3737
"File '/node_modules/foo/package.json' does not exist according to earlier cached lookups.",
38+
"Resolving real path for '/node_modules/foo/bar/foobar.js', result '/node_modules/foo/bar/foobar.js'.",
3839
"======== Module name 'foo/bar/foobar.js' was successfully resolved to '/node_modules/foo/bar/foobar.js'. ========"
3940
]

tests/baselines/reference/requireOfJsonFile_PathMapping.trace.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,6 @@
2626
"File name '/node_modules/foo/bar/foobar.json' has a '.json' extension - stripping it.",
2727
"File '/node_modules/foo/bar/foobar.json' exist - use it as a name resolution result.",
2828
"File '/node_modules/foo/package.json' does not exist according to earlier cached lookups.",
29+
"Resolving real path for '/node_modules/foo/bar/foobar.json', result '/node_modules/foo/bar/foobar.json'.",
2930
"======== Module name 'foo/bar/foobar.json' was successfully resolved to '/node_modules/foo/bar/foobar.json'. ========"
3031
]

tests/baselines/reference/scopedPackagesClassic.trace.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@
55
"File '/node_modules/@types/see__saw/package.json' does not exist.",
66
"File '/node_modules/@types/see__saw.d.ts' does not exist.",
77
"File '/node_modules/@types/see__saw/index.d.ts' exist - use it as a name resolution result.",
8+
"Resolving real path for '/node_modules/@types/see__saw/index.d.ts', result '/node_modules/@types/see__saw/index.d.ts'.",
89
"======== Module name '@see/saw' was successfully resolved to '/node_modules/@types/see__saw/index.d.ts'. ========"
910
]

tests/baselines/reference/typingsLookupAmd.trace.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
"File '/x/node_modules/@types/b/package.json' does not exist.",
1515
"File '/x/node_modules/@types/b.d.ts' does not exist.",
1616
"File '/x/node_modules/@types/b/index.d.ts' exist - use it as a name resolution result.",
17+
"Resolving real path for '/x/node_modules/@types/b/index.d.ts', result '/x/node_modules/@types/b/index.d.ts'.",
1718
"======== Module name 'b' was successfully resolved to '/x/node_modules/@types/b/index.d.ts'. ========",
1819
"======== Resolving module 'a' from '/x/node_modules/@types/b/index.d.ts'. ========",
1920
"Module resolution kind is not specified, using 'Classic'.",
@@ -38,6 +39,7 @@
3839
"File '/node_modules/@types/a/package.json' does not exist.",
3940
"File '/node_modules/@types/a.d.ts' does not exist.",
4041
"File '/node_modules/@types/a/index.d.ts' exist - use it as a name resolution result.",
42+
"Resolving real path for '/node_modules/@types/a/index.d.ts', result '/node_modules/@types/a/index.d.ts'.",
4143
"======== Module name 'a' was successfully resolved to '/node_modules/@types/a/index.d.ts'. ========",
4244
"======== Resolving type reference directive 'a', containing file '/__inferred type names__.ts', root directory '/node_modules/@types'. ========",
4345
"Resolving with primary search path '/node_modules/@types'.",

0 commit comments

Comments
 (0)