Skip to content

Commit 1aed7dc

Browse files
committed
Fix issue with symlink not using trailing directory separator
Fixes #55135
1 parent 76395fe commit 1aed7dc

File tree

3 files changed

+244
-6
lines changed

3 files changed

+244
-6
lines changed

src/compiler/utilities.ts

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8802,9 +8802,15 @@ export function hasZeroOrOneAsteriskCharacter(str: string): boolean {
88028802

88038803
/** @internal */
88048804
export interface SymlinkedDirectory {
8805-
/** Matches the casing returned by `realpath`. Used to compute the `realpath` of children. */
8805+
/**
8806+
* Matches the casing returned by `realpath`. Used to compute the `realpath` of children.
8807+
* Always has trailing directory separator
8808+
*/
88068809
real: string;
8807-
/** toPath(real). Stored to avoid repeated recomputation. */
8810+
/**
8811+
* toPath(real). Stored to avoid repeated recomputation.
8812+
* Always has trailing directory separator
8813+
*/
88088814
realPath: Path;
88098815
}
88108816

@@ -8859,7 +8865,7 @@ export function createSymlinkCache(cwd: string, getCanonicalFileName: GetCanonic
88598865
if (!containsIgnoredPath(symlinkPath)) {
88608866
symlinkPath = ensureTrailingDirectorySeparator(symlinkPath);
88618867
if (real !== false && !symlinkedDirectories?.has(symlinkPath)) {
8862-
(symlinkedDirectoriesByRealpath ||= createMultiMap()).add(ensureTrailingDirectorySeparator(real.realPath), symlink);
8868+
(symlinkedDirectoriesByRealpath ||= createMultiMap()).add(real.realPath, symlink);
88638869
}
88648870
(symlinkedDirectories || (symlinkedDirectories = new Map())).set(symlinkPath, real);
88658871
}
@@ -8882,7 +8888,10 @@ export function createSymlinkCache(cwd: string, getCanonicalFileName: GetCanonic
88828888
if (commonResolved && commonOriginal) {
88838889
cache.setSymlinkedDirectory(
88848890
commonOriginal,
8885-
{ real: commonResolved, realPath: toPath(commonResolved, cwd, getCanonicalFileName) },
8891+
{
8892+
real: ensureTrailingDirectorySeparator(commonResolved),
8893+
realPath: ensureTrailingDirectorySeparator(toPath(commonResolved, cwd, getCanonicalFileName)),
8894+
},
88868895
);
88878896
}
88888897
}

src/server/project.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import {
3030
DirectoryWatcherCallback,
3131
DocumentPositionMapper,
3232
DocumentRegistry,
33+
ensureTrailingDirectorySeparator,
3334
enumerateInsertsAndDeletes,
3435
every,
3536
explainFiles,
@@ -2520,8 +2521,8 @@ export class AutoImportProviderProject extends Project {
25202521
const isSymlink = realPath && realPath !== hostProject.toPath(packageJson.packageDirectory);
25212522
if (isSymlink) {
25222523
symlinkCache.setSymlinkedDirectory(packageJson.packageDirectory, {
2523-
real: real!,
2524-
realPath,
2524+
real: ensureTrailingDirectorySeparator(real!),
2525+
realPath: ensureTrailingDirectorySeparator(realPath),
25252526
});
25262527
}
25272528

tests/baselines/reference/tsserver/moduleResolution/using-referenced-project.js

Lines changed: 228 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -716,3 +716,231 @@ Info seq [hh:mm:ss:mss] event:
716716
}
717717
}
718718
After running Immedidate callback:: count: 0
719+
720+
Before request
721+
722+
Info seq [hh:mm:ss:mss] request:
723+
{
724+
"command": "updateOpen",
725+
"arguments": {
726+
"changedFiles": [
727+
{
728+
"fileName": "/home/src/projects/project/packages/package-b/src/index.ts",
729+
"textChanges": [
730+
{
731+
"start": {
732+
"line": 1,
733+
"offset": 31
734+
},
735+
"end": {
736+
"line": 1,
737+
"offset": 32
738+
},
739+
"newText": ""
740+
}
741+
]
742+
}
743+
]
744+
},
745+
"seq": 5,
746+
"type": "request"
747+
}
748+
Info seq [hh:mm:ss:mss] response:
749+
{
750+
"response": true,
751+
"responseRequired": true
752+
}
753+
After request
754+
755+
Before request
756+
757+
Info seq [hh:mm:ss:mss] request:
758+
{
759+
"command": "geterr",
760+
"arguments": {
761+
"delay": 0,
762+
"files": [
763+
"/home/src/projects/project/packages/package-b/src/index.ts"
764+
]
765+
},
766+
"seq": 6,
767+
"type": "request"
768+
}
769+
Info seq [hh:mm:ss:mss] response:
770+
{
771+
"responseRequired": false
772+
}
773+
After request
774+
775+
Before running Timeout callback:: count: 1
776+
3: checkOne
777+
778+
Info seq [hh:mm:ss:mss] Starting updateGraphWorker: Project: /home/src/projects/project/packages/package-b/tsconfig.json
779+
Info seq [hh:mm:ss:mss] ======== Resolving module 'package-a' from '/home/src/projects/project/packages/package-b/src/index.ts'. ========
780+
Info seq [hh:mm:ss:mss] Explicitly specified module resolution kind: 'Bundler'.
781+
Info seq [hh:mm:ss:mss] Resolving in CJS mode with conditions 'import', 'types'.
782+
Info seq [hh:mm:ss:mss] 'baseUrl' option is set to '/home/src/projects/project/packages/package-b', using this value to resolve non-relative module name 'package-a'.
783+
Info seq [hh:mm:ss:mss] Resolving module name 'package-a' relative to base url '/home/src/projects/project/packages/package-b' - '/home/src/projects/project/packages/package-b/package-a'.
784+
Info seq [hh:mm:ss:mss] Loading module as file / folder, candidate module location '/home/src/projects/project/packages/package-b/package-a', target file types: TypeScript, JavaScript, Declaration, JSON.
785+
Info seq [hh:mm:ss:mss] File '/home/src/projects/project/packages/package-b/package-a.ts' does not exist.
786+
Info seq [hh:mm:ss:mss] File '/home/src/projects/project/packages/package-b/package-a.tsx' does not exist.
787+
Info seq [hh:mm:ss:mss] File '/home/src/projects/project/packages/package-b/package-a.d.ts' does not exist.
788+
Info seq [hh:mm:ss:mss] File '/home/src/projects/project/packages/package-b/package-a.js' does not exist.
789+
Info seq [hh:mm:ss:mss] File '/home/src/projects/project/packages/package-b/package-a.jsx' does not exist.
790+
Info seq [hh:mm:ss:mss] Directory '/home/src/projects/project/packages/package-b/package-a' does not exist, skipping all lookups in it.
791+
Info seq [hh:mm:ss:mss] File '/home/src/projects/project/packages/package-b/src/package.json' does not exist according to earlier cached lookups.
792+
Info seq [hh:mm:ss:mss] File '/home/src/projects/project/packages/package-b/package.json' exists according to earlier cached lookups.
793+
Info seq [hh:mm:ss:mss] Loading module 'package-a' from 'node_modules' folder, target file types: TypeScript, JavaScript, Declaration, JSON.
794+
Info seq [hh:mm:ss:mss] Searching all ancestor node_modules directories for preferred extensions: TypeScript, Declaration.
795+
Info seq [hh:mm:ss:mss] Directory '/home/src/projects/project/packages/package-b/src/node_modules' does not exist, skipping all lookups in it.
796+
Info seq [hh:mm:ss:mss] Directory '/home/src/projects/project/packages/package-b/node_modules' does not exist, skipping all lookups in it.
797+
Info seq [hh:mm:ss:mss] Directory '/home/src/projects/project/packages/node_modules' does not exist, skipping all lookups in it.
798+
Info seq [hh:mm:ss:mss] File '/home/src/projects/project/node_modules/package-a/package.json' exists according to earlier cached lookups.
799+
Info seq [hh:mm:ss:mss] Using 'exports' subpath '.' with target './build/index.js'.
800+
Info seq [hh:mm:ss:mss] File name '/home/src/projects/project/node_modules/package-a/build/index.js' has a '.js' extension - stripping it.
801+
Info seq [hh:mm:ss:mss] File '/home/src/projects/project/node_modules/package-a/build/index.ts' does not exist.
802+
Info seq [hh:mm:ss:mss] File '/home/src/projects/project/node_modules/package-a/build/index.tsx' does not exist.
803+
Info seq [hh:mm:ss:mss] File '/home/src/projects/project/node_modules/package-a/build/index.d.ts' exists - use it as a name resolution result.
804+
Info seq [hh:mm:ss:mss] Resolving real path for '/home/src/projects/project/node_modules/package-a/build/index.d.ts', result '/home/src/projects/project/packages/package-a/build/index.d.ts'.
805+
Info seq [hh:mm:ss:mss] ======== Module name 'package-a' was successfully resolved to '/home/src/projects/project/packages/package-a/build/index.d.ts' with Package ID 'package-a/build/[email protected]'. ========
806+
Info seq [hh:mm:ss:mss] ======== Resolving module './subfolder' from '/home/src/projects/project/packages/package-a/src/index.ts'. ========
807+
Info seq [hh:mm:ss:mss] Using compiler options of project reference redirect '/home/src/projects/project/packages/package-a/tsconfig.json'.
808+
Info seq [hh:mm:ss:mss] Explicitly specified module resolution kind: 'Bundler'.
809+
Info seq [hh:mm:ss:mss] Resolving in CJS mode with conditions 'import', 'types'.
810+
Info seq [hh:mm:ss:mss] Loading module as file / folder, candidate module location '/home/src/projects/project/packages/package-a/src/subfolder', target file types: TypeScript, JavaScript, Declaration, JSON.
811+
Info seq [hh:mm:ss:mss] File '/home/src/projects/project/packages/package-a/src/subfolder.ts' does not exist.
812+
Info seq [hh:mm:ss:mss] File '/home/src/projects/project/packages/package-a/src/subfolder.tsx' does not exist.
813+
Info seq [hh:mm:ss:mss] File '/home/src/projects/project/packages/package-a/src/subfolder.d.ts' does not exist.
814+
Info seq [hh:mm:ss:mss] File '/home/src/projects/project/packages/package-a/src/subfolder.js' does not exist.
815+
Info seq [hh:mm:ss:mss] File '/home/src/projects/project/packages/package-a/src/subfolder.jsx' does not exist.
816+
Info seq [hh:mm:ss:mss] File '/home/src/projects/project/packages/package-a/src/subfolder/package.json' does not exist according to earlier cached lookups.
817+
Info seq [hh:mm:ss:mss] File '/home/src/projects/project/packages/package-a/src/subfolder/index.ts' exists - use it as a name resolution result.
818+
Info seq [hh:mm:ss:mss] ======== Module name './subfolder' was successfully resolved to '/home/src/projects/project/packages/package-a/src/subfolder/index.ts'. ========
819+
Info seq [hh:mm:ss:mss] DirectoryWatcher:: Added:: WatchInfo: /home/src/projects/project/packages/package-a 1 undefined Project: /home/src/projects/project/packages/package-b/tsconfig.json WatchType: Failed Lookup Locations
820+
Info seq [hh:mm:ss:mss] Elapsed:: *ms DirectoryWatcher:: Added:: WatchInfo: /home/src/projects/project/packages/package-a 1 undefined Project: /home/src/projects/project/packages/package-b/tsconfig.json WatchType: Failed Lookup Locations
821+
Info seq [hh:mm:ss:mss] Reusing resolution of module '@typescript/lib-es2021' from '/home/src/projects/project/packages/package-b/__lib_node_modules_lookup_lib.es2021.d.ts__.ts' of old program, it was not resolved.
822+
Info seq [hh:mm:ss:mss] DirectoryWatcher:: Added:: WatchInfo: /home/src/projects/project/packages/package-b/package-a 1 undefined Project: /home/src/projects/project/packages/package-b/tsconfig.json WatchType: Failed Lookup Locations
823+
Info seq [hh:mm:ss:mss] Elapsed:: *ms DirectoryWatcher:: Added:: WatchInfo: /home/src/projects/project/packages/package-b/package-a 1 undefined Project: /home/src/projects/project/packages/package-b/tsconfig.json WatchType: Failed Lookup Locations
824+
Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /home/src/projects/project/packages/package-a/package.json 2000 undefined Project: /home/src/projects/project/packages/package-b/tsconfig.json WatchType: File location affecting resolution
825+
Info seq [hh:mm:ss:mss] DirectoryWatcher:: Close:: WatchInfo: /home/src/projects/project/packages/package-b/package-aX 1 undefined Project: /home/src/projects/project/packages/package-b/tsconfig.json WatchType: Failed Lookup Locations
826+
Info seq [hh:mm:ss:mss] Elapsed:: *ms DirectoryWatcher:: Close:: WatchInfo: /home/src/projects/project/packages/package-b/package-aX 1 undefined Project: /home/src/projects/project/packages/package-b/tsconfig.json WatchType: Failed Lookup Locations
827+
Info seq [hh:mm:ss:mss] Finishing updateGraphWorker: Project: /home/src/projects/project/packages/package-b/tsconfig.json Version: 3 structureChanged: true structureIsReused:: SafeModules Elapsed:: *ms
828+
Info seq [hh:mm:ss:mss] Project '/home/src/projects/project/packages/package-b/tsconfig.json' (Configured)
829+
Info seq [hh:mm:ss:mss] Files (4)
830+
/a/lib/lib.es2021.d.ts Text-1 "/// <reference no-default-lib=\"true\"/>\ninterface Boolean {}\ninterface Function {}\ninterface CallableFunction {}\ninterface NewableFunction {}\ninterface IArguments {}\ninterface Number { toExponential: any; }\ninterface Object {}\ninterface RegExp {}\ninterface String { charAt: any; }\ninterface Array<T> { length: number; [n: number]: T; }\ninterface ReadonlyArray<T> {}\ndeclare const console: { log(msg: any): void; };"
831+
/home/src/projects/project/packages/package-a/src/subfolder/index.ts Text-1 "export const FOO = \"bar\";"
832+
/home/src/projects/project/packages/package-a/src/index.ts Text-1 "export * from \"./subfolder\";"
833+
/home/src/projects/project/packages/package-b/src/index.ts SVC-1-2 "import { FOO } from \"package-a\";\nconsole.log(FOO);\n"
834+
835+
836+
../../../../../../a/lib/lib.es2021.d.ts
837+
Library 'lib.es2021.d.ts' specified in compilerOptions
838+
../package-a/src/subfolder/index.ts
839+
Imported via "./subfolder" from file '../package-a/src/index.ts'
840+
../package-a/src/index.ts
841+
Imported via "package-a" from file 'src/index.ts' with packageId 'package-a/build/index.d.ts@1.0.0'
842+
src/index.ts
843+
Matched by include pattern './src/**/*.ts' in 'tsconfig.json'
844+
845+
Info seq [hh:mm:ss:mss] -----------------------------------------------
846+
Info seq [hh:mm:ss:mss] event:
847+
{
848+
"seq": 0,
849+
"type": "event",
850+
"event": "syntaxDiag",
851+
"body": {
852+
"file": "/home/src/projects/project/packages/package-b/src/index.ts",
853+
"diagnostics": []
854+
}
855+
}
856+
After running Timeout callback:: count: 0
857+
858+
PolledWatches::
859+
/home/src/projects/node_modules:
860+
{"pollingInterval":500}
861+
/home/src/projects/node_modules/@types:
862+
{"pollingInterval":500}
863+
/home/src/projects/project/node_modules/@types:
864+
{"pollingInterval":500}
865+
/home/src/projects/project/packages/node_modules:
866+
{"pollingInterval":500}
867+
/home/src/projects/project/packages/node_modules/@types:
868+
{"pollingInterval":500}
869+
/home/src/projects/project/packages/package-b/node_modules:
870+
{"pollingInterval":500}
871+
/home/src/projects/project/packages/package-b/node_modules/@types:
872+
{"pollingInterval":500}
873+
/home/src/projects/project/packages/package-b/package-a: *new*
874+
{"pollingInterval":500}
875+
876+
PolledWatches *deleted*::
877+
/home/src/projects/project/packages/package-b/package-ax:
878+
{"pollingInterval":500}
879+
880+
FsWatches::
881+
/a/lib/lib.es2021.d.ts:
882+
{}
883+
/home/src/projects/project/packages/package-a/package.json: *new*
884+
{}
885+
/home/src/projects/project/packages/package-a/src/index.ts:
886+
{}
887+
/home/src/projects/project/packages/package-a/src/subfolder/index.ts:
888+
{}
889+
/home/src/projects/project/packages/package-a/tsconfig.json:
890+
{}
891+
/home/src/projects/project/packages/package-b:
892+
{}
893+
/home/src/projects/project/packages/package-b/package.json:
894+
{}
895+
/home/src/projects/project/packages/package-b/tsconfig.json:
896+
{}
897+
898+
FsWatchesRecursive::
899+
/home/src/projects/project/node_modules:
900+
{}
901+
/home/src/projects/project/packages/package-a: *new*
902+
{}
903+
/home/src/projects/project/packages/package-a/src:
904+
{}
905+
/home/src/projects/project/packages/package-b/src:
906+
{}
907+
908+
Before running Immedidate callback:: count: 1
909+
5: semanticCheck
910+
911+
Info seq [hh:mm:ss:mss] event:
912+
{
913+
"seq": 0,
914+
"type": "event",
915+
"event": "semanticDiag",
916+
"body": {
917+
"file": "/home/src/projects/project/packages/package-b/src/index.ts",
918+
"diagnostics": []
919+
}
920+
}
921+
After running Immedidate callback:: count: 1
922+
6: suggestionCheck
923+
924+
Before running Immedidate callback:: count: 1
925+
6: suggestionCheck
926+
927+
Info seq [hh:mm:ss:mss] event:
928+
{
929+
"seq": 0,
930+
"type": "event",
931+
"event": "suggestionDiag",
932+
"body": {
933+
"file": "/home/src/projects/project/packages/package-b/src/index.ts",
934+
"diagnostics": []
935+
}
936+
}
937+
Info seq [hh:mm:ss:mss] event:
938+
{
939+
"seq": 0,
940+
"type": "event",
941+
"event": "requestCompleted",
942+
"body": {
943+
"request_seq": 6
944+
}
945+
}
946+
After running Immedidate callback:: count: 0

0 commit comments

Comments
 (0)