microsoft / microsoft/TypeScript

Plugin probe path starts in incorrect location?

Offen
#62,618 2 Kommentare 0 Reaktionen 1 zugewiesene Person Auf GitHub ansehen

@sheetalkamat arbeitet bereits daran.

Seit 17.10.2025.

Needs Investigation
Vorherrschende Sprache
Go
Sterne
111k
Forks
14.3k
Ø Merge
2 T. 4 Std.
Gemergte PRs (30 T.)
132

Beschreibung

The code to determine the global plugin search path is I think incorrect?

It joins the executing file path which includes the typescript.js or tsserver.js filename, with the ../../.. string which results in a path like: X/node_modules/typescript/lib/tsserver.js/../../.. which means that the resultant path for this example is actually X/node_modules to which the resolve process appends a second node_modules folder resulting in looking for plugins in X/node_modules/node_modules so plugins never resolve.

    protected getGlobalPluginSearchPaths(): string[] {
        // Search any globally-specified probe paths, then our peer node_modules
        return [
            ...this.projectService.pluginProbeLocations,
            // ../../.. to walk from X/node_modules/typescript/lib/tsserver.js to X/node_modules/
            combinePaths(this.projectService.getExecutingFilePath(), "../../.."),
        ];
    }

https://github.com/microsoft/TypeScript/blob/main/src/server/project.ts#L2110

The actual resolve then happens here and the node_modules folder is appended:

    public static importServicePluginSync<T = {}>(
        pluginConfigEntry: PluginImport,
        searchPaths: string[],
        host: ServerHost,
        log: (message: string) => void,
    ): PluginImportResult<T> {
        Debug.assertIsDefined(host.require);
        let errorLogs: string[] | undefined;
        let resolvedModule: T | undefined;
        for (const initialDir of searchPaths) {
            const resolvedPath = normalizeSlashes(host.resolvePath(combinePaths(initialDir, "node_modules")));
            log(`Loading ${pluginConfigEntry.name} from ${initialDir} (resolved to ${resolvedPath})`);
            const result = host.require(resolvedPath, pluginConfigEntry.name); // TODO: GH#18217
            if (!result.error) {
                resolvedModule = result.module as T;
                break;
            }
            const err = result.error.stack || result.error.message || JSON.stringify(result.error);
            (errorLogs ??= []).push(`Failed to load module '${pluginConfigEntry.name}' from ${resolvedPath}: ${err}`);
        }
        return { pluginConfigEntry, resolvedModule, errorLogs };
    }

https://github.com/microsoft/TypeScript/blob/main/src/server/project.ts#L500

I believe this may be the root cause of a number of different issues raised here:
https://github.com/microsoft/TypeScript/issues/61584
https://github.com/microsoft/TypeScript/issues/44289

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Bewertung

Dieses Issue wurde noch nicht bewertet.

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.